无源码
1、准备第三方apk,以GpsTest.apk
为例
2、在/vendor/qcom/
目录下创建目录thirdapps
,并将GpsTest.apk
拷贝到该目录下,同时创建Android.bp
和preinstall.mk
文件
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
添加齐全即可