WandFix是一個基於java ClassLoader實現的熱修復框架。
效果展示:
優點:
- 類似於黃油刀可以直接對成員變量添加@InjectObject("com.example.motordex.AppParsenterImpl2")註解,來綁定熱修復包中的實現類。
- 無需關閉應用即可使修復包生效。
- 與mvp模式搭配使用效果最佳。
- 可以自己定義需要熱修復的類。
- 可以自己配置dex加密算法,保護dex文件的安全。
- 可以通過註解單獨設置某個對象是否禁用雙親委託。
使用
使用方法:
git clone https://github.com/miqt/WandFix.git
添加依賴:
compile project(':wand')
annotationProcessor project(':wand-compiler')
代碼調用:
public class MainActivity extends AppCompatActivity {
@InjectObject(
"com.example.motordex.AppParsenterImpl2"//熱修復包中的實現類
)
AppParsenter ap;
@InjectObject(
value = "com.example.motordex.AppParsenterImpl2",//熱修復包中的實現類
level = ParentalEntrustmentLevel.PROJECT//啓用雙親委託,優先加載本地類
)
AppParsenter ap;
@Override
protected void onCreate(Bundle savedInstanceState) {
...
//初始化,可以放在application中調用一次即可
Wand.init(this);
//單個參數
ClassInstall.inject(this);
//多個參數的構造方法
//Map<String, Object[]> map = new HashMap<>();
//map.put("com.example.motordex.AppParsenterImpl2", new Object[]{1, "參數2", "參數3"});
//ClassInstall.inject(this, map);
//調用
String str = ap.getStr();
Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
...
}
}
創建並啓用熱修復包
創建熱修復包非常簡單。
- 在編輯器中對類參數添加註解
class A{
@InjectObject(
value = "com.example.motordex.AppParsenterImpl",
level = ParentalEntrustmentLevel.NEVER)
AppParsenter ap;
}
- 在android studio 中點擊 Build >> Make Project , 就會在項目的根目錄生成 make_fix_pack.bat 批處理腳本。文本編輯器打開之後類似於這樣:
cd ./app/build/intermediates/classes/debug/
jar cvf hotfix_pack.jar ./com/example/motordex/AppParsenterImpl.class
dx --dex --output=../../../../../hotfix_pack.dex hotfix_pack.jar
運行 make_fix_pack.bat 批處理腳本,可以通過找到這個腳本文件直接雙擊或者在終端中運行,運行之後就可以在項目根目錄找到 hotfix_pack.dex 文件,這個就是熱修復包了。
通過服務器吧這個 hotfix_pack.dex 文件下發下去,當程序運行到
Wand.with(this).init().attachDex(new File("該文件存儲路徑"));
的時候,這個熱修復包就被應用到程序中去了。
具體更多用法及其實現原理請移步GitHub·Wiki
歡迎提出問題和寶貴意見。如果您覺得這個項目還不錯,就點個star吧( ̄▽ ̄)~*