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

相关推荐
zhangphil36 分钟前
Android简洁缩放Matrix实现图像马赛克,Kotlin
android·kotlin
m0_5127446436 分钟前
极客大挑战2024-web-wp(详细)
android·前端
lw向北.1 小时前
Qt For Android之环境搭建(Qt 5.12.11 Qt下载SDK的处理方案)
android·开发语言·qt
不爱学习的啊Biao1 小时前
【13】MySQL如何选择合适的索引?
android·数据库·mysql
Clockwiseee1 小时前
PHP伪协议总结
android·开发语言·php
mmsx8 小时前
android sqlite 数据库简单封装示例(java)
android·java·数据库
众拾达人11 小时前
Android自动化测试实战 Java篇 主流工具 框架 脚本
android·java·开发语言
吃着火锅x唱着歌12 小时前
PHP7内核剖析 学习笔记 第四章 内存管理(1)
android·笔记·学习
_Shirley13 小时前
鸿蒙设置app更新跳转华为市场
android·华为·kotlin·harmonyos·鸿蒙
hedalei15 小时前
RK3576 Android14编译OTA包提示java.lang.UnsupportedClassVersionError问题
android·android14·rk3576