前言
熱修復,是目前一個比較熱門的技術。它可以在app已上線的情況下,無需重新發布安裝包,就可以修復bug。爲線上修復緊急bug,提供了一個很便捷也比較人性化的途徑。
傳統開發與熱修復開發的比較
傳統開發:
從流程來看,傳統的開發流程存在很多弊端:
重新發布版本代價太大;
用戶下載安裝成本太高;
BUG修復不及時,用戶體驗太差。
熱修復開發:
而熱修復的開發流程顯得更加靈活,優勢很多:
無需重新發版,實時高效熱修復;
用戶無感知修復,無需下載新的應用,代價小;
修復成功率高,把損失降到最低。
主流方案
目前比較主流、著名的有阿里巴巴的AndFix、Dexposed,騰訊QQ空間的超級補丁技術和微信的Tinker。
而今天,介紹的是微信的Tinker方案。
具體操作
//可選,用於生成application類
provided('com.tencent.tinker:tinker-android-anno:1.7.7')
//tinker的核心庫
compile('com.tencent.tinker:tinker-android-lib:1.7.7')
生成apk
@DefaultLifeCycle(application = ".SimpleTinkerInApplication",
flags = ShareConstants.TINKER_ENABLE_ALL,
loadVerifyFlag = false)
public class SimpleTinkerInApplicationLike extends ApplicationLike {
public SimpleTinkerInApplicationLike(Application application, int tinkerFlags, boolean tinkerLoadVerifyFlag, long applicationStartElapsedTime, long applicationStartMillisTime, Intent tinkerResultIntent) {
super(application, tinkerFlags, tinkerLoadVerifyFlag, applicationStartElapsedTime, applicationStartMillisTime, tinkerResultIntent);
}
@Override
public void onBaseContextAttached(Context base) {
super.onBaseContextAttached(base);
}
@Override
public void onCreate() {
super.onCreate();
TinkerInstaller.install(this);
}
}
android:name=".SimpleTinkerInApplication"
如果字顯示爲紅色,請build一下就可以了。
public class MainActivity extends AppCompatActivity {
private Context context;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
/**
* 初始化界面
*/
private void initView() {
context = this;
textView = (TextView) findViewById(R.id.main_tv);
}
/**
* 點擊按鈕 加載patch
*
* @param view
*/
public void loadPatch(View view) {
TinkerInstaller.onReceiveUpgradePatch(context,
Environment.getExternalStorageDirectory().getAbsolutePath() + "/patch_signed.apk");
}
}
這裏需要權限,需要在清單文件中添加:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/main_tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="bug修復前!" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="loadPatch"
android:text="加載patch" />
</LinearLayout>
-applymapping mapping.txt
如果沒有混淆代碼,忽略此注意。只需要按照步驟生成新的apk就可以了。生成Patch
java -jar tinker-patch-cli-1.7.7.jar -old old.apk -new new.apk -config tinker_config.xml -out output
<loader value="tinker.sample.android.SampleApplication"/>
替換成自己的application。測試熱修復效果
size 3324 verifyPatchMetaSignature fail