随着公司业务的扩展,App的体积也不断变大,在过去的几期App瘦身优化中,取得了显著的效果。常规的方法已经很难再缩小app的体积。在对App进行分析后,我们发现可以将部分不常用到、可以下发的资源, 所以我们设计了这个SDK用于资源的动态加载。
- 资源分类,预定义了字体,帧动画,so这3种内置资源,以及单个文件,多个文件这2种可自定义资源。
- 提供通用的加载动态资源方法,所有资源均可由此加载。
- 内置资源,提供默认的应用方法,外部可以直接应用。自定义资源,用户自行决定如何应用。
- 对于所有资源,提供可配置的方便快捷打包方式,减少手动操作。
通过引入动态资源管理系统,并将部分的so文件和其他普通资源动态化后,货拉拉用户端的包体积减少了8M,从54M变为了46M。后继将会继续尝试进行其他文件的动态化。
模块 | 功能 |
---|---|
sample_app | demo的 app模块 |
dynamic_res_plugin | 插件模块 |
dynamic_res_base | 基础库 |
dynamic_res_core | 动态资源核心库 |
sample_native_lib | demo的native库示例 |
dynamic_res_store | 生成的资源文件夹 |
dynamic_plugin.gradle | 插件脚本 |
-
模块中添加依赖
classpath 'cn.huolala:dynamic_res_core:1.1.2'
-
主目录下,build.gradle里面添加依赖
classpath 'cn.huolala:dynamic_res_plugin:1.1.2'
-
app/build.gradle里面添加
apply plugin: 'com.lalamove.dynamic_res_plugin'
主目录下,build.gradle里面添加
apply from: 'dynamic_plugin.gradle'
-
so资源打包
在dynamic_plugin.gradle中配置dynamic_config,详细内容请看dynamic_plugin.gradle
-
其他资源打包
将字体、帧动画、以及其他资源拷贝到dynamic_res_store/input/中对应目录
-
运行app
在dynamic_res_store/output/目录会生成对应的资源。
-
上传资源
自行将资源上传到服务器(也可以自行在代码中增加上传逻辑)
-
生成url填写到DynamicResConst.java中的对应资源
DynamicConfig config = DynamicConfig.Builder.with(context)
.executor()
.loadSoManager(createLoadSoManager())
.downlader()
.debugLog(BuildConfig.DEBUG)
.loggger()
.monitor()
.build();
DynamicResManager.getInstance().init(config);
详见DynamicInitJob.java
IoThreadPool.getInstance().getThreadPoolExecutor().execute(() -> {
if (DynamicResManager.getInstance().getLoadSoManager() != null) {
DynamicResManager.getInstance().getLoadSoManager().loadSo(DynamicResConst.DEMO_SO, null);
}
});
详见PreDynamicLoadJob.java
-
字体
DynamicResManager.getInstance().setTypeface(mFontTv, DynamicResConst.TypeFace.FONT_FZ_RZ_BOLD);
-
帧动画
mCarAnim = DynamicResManager.getInstance().createFrameAnim(ImageView).durations(100).oneShot(false); mCarAnim.startAnim(DynamicResConst.FrameAnim.ANIM_CAR);
-
so
DynamicResManager.getInstance().getLoadSoManager().loadSo(DynamicResConst.DEMO_SO, new ILoadSoListener() { @Override public void onSucceed(String path) { mContentTv.append(new NativeLib().stringFromJNI()); } });
详细请参考MainActivity.java
- 如果你发现了bug或者有其他功能诉求,欢迎提issue。
- 如果想贡献代码,可以直接发起MR。
采用Apache 2.0协议,详情参考LICENSE