# hll-dynamic-res-plugin
**Repository Path**: xjt010_admin/hll-dynamic-res-plugin
## Basic Information
- **Project Name**: hll-dynamic-res-plugin
- **Description**: 信息谢谢谢谢谢谢谢谢谢谢XXXX
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2023-09-25
- **Last Updated**: 2023-09-25
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
[](https://www.apache.org/licenses/LICENSE-2.0)   
# 背景
随着公司业务的扩展,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 | 插件脚本 |
# 使用介绍
## 1.编译和引入插件
1. 模块中添加依赖
`classpath 'cn.huolala:dynamic_res_core:1.1.2'`
2. 主目录下,build.gradle里面添加依赖
`classpath 'cn.huolala:dynamic_res_plugin:1.1.2'`
3. app/build.gradle里面添加
`apply plugin: 'com.lalamove.dynamic_res_plugin'`
## 2.增加gradle配置
主目录下,build.gradle里面添加
`apply from: 'dynamic_plugin.gradle'`
## 3.打包资源
1. so资源打包
在dynamic_plugin.gradle中配置dynamic_config,详细内容请看dynamic_plugin.gradle
2. 其他资源打包
将字体、帧动画、以及其他资源拷贝到dynamic_res_store/input/中对应目录
3. 运行app
在dynamic_res_store/output/目录会生成对应的资源。
4. 上传资源
自行将资源上传到服务器(也可以自行在代码中增加上传逻辑)
5. 生成url填写到DynamicResConst.java中的对应资源
[详见 资源打包和使用说明.md](资源打包和使用说明.md)
## 4.初始化
```java
DynamicConfig config = DynamicConfig.Builder.with(context)
.executor()
.loadSoManager(createLoadSoManager())
.downlader()
.debugLog(BuildConfig.DEBUG)
.loggger()
.monitor()
.build();
DynamicResManager.getInstance().init(config);
```
详见DynamicInitJob.java
## 5.部分资源预加载
```java
IoThreadPool.getInstance().getThreadPoolExecutor().execute(() -> {
if (DynamicResManager.getInstance().getLoadSoManager() != null) {
DynamicResManager.getInstance().getLoadSoManager().loadSo(DynamicResConst.DEMO_SO, null);
}
});
```
详见PreDynamicLoadJob.java
## 6.资源使用
1. 字体
```
DynamicResManager.getInstance().setTypeface(mFontTv, DynamicResConst.TypeFace.FONT_FZ_RZ_BOLD);
```
2. 帧动画
```
mCarAnim = DynamicResManager.getInstance().createFrameAnim(ImageView).durations(100).oneShot(false);
mCarAnim.startAnim(DynamicResConst.FrameAnim.ANIM_CAR);
```
3. so
```java
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。
## 技术博客
[货拉拉 Android 动态资源管理系统原理与实践](https://juejin.cn/post/7238627611265613882)
## 作者
[货拉拉移动端技术团队](https://juejin.cn/user/1768489241815070)
## 许可证
采用Apache 2.0协议,详情参考[LICENSE](https://github.com/HuolalaTech/DynamicPlugin-android/blob/master/LICENSE)