把Demo放在第一!!!
Github:https://github.com/601367322/MyFast
随着需求的增加,代码量随之变得庞大、臃肿。于是产生了很多影响开发效率的问题。
例如:
1. 方法数超过65K。
2. 程序编译运行一次至少1-2分钟。
3. 代码变得难以管理,影响阅读及修改效率。
4. 代码之间紧密度高,不好拆分任务……
为了解决上述种种问题,我设计了一个简单的模块化机制。
先来看看我项目的大致结构吧。
图中可以看到,项目里有很多自定义的代码库和第三方库(统计、反馈、视频、热修复、音乐、支付、分享、更新等等)。其中标注红线的lib都是可拆分的模块。
我们可以做到,在开发Debug的时候按需加载这些模块,使得编译速度大大提升,而在正式Release的时候,则全量自动加载。
Debug版本编译大小
Release版本编译大小
按需编译,不仅体积变小了,编译速度也提升了好几倍。
图解
如何实现反射
public class PluginManager {
IOne one;
ITwo two;
private static PluginManager mInstance;
public PluginManager() {
try {
one = getImpl("com.example.fast.impl.OneImpl");
two = getImpl("com.example.fast.impl.TwoImpl");
} catch (Exception e) {
e.printStackTrace();
}
}
private <T> T getImpl(String className) {
try {
Class<?> clazz = Class.forName(className);
return (T) clazz.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static PluginManager getInstance() {
if (mInstance == null) {
synchronized (PluginManager.class) {
if (mInstance == null) {
mInstance = new PluginManager();
}
}
}
return mInstance;
}
public static IOne getOne() {
return getInstance().one;
}
public static ITwo getTwo() {
return getInstance().two;
}
}
如何调用
public void onOneBtnClick(View view) {
if (PluginManager.getOne() != null) {
PluginManager.getOne().startActivity(this);
}
}
public void onTwoBtnClick(View view) {
if (PluginManager.getTwo() != null) {
PluginManager.getTwo().startActivity(this);
}
}
如何实现按需加载
gradle已经为我们提供里很方便的功能。
compile project(':lib.one') //任何时候都会加载
releaseCompile project(':lib.two') //打包的时候加载
特别注意
一定要注意混淆的规则,不能讲被反射的类混淆掉,否则会无法反射。
-keep class 你的实现类所在的包名.**{*;}