Android高通预置apk可卸载,恢复出厂设置可恢复

本文介绍了如何在Android系统中处理高通预置apk的应用卸载和恢复。通过`copy_apps.sh`脚本,将`/system/pre_install/`目录下的apk复制到`/data/app/`,在`Android.mk`文件中添加相关代码,并在`init.target.rc`中配置。调试时,可以通过adb shell进入设备并运行脚本来检查是否执行成功。

没什么好说的,先上代码:

copy_apps.sh

  1. 路径:vendor/qcom/proprietary/qrdplus/Extension/config
#!/system/bin/sh
sleep 10
if [ ! -f /data/app/did ]; then
    chmod 777 /data/app/
    cp -rf /system/pre_install/* /data/app/
    echo 1 > /data/app/did
    chmod -R 777 /data/app/*
fi
  1. 作用:把/system/pre_install/下的内容拷贝到/data/app/

Android.mk

在同目录的Android.mk中添加如下代码:

############
<think>我们正在讨论在Android15的高通平台上实现预装可卸载应用的方案。首先,我们需要理解Android的预装应用机制。在Android系统中,预装应用通常分为两类:不可卸载的系统应用(位于`/system`分区)和可卸载的预装应用(通常位于`/vendor`分区或`/product`分区)。从Android10开始,Google引入了动态分区和可更新的系统组件,因此预装应用的放置位置和卸载方式也发生了变化。在Android15上,高通平台通常使用A/B分区和动态分区。为了实现可卸载的预装应用,我们通常将应用放置在`/vendor`分区下的`/vendor/app`目录,或者`/product`分区下的`/product/app`目录。这些分区上的应用在系统启动时会被安装,但用户可以在设置中卸载它们。具体步骤:1.**准备应用APK**:将需要预装的应用APK准备好,并确保其签名正确(通常使用平台签名或测试签名)。2.**确定预装位置**:选择将应用放置在哪个分区。推荐放在`/vendor`分区或`/product`分区下的应用目录。例如:-`/vendor/app/YourApp/YourApp.apk`-`/product/app/YourApp/YourApp.apk`3.**创建模块目录**:在预装目录下为每个应用创建一个单独的目录,并将APK放入其中。同时,在该目录下创建一个名为`Android.mk`或`Android.bp`的构建文件(取决于你使用的构建系统)。现在Android推荐使用`Android.bp`(Soong构建系统)。4.**编写构建脚本**:以`Android.bp`为例,编写一个`android_app`模块。例如:```bpandroid_app{name:"YourApp",srcs:["YourApp.apk"],certificate:"platform",//使用平台签名,或者使用"PRESIGNED"表示已经签名的APKprivileged:false,//设置该应用为可卸载overrides:[],product_specific:true,//如果放在vendor分区,则设置为true;如果放在product分区,则不需要dex_preopt:{enabled:false,},}```注意:`certificate`字段可以指定为`"platform"`(使用平台签名)或者`"PRESIGNED"`(表示APK已经预先签名)。如果使用`"PRESIGNED"`,则APK必须是已经签名的。5.**配置设备Makefile**:在设备配置的Makefile(通常是`device.mk`)中添加该模块到`PRODUCT_PACKAGES`变量中。例如:```makefilePRODUCT_PACKAGES+=YourApp```6.**编译并刷机**:重新编译系统镜像,并将新的系统镜像刷入设备。7.**验证**:启动设备后,检查应用是否预装成功,并尝试在设置中卸载。**注意**:用户卸载预装应用后,该应用的数据会被清除,但APK文件仍然存在于分区中。当用户恢复出厂设置时,应用会重新出现。**卸载机制**:Android系统在用户卸载预装应用时,实际上是调用了`pmuninstall-k--user0<package-name>`命令的变体,但用户通过设置界面卸载时,系统会标记该应用为已卸载(即对用户不可用),但APK文件不会被删除(因为所在分区是只读的)。当恢复出厂设置时,系统会重置用户数据,所以应用会重新出现。**问题**:如果应用需要更新,由于它位于只读分区,所以无法直接更新。更新需要通过GooglePlay商店或其它应用商店进行。更新后的应用会安装在用户数据分区,用户卸载时只会卸载更新,回退到预装版本。如果要完全卸载,则用户需要先卸载更新,然后再卸载预装应用(但预装应用在卸载恢复出厂设置又会回来)。**另一种方法:使用stubAPK**:为了支持预装应用的可卸载和可更新,另一种常见做法是使用一个很小的stubAPK预装在系统分区,该应用在第一次运行时从服务器下载完整的应用。这样用户卸载的是stub,而完整应用可以随时更新。但这种方法需要网络支持,且用户第一次使用需要下载。**在高通平台上的注意事项**:高通平台通常使用自己的构建脚本和配置,但上述步骤是通用的。需要检查设备分区布局,确保`/vendor`或`/product`分区有足够的空间。另外,高通平台可能提供了一些特定的环境变量和构建支持,可以参考高通提供的文档。**引用**:Android开源项目(AOSP)关于预装应用的文档[^1]和高通平台开发指南[^2]提供了更多细节。§§相关问题§§1.如何为预装应用进行签名?2.在Android15上,如何将应用预装到`/system_ext`分区?3.如何实现预装应用在卸载后不再恢复出厂设置时重新出现?4.如何更新预装在只读分区中的应用?</think>### Android 15 高通平台预装可卸载应用实现指南 在 Android 15 的高通平台上实现预装可卸载应用,需遵循以下关键步骤和技术要点: #### 一、技术实现方案 1. **应用预装位置选择** - 使用 `/product` 或 `/vendor` 分区(推荐 `/vendor/app`) - 避免 `/system` 分区(该分区应用默认不可卸载) - 示例目录结构: ``` /vendor/app/MyPreinstalledApp/ ├── MyPreinstalledApp.apk └── Android.mk ``` 2. **Android.bp 构建脚本配置** ```bp android_app { name: "MyPreinstalledApp", srcs: ["MyPreinstalledApp.apk"], certificate: "platform", // 使用平台签名 privileged: false, // 非特权应用 overrides: [], dex_preopt: { enabled: false, }, // 关键卸载属性 module_tags: ["optional"], product_specific: true, } ``` **关键参数**: - `module_tags: ["optional"]`:标记为可卸载 - `product_specific: true`:安装在 vendor 分区 3. **设备配置集成** 在设备 Makefile 中添加: ```makefile PRODUCT_PACKAGES += MyPreinstalledApp ``` 4. **签名要求** - 必须使用 **平台签名** 或 **厂商测试密钥** - 禁止使用第三方签名(否则无法通过 SELinux 检查) #### 二、卸载控制机制 1. **系统级卸载原理** Android 通过 `PackageManager` 实现: ```java // 系统服务中检查卸载权限 if ((flags & PackageManager.DELETE_SYSTEM_APP) != 0) { // 允许卸载预装应用 } ``` 2. **SELinux 策略配置** 在 `vendor.te` 中添加: ``` type vendor_app, domain; type vendor_app_exec, exec_type, file_type; ``` #### 三、高通平台适配要点 1. **分区挂载配置** 在 `fstab.qcom` 中确保: ``` /vendor ext4 ro,barrier=1 wait,slotselect ``` 2. **构建系统集成** 高通平台需在 `device/qcom/common` 中添加: ```makefile BOARD_VENDOR_APPS := MyPreinstalledApp ``` 3. **AB 更新兼容性** 在 `AndroidBoard.mk` 中声明: ```makefile LOCAL_PREBUILT_PACKAGE := $(PRODUCT_OUT)/vendor/app/MyPreinstalledApp ``` #### 四、验证与调试 1. **卸载测试命令** ```bash adb shell pm uninstall -k --user 0 com.example.mypreinstalledapp ``` 2. **恢复出厂设置验证** 恢复后应用应重新出现(APK 仍保留在只读分区) 3. **日志过滤关键字** ```bash adb logcat | grep -E "PackageManager|PreinstalledApp" ``` #### 五、注意事项 1. **Android 15 新特性** - 必须适配 **动态分区更新**(Virtual A/B) - 遵守 **Treble 规范** 的严格接口要求 - 需处理 **Scoped Storage** 权限模型 2. **厂商自定义限制** 部分 OEM 可能: - 禁用 `module_tags` 功能(需修改框架层) - 强制白名单验证(需更新 `/vendor/etc/preinstalled-packages.xml`) **典型错误案例**: 应用放置在 `/system/priv-app` 导致无法卸载(错误代码 `DELETE_FAILED_INTERNAL_ERROR`)[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值