當你的項目已經上線,一個BUG被發現卻已經爲時已晚,這時候悔恨自責都已經於事無補,甚至還會被夥伴們打上不靠譜的標籤,這時候你想不想像哈利波特一樣,魔法杖一揮BUG瞬間消除?沒錯拿着WindFix你就可以實現這一點。
WandFix是一個基於java ClassLoader實現的熱修復框架。
使用WandFix可以不再用 new 來創建對象,只需要對變量名添加註解即可實現對象的注入。而熱修復功能的實現既是用對象注入的這種途徑,通過更換熱修復包替換實現類,來達到每次注入的對象都爲最後改動過的,實現熱修復的目的。當然,如果您不想使用熱修復功能,只是想方便的注入對象,直接添加註解也是可以的,因爲如果它在熱修復包中沒有找到對應的實現類的話,會嘗試從項目本地來加載對應的類,保證程序的穩定。
效果展示:
優點:
- 類似於黃油刀可以直接對成員變量添加@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
附上GitHub地址
歡迎提出問題和寶貴意見。如果您覺得這個項目還不錯,就點個star吧( ̄▽ ̄)~*