Android13预置第三方应用

2,325 阅读5分钟

无源码

1、准备第三方apk,以GpsTest.apk为例

2、在/vendor/qcom/目录下创建目录thirdapps,并将GpsTest.apk拷贝到该目录下,同时创建Android.bppreinstall.mk文件

创建目录.png

Android.bp的内容为

android_app_import {
    name: "GpsTest",
    apk: "GpsTest.apk",
    // 保留apk自己的签名
    presigned: true,
    // 打开将放到对应分区目录的priv-app文件夹下
    // privileged: true,  
    // 打开将放到system_ext分区
    // system_ext_specific: true, 
    // 打开将放到product分区
    // product_specific: true, 
    // 打开将放到vendor分区
    // proprietary: true,
    // odm分区
    // device_specific: true
    // apk优化,内置三方apk时建议关闭
    dex_preopt: {
        enabled: false,
    },
}

preinstall.mk的内容为

PRODUCT_PACKAGES += GpsTest

然后将GpsTest加入到编译模块,在device/qcom/qssi/base.mk中添加

# include preinstall apps
-include vendor/qcom/thirdapps/preinstall.mk

最后编译刷机验证

有源码

1、将源代码拷贝到/vendor/qcom/thirdapps/目录下,并在源代码中添加Android.bp文件

android_app {
    name: "TestApp1",
    libs: ["telephony-common"],
    static_libs: [
        "com.google.android.material_material",
        "androidx.legacy_legacy-support-core-utils",
    ], 
    srcs: ["**/*.java"],
    platform_apis: true,
    sdk_version: "",
    certificate: "platform",
}

2、将app添加到编译模块,在device/qcom/qssi/base.mk中添加

PRODUCT_PACKAGES += TestApp1

应用预置目录介绍

常见的应用预置分区包括 system、system_ext、product、vendor、odm、data 等。不同的分区下安装路径

所对应的权限和域不相同,如 system,system_ext 属于 system 域,data 主要用于在线安装第三方的应

用,除 data 外其余分区都属于 vendor 域

目录说明备注
system/app系统核心应用目录,预置到该目录的应用不可卸载,设备恢复出厂设置后仍然存在。建议将需要申请系统权限,且重要的应用,预置到该目录。
system/priv-app同上。普通应用不推荐预置进该目录。该目录下的应用权限比 system/app 高。
system/preloadapp第三方应用预置目录,预置到该目录的应用可卸载,设备卸载后恢复出厂。preloadapp 中预置的应用在开机过程中同步多线程扫描安装,可加快开机速度。
system/vital-app设置时可恢复。预置在该目录和 system/preloadapp 目录下的效果一致。
{PARTITION}/app系统应用目录,预置到该目录的应用不可卸载,设备恢复出厂设置后仍然存在。相较于 system 分区,CTS 会检查预置进vendor、product 分区中的应用 API 是否合规。
{PARTITION}/priv-app同上。相较于{PARTITION}/app 目录,此目录中的应用不签署 platform 签名也可获得供应商特殊权限。
data/app第三方应用预置目录,预置到该目录的应用可卸载,设备恢复出厂设置不能恢复。

上表中定义宏 PARTITION 为 system_ext、product、vendor、odm 中的任意一个分区

android_app_import属性说明

  • presigned

    是否保留apk自己的签名,如果为true,则签名不变

  • certificate

    签名方式,取值有:

    • platform:平台的核心应用签名,使用该签名的 apk 需要获取 platform signature,例如 Settings,该值使用较多

    • PERSIGNED:源 apk 自带的签名,编译过程不再重新签名

    • testkey:非 user 版本默认签名

    • releasekey:user 版本默认签名

    • shared:使用该签名方式的 apk 需要和 home/contacts 进程共享数据,例如 Launcher

    • media:使用该签名方式的 apk 是 media/download 系统中的一环,例如 Gallery

    通常与presigned配合使用,设置后可使用AOSP自带的keytool可查看apk签名

    keytool -printcert -jarfile GpsTest.apk 
    
    Signer #1:
    
    Signature:
    
    Owner: EMAILADDRESS=android@android.com, CN=Android, OU=Android, O=Android, L=Mountain View, ST=California, C=US
    Issuer: EMAILADDRESS=android@android.com, CN=Android, OU=Android, O=Android, L=Mountain View, ST=California, C=US
    Serial number: b3998086d056cffa
    Valid from: Wed Apr 16 06:40:50 CST 2008 until: Sun Sep 02 06:40:50 CST 2035
    Certificate fingerprints:
         SHA1: 27:19:6E:38:6B:87:5E:76:AD:F7:00:E7:EA:84:E4:C6:EE:E3:3D:FA
         SHA256: C8:A2:E9:BC:CF:59:7C:2F:B6:DC:66:BE:E2:93:FC:13:F2:FC:47:EC:77:BC:6B:2B:0D:52:C1:1F:51:19:2A:B8
    Signature algorithm name: MD5withRSA (disabled)
    Subject Public Key Algorithm: 2048-bit RSA key
    Version: 3
    
  • privileged

    是否将apk放置到分区对应的priv-app文件夹下

  • system_ext_specific

    是否将apk放到system_ext分区

  • product_specific

    是否将apk放到product分区

  • proprietary

    是否将apk放到vendor分区

  • device_specific

    是否将apk放到odm分区

  • dex_preopt

    apk dex优化,内置三方apk时建议关闭

  • overrides

    覆盖默认应用,该值为一个数组,表示该apk将替换指定的apk应用,例如:overrides: ["Home", "Launcher2"]

  • required

    需要的依赖的本地库,例如:

    required: [
            "libDehaze",
            "libfbextraction",
            "libimageblend",
        ]
    
  • optional_uses_libs

    apk在运行时非必须依赖的库,例如:

    optional_uses_libs: ["org.apache.http.legacy"]
    
  • platform_apis

    当 platform_apis 为 true 时,sdk_version 必须为空。这种情况下我们的 app 会使用平台 API 进行编译而不是 SDK,这样我们的 App 就能访问到非 SDK API 了

  • used_libs

    apk在运行时必须依赖的库,例如:

    uses_libs: ["org.apache.http.legacy"]
    

权限处理

将应用预置到/system/priv-app目录时,需要配置相应权限,否则会无法开机

// privapp-permissions.xml 文件只有在与特权应用位于同一分区时才能授予或拒绝授予该应用权限。
// 例如,如果 /vendor 分区上的应用请求特许权限,则只能由同样位于 /vendor 上的 privapp-permissions.xml
// 文件来同意或拒绝该请求。
// frameworks/base/data/etc/privapp-permissions-platform.xml
// 加入需要授权的权限
<privapp-permissions package="com.chartcross.gpstest">
    <permission name="android.permission.READ_LOGS"/>
    <permission name="android.permission.CLEAR_APP_CACHE"/>
    <permission name="android.permission.PACKAGE_USAGE_STATS"/>
</privapp-permissions>

如果权限配置不全,运行时在log中予以提示

01-14 20:17:26.794  1676  1676 W PackageManager: Privileged permission android.permission.READ_LOGS for package com.chartcross.gpstes (/system/priv-app/GpsTest) not in privapp-permissions allowlist
01-14 20:17:26.794  1676  1676 W PackageManager: Privileged permission android.permission.CLEAR_APP_CACHE for package com.chartcross.gpstes (/system/priv-app/GpsTest) not in privapp-permissions allowlist
01-14 20:17:26.794  1676  1676 W PackageManager: Privileged permission android.permission.PACKAGE_USAGE_STATS for package com.chartcross.gpstes (/system/priv-app/GpsTest) not in privapp-permissions allowlist

根据提示,在 frameworks/base/data/etc/privapp-permissions-platform.xml添加齐全即可