往期参考:
插件框架代码已经开源,欢迎使用并反馈。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方式,也删除 |
插件配置文件副本 | 插件不再包含对应配置文件 |
|