点赞收藏加关注,下次找我不迷路。
也欢迎关注微信公众号 ZZH的Android(AndroidSystemTech)
期待与你的相识!
环境
Pixel 5 ,Android 13
不可卸载非系统应用
以搜狗输入法为例(官网下载的apk)
建立如下目录
ruby
// redfin为Pixel5的代号名称
mdkir -p vendor/redfin/thrird_apps/
将搜狗输入法apk放到该目录下,在该目录下编写Android.bp文件如下
arduino
android_app_import {
name: "SogouInput",
apk: "SogouInput.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,
},
}
针对上面注释掉的属性,我们分别进行打开编译,看下输出结果
sql
out/target/product/redfin/system/app/SogouInput/SogouInput.apk
out/target/product/redfin/system/priv-app/SogouInput/SogouInput.apk
out/target/product/redfin/system_ext/priv-app/SogouInput/SogouInput.apk
out/target/product/redfin/product/priv-app/SogouInput/SogouInput.apk
out/target/product/redfin/vendor/priv-app/SogouInput/SogouInput.apk
out/target/product/redfin/vendor/odm/priv-app/SogouInput/SogouInput.apk
关于分区可以看如下介绍
ini
https://source.android.google.cn/docs/core/architecture/partitions?hl=zh-cn
最后需要将SogouInput加入编译模块
ruby
// vendor/redfin/thrird_apps/preinstall_apps.mk
PRODUCT_PACKAGES += SogouInput
// device/google/redfin/device-redfin.mk
-include vendor/redfin/thrird_apps/preinstall_apps.mk
最后整编刷机验证
go
make -j8
adb reboot bootloader
fastboot flashall -w
不可卸载系统应用
加入系统签名,仍以搜狗输入法为例。
先看下apk的签名,里面有Sohu字样信息
css
zzh@ubuntu:~/work/android/aosp/android-13.0.0_r40/vendor/redfin/thrird_apps$ keytool -printcert -jarfile SogouInput.apk
Signer #1:
Signature:
Owner: CN=Sohu Wireless, OU=Sohu, O=Wireless, L=Beijing, ST=Beijing, C=CN
Issuer: CN=Sohu Wireless, OU=Sohu, O=Wireless, L=Beijing, ST=Beijing, C=CN
Serial number: 4aa5cf4d
Valid from: Tue Sep 08 11:28:13 CST 2009 until: Sat Jan 24 11:28:13 CST 2037
Certificate fingerprints:
SHA1: 3E:6B:D5:F0:9C:E6:F7:28:F0:84:1E:7E:DC:F0:D3:0F:F5:64:8C:D9
SHA256: 01:CB:5A:64:FE:B3:F6:16:9E:9D:BE:9C:43:04:B1:A7:FA:B1:2C:92:AF:68:14:DD:5F:98:92:AA:BC:01:F0:F3
Signature algorithm name: MD5withRSA (disabled)
Subject Public Key Algorithm: 1024-bit RSA key (weak)
Version: 1
Warning:
The certificate uses the MD5withRSA signature algorithm which is considered a security risk and is disabled.
The certificate uses a 1024-bit RSA key which is considered a security risk. This key size will be disabled in a future update.
修改Android.bp文件如下:
arduino
android_app_import {
name: "SogouInput",
apk: "SogouInput.apk",
// 保留apk自己的签名
// presigned: true,
// 打开将放到对应分区目录的priv-app文件夹下
privileged: true,
// 使用系统签名
certificate: "platform",
// 打开将放到system_ext分区
// system_ext_specific: true,
// 打开将放到product分区
// product_specific: true,
// 打开将放到vendor分区
// proprietary: true,
// device_specific: true
dex_preopt: {
enabled: false,
},
}
编译完成后再看下编译出的apk的签名,可以看到里面变成了android默认的签名
ruby
zzh@ubuntu:~/work/android/aosp/android-13.0.0_r40$ keytool -printcert -jarfile out/target/product/redfin/system/priv-app/SogouInput/SogouInput.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
priv-app
将应用内置到/system/priv-app目录时,有个特殊情况,就是要配置相应权限,否则会无法开机。
还以搜狗输入法为例,Android.bp如下:
ruby
// vendor/redfin/thrird_apps/Android.bp
android_app_import {
name: "SogouInput",
apk: "SogouInput.apk",
// 打开将放到/system/priv-app文件夹下
privileged: true,
// 使用系统签名
certificate: "platform",
dex_preopt: {
enabled: false,
},
}
在编译之前,我们先把ro.control_privapp_permissions设置为log,这样的话即使没有配置权限也能开机,但是会将缺少的权限配置打印出来,我们根据日志加入到系统对应的配置文件就可以了。
bash
// vendor/redfin/thrird_apps/preinstall_apps.mk
adb root;adb remount
adb pull vendor/build.prop
将build.prop文件里的ro.control_privapp_permissions的值改为log
ro.control_privapp_permissions=log
adb push build.prop /vendor/
adb reboot
如上修改后,编译SogouInput apk push到系统目录然后重启。
bash
make SogouInput
adb root;adb remount
adb push out/target/product/redfin/system/priv-app/SogouInput/ /system/priv-app/
adb shell sync
adb reboot
开机后过滤如下开机日志
perl
adb logcat|grep priv
10-14 22:17:26.794 1676 1676 W PackageManager: Privileged permission android.permission.READ_LOGS for package com.sohu.inputmethod.sogou (/system/priv-app/SogouInput) not in privapp-permissions allowlist
10-14 22:17:26.794 1676 1676 W PackageManager: Privileged permission android.permission.CLEAR_APP_CACHE for package com.sohu.inputmethod.sogou (/system/priv-app/SogouInput) not in privapp-permissions allowlist
10-14 22:17:26.794 1676 1676 W PackageManager: Privileged permission android.permission.PACKAGE_USAGE_STATS for package com.sohu.inputmethod.sogou (/system/priv-app/SogouInput) not in privapp-permissions allowlist
从如上日志中可看到提示有三个权限没有加到配置文件,我们加一下
javascript
// privapp-permissions.xml 文件只有在与特权应用位于同一分区时才能授予或拒绝授予该应用权限。
// 例如,如果 /vendor 分区上的应用请求特许权限,则只能由同样位于 /vendor 上的 privapp-permissions.xml
// 文件来同意或拒绝该请求。
// frameworks/base/data/etc/privapp-permissions-platform.xml
// 加入如下内容
<privapp-permissions package="com.sohu.inputmethod.sogou">
<permission name="android.permission.READ_LOGS"/>
<permission name="android.permission.CLEAR_APP_CACHE"/>
<permission name="android.permission.PACKAGE_USAGE_STATS"/>
</privapp-permissions>
// 最后记得将ro.control_privapp_permissions还原为enforce
还有另一种方式来获取上述权限配置的修改方法,如下:
注意先把上面的修改还原
ini
source build/envsetup.sh
lunch aosp_redfin-userdebug
make
编译成功后执行如下脚本:
development/tools/privapp_permissions/privapp_permissions.py -p system
没问题的话会输出所有system分区的特权名单,在最后可以看到有如下内容:
<privapp-permissions package="com.sohu.inputmethod.sogou">
<permission name="android.permission.CLEAR_APP_CACHE"/>
<permission name="android.permission.PACKAGE_USAGE_STATS"/>
<permission name="android.permission.READ_LOGS"/>
</privapp-permissions>
将上述内容加到frameworks/base/data/etc/privapp-permissions-platform.xml即可
最后编译刷机验证即可。
最后的建议,一般像这种三方apk都保留原来的签名即可,也不需要内置到priv-app目录,优化也关闭。如果内置中遇到问题可以尝试对比这三项修改即可。