Android 專案模組化開發,提高開發效率。
阿新 • • 發佈:2019-02-20
把Demo放在第一!!!
隨著需求的增加,程式碼量隨之變得龐大、臃腫。於是產生了很多影響開發效率的問題。
例如:
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 你的實現類所在的包名.**{*;}