Android 13 内置三方应用app

点赞收藏加关注,下次找我不迷路。

也欢迎关注微信公众号 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目录,优化也关闭。如果内置中遇到问题可以尝试对比这三项修改即可。

相关推荐
sun0077006 小时前
android ndk编译valgrind
android
AI视觉网奇7 小时前
android studio 断点无效
android·ide·android studio
jiaxi的天空7 小时前
android studio gradle 访问不了
android·ide·android studio
No Silver Bullet8 小时前
android组包时会把从maven私服获取的包下载到本地吗
android
catchadmin8 小时前
PHP serialize 序列化完全指南
android·开发语言·php
tangweiguo030519879 小时前
Kable使用指南:Android BLE开发的现代化解决方案
android·kotlin
00后程序员张12 小时前
iOS App 混淆与资源保护:iOS配置文件加密、ipa文件安全、代码与多媒体资源防护全流程指南
android·安全·ios·小程序·uni-app·cocoa·iphone
柳岸风13 小时前
Android Studio Meerkat | 2024.3.1 Gradle Tasks不展示
android·ide·android studio
编程乐学13 小时前
安卓原创--基于 Android 开发的菜单管理系统
android
whatever who cares15 小时前
android中ViewModel 和 onSaveInstanceState 的最佳使用方法
android