Android应用预置系统

本文详细介绍了Android系统中的应用预置流程及系统分区,包括如何将开发的Apk预置到手机的不同分区,以及预置过程中遇到的问题解决办法。特别是针对含有so文件的Apk,讲解了如何正确放置so文件。
项目中需要将开发出来的Apk预置到某款手机里面,如果是不可卸载,就将Apk放到/system/app/下面,如果可以卸载,那就放到/data/app/下面。

但遇到了一个问题:apk中包含so文件,这个时候需要将so文件预置到/system/lib/下面,在apk中删除so文件。

关于Android系统的分区以及含义,网上的分析如下:
安卓的系统一般会有4个重要的分区:boot,system,cache,data。system分区存放的是系统应用(system app)和系统所需要的库文件(lib/*.so),而大家平时安装的软件是装到data分区(用户区)的。装在system区的就是系统应用,data分区的是用户应用。应用程序都安装在/app子目录下。
  但是,不管是系统应用还是用户应用,安卓会建立缓存以加速应用的启动,该缓存是在/data/dalvik-cache下面。注意了,是在data分区上的,所以应用安装的越多,data分区可用的空间就越少。

  一般ROOT之后,我们会删除/卸载部分系统的应用,从而system分区就空出了部分的空间,尤其是定制机,删了系统应用之后,会空出多达60M的空间。假如本身机器的ROM比较小,data分区不够用的话,就最好把部分的app移动到system空间,当然一旦移动到了system分区,就是系统应用了!



好,下面介绍哪些应用是可以移动到system分区的:

1) 开机就要启动的程序,比如权限管理啊,Widget啊。

2) 常常用到的程序,比如文件管理器。

3) 一些不会有内存驻留的小程序,比如autostarts,SD Maid啊。



有一些应用是不适合移动到system空间的:

1) 退出仍然会驻留内存的程序(比如数米基金宝),因为这些程序一旦变成了system应用,杀进程的软件就拿他们没办法了。

2) 应用程序内含lib库的,这个可以用压缩工具(windows下的zip工具、安卓下的ES文件管理器、RootExplorer)查看该apk,假如内部有lib文件夹的,里面有*.so文件的,那就说明他用到了这些lib。当然,若硬要移动到system空间也是可以的,只要把lib/*.so拷贝到system/lib下即可,但是本人觉得一是会造成重复,二是将来维护起来比较麻烦。不过有一法,可以在system/app下面建立文件夹,把*.so拷贝到该文件夹下,然后通过链接文件的方式将其拷贝到lib下。(这个我没试过)



移动方法:

1) 将该apk先卸载,然后将apk文件拷贝到system/app下,修改权限,有必要的话,重启一下。这样做的好处是,该软件的缓存会在卸载是自动删除。

2) 为防止有些应用卸载后数据丢失,可以不卸载,方法是:将apk拷贝到system/app下,然后删除data/app的apk,最后手动把/data/dalvik-cache/下该程序的缓存清除。

3) 假如要移动的应用太多,可以进入recovery,清除一下dalvik-cache,让启动的时候自动再生成cache。

附:
1. 查看各个分区的使用情况:http://blog.youkuaiyun.com/puncha/article/details/7670727
<think>我们正在讨论Android预置应用的安装机制。预置应用是指在设备出厂前被预先安装到系统分区(如/system分区)的应用。这类应用通常无法被普通用户卸载,且具有较高的系统权限。根据引用内容,我们可以总结出几种关键机制: ### 1. **白名单机制** 引用[1]和引用[3]提到了一种白名单机制: - 在系统源码中,可以通过`DEFAULT_WHITELIST`定义默认允许安装的应用包名列表(通常是预置应用)。 - 额外的白名单可通过`/system/etc/package_whitelist.txt`文件添加。 - **作用**:只有白名单内的应用才允许安装,其他应用会被拦截。这通常通过修改`PackageManagerService(PMS)`的安装验证逻辑实现。 ### 2. **Overlay机制** 引用[2]展示了Android的Overlay机制: - Overlay应用通过声明`<overlay>`标签指定目标应用包名(如`targetPackage="com.ian4u.tool"`)。 - **作用**:允许在不修改原始APK的情况下,覆盖目标应用的资源(如字符串、样式等)。Overlay应用需要预置系统分区,并在`AndroidManifest.xml`中声明静态属性(`android:isStatic="true"`)。 ### 预置应用的核心流程 Android预置应用的安装分为两个阶段: 1. **系统镜像编译阶段**: - 应用被放入`/system/priv-app`(高权限应用)或`/system/app`(普通系统应用目录。 - 系统在编译时会扫描这些目录,生成初始包信息并写入`/data/system/packages.xml`。 2. **首次开机阶段(或恢复出厂设置后)**: - `PackageManagerService`会扫描系统分区中的预置应用目录,执行安装操作。 - 关键代码路径:`PackageManagerService`的构造函数中调用`scanDirTracedLI()`扫描系统应用目录[^1]。 ### 预置应用的特性 - **权限更高**:预置在`/system/priv-app`的应用可申请`signature|privileged`权限。 - **卸载保护**:普通用户无法卸载预置应用(除非root后手动删除)。 - **更新机制**:预置应用可通过OTA或应用商店更新,更新后的应用存储在`/data/app`,但原始系统分区的APK仍保留(用于恢复出厂时回退)。 ### 技术实现示例 在Android源码中,预置应用安装的核心逻辑位于: ```java // PackageManagerService.java private void scanDirTracedLI(File scanDir, int parseFlags, int scanFlags, long currentTime) { // 扫描系统目录并安装APK } ``` 安装时会校验应用签名和白名单(若有),通过后才会创建应用数据目录[^1][^3]。 ### 与其他机制的关联 - **白名单**:若系统启用了安装白名单,则只有`package_whitelist.txt`中的包名允许安装(引用[3])。 - **Overlay**:预置的Overlay应用会在系统启动时自动激活,无需手动安装(引用[2])。 §§相关问题§§ 1. Android预置应用如何实现卸载保护? 2. Overlay机制除了替换资源,能否修改代码逻辑? 3. 如何添加新的预置应用到AOSP编译系统? </think>### Android预置应用安装机制详解 Android预置应用是指在设备出厂前被预先安装到系统分区(如`/system/app`或`/system/priv-app`)的应用。其核心机制涉及以下关键技术: #### 1. **系统分区预置** 预置应用APK文件直接集成到系统镜像中: - **路径**:`/system/app`(普通应用)、`/system/priv-app`(特权应用) - **权限**:系统级签名(`platform`或`shared`签名) - **特性**: - 无法被普通用户卸载 - 开机时由`PackageManagerService`自动安装 - 可通过`pm list packages -s`命令查看[^1] #### 2. **安装白名单机制** 通过修改`PackageManagerService(PMS)`实现安装控制: ```java // 在installPackageAsUser方法中添加校验 if (!isInWhitelist(packageName)) { throw new SecurityException("APP not in whitelist"); } ``` - **白名单来源**: 1. 硬编码列表(`DEFAULT_WHITELIST`) 2. 配置文件(`/system/etc/package_whitelist.txt`)[^3] - **典型场景**:仅允许预置应用或指定包名安装[^1] #### 3. **Overlay机制** 用于修改预置应用资源(无需修改原APK): ```xml <!-- Overlay应用AndroidManifest.xml --> <manifest> <overlay android:targetPackage="com.example.target" android:isStatic="true" <!-- 永久生效 --> android:priority="1"/> </manifest> ``` - **实现原理**: - Overlay APK需预置到`/vendor/overlay` - `AssetManager`加载时合并目标包资源[^2] - **使用限制**:仅能覆盖资源(图片/字符串等),不能修改代码逻辑 #### 4. **安装流程关键节点** 1. **扫描阶段**:开机时`PMS`扫描系统分区 2. **解析阶段**:解析APK的`AndroidManifest.xml` 3. **签名验证**:检查系统签名或平台证书 4. **安装执行**: ```java // PackageManagerService.java void scanDirTracedLI(File dir, ...) { for (File file : dir.listFiles()) { PackageParser.Package pkg = parsePackage(file); installPackageLI(pkg); }} // [^1] ``` #### 5. 定制化扩展 - **新增预置应用**: 1. 将APK放入`AOSP/packages/apps/YourApp` 2. 在`device.mk`中添加`PRODUCT_PACKAGES += YourApp` - **特权应用**:需放置在`/system/priv-app`并声明特权权限[^3]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值