Android 基础库 - 插件框架 - 存储优化

本文详细介绍了插件化框架的设计与实现,包括需求定义、基本原理、插件管理和集成方式等核心内容。特别关注了解压内置so、使用系统预置so和odex的优化策略,以及多应用共享插件的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

往期参考:

  1. 需求定义
  2. 基本原理
  3. 插件实现
  4. 资源覆盖
  5. 插件管理

插件框架代码已经开源,欢迎使用并反馈。https://github.com/cmguo/android-plugins

 

优化项目

集成方式

Android版本

说明

多应用共享

系统插件

 

包括:系统升级插件、 系统预置插件

皮肤覆盖不共享

不解压内置so

 

6.0及以上

ZipAlign

使用系统预置so

系统预置插件

5.0以下

5.0及以上

预置目录结构不同

文件时间相同

兼容/system/app目录

不存在APK内置so

使用系统预置odex

系统预置插件

5.0以下

5.0及以上

预置目录结构不同

删除多余缓存项目

 

 

 

 

 

多应用共享

对于系统预置的插件(/system分区),被多个应用加载时,每个应用会在各自的cache目录下加压出该插件的dex、so文件。

为此,针对系统预置插件,比如/system/xxx/Yyy.apk,规定解压的cache目录为/data/xxx/<package>/,这样多个应用可以共享。

因为dex优化、解压so库,已经有跨进程同步机制,所以多应用不会冲突。

 

 

不解压内置so

从Android 6.0开始,底层加载so 支持直接加载(映射)zip文件中的so,但是so库在zip中需要用特殊方式存储:

  • 不压缩(纯STORE模式)
  • 页面(磁盘块)对齐

目前基于Android 6.0源代码的编译是已经满足上述条件。

能够节省压缩后的so大小的空间(一般50%)。

 

 

使用系统预置so

系统预置应用一般so另外保存,预置插件也可以采用此方式保存,具体保存目录如下:

  • Android 5.0 之前,所有so保存在/system/lib目录
  • Android 5.0开始,各个插件的so分别保存在自己的目录下面,比如/system/ <plugins>/<plugin>/lib/arm(64)下面
  • 为了兼容错误的配置,也搜索/system/app/<plugin>/lib/arm(64)

在DexClassLoader的libPath增加系统预置目录(在后面)。在搜索so时,如果能够找到,并且与插件apk文件时间一致,就使用预置的so。

已经在apk中内置so,不使用系统预置so。

 

 

使用系统预置odex

系统预置应用有时候会做预先代码优化,odex保存在system分区。预置插件也可以采用此方式,具体保存位置:

  • Android 5.0 之前,保存在/system/<plugins>/<plugin>.odex
  • Android 5.0开始,各个插件的odex分别保存在自己的目录下面,比如:/system/ <plugins>/<plugin>/oat/arm(64)/<plugin>.odex
  • 为了兼容错误的配置,也检查/system/app/<plugin>/oat/arm(64)/plugin.odex

在DexClassLoader设置优化文件位置为上述位置,前提要检查文件时间是否与插件apk一致。

 

 

删除多余缓存项目

项目

条件

说明

插件缓存目录

对应插件不再存在

系统插件和应用插件不同的缓存目录

与具体是否加载无关

应用内置插件副本

对应应用内置插件不再存在

 

插件SO副本

插件不再包含对应SO

改为不解压SO方式,也删除

插件配置文件副本

插件不再包含对应配置文件

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fighting Horse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值