Android 熱修復(一) 之 Tinker

前言

熱修復,是目前一個比較熱門的技術。它可以在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


① 創建項目,添加application

@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);
    }
}

在清單文件中,application節點下添加
android:name=".SimpleTinkerInApplication"

如果字顯示爲紅色,請build一下就可以了。

② 添加patch

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>

③ 打包生成舊的apk(即有bug的apk)
這裏,我使用的是源碼中提供的簽名文件。源碼見:tinker-patch-cli
注意我們可以直接使用官方提供的簽名文件和密鑰簽名,密鑰其實在tinker_config.xml文件中有寫,是:testres。

④ 複製舊apk的mapping文件
路徑:app->build->outputs->mapping->release->mapping.txt
複製此文件到和proguard-rules.pro同級的目錄下。
注意:此步驟是混淆代碼的情況下。如果沒有混淆代碼,忽略此步驟。

⑤ 修復bug,生成新apk
注意:如果之前是混淆代碼的情況,這個步驟需要在proguard-rules.pro中添加:
-applymapping mapping.txt
如果沒有混淆代碼,忽略此注意。只需要按照步驟生成新的apk就可以了。

生成Patch


如何生成patch呢?
patch是比較前後兩個app的不同而生成的。
tinker提供了patch生成的工具,打成一個jar就可以使用,並且提供了命令行相關的參數以及文件。
我們可以看到,源碼中爲我們提供了生成patch需要的資源。
路徑爲:


生成patch的命令爲:
java -jar tinker-patch-cli-1.7.7.jar -old old.apk -new new.apk -config tinker_config.xml -out output

我們用命令行,cd到資源文件目錄下,直接使用此命令就好了。

注意
A:jar文件請到我的CSDN中下載。鏈接爲:tinker-patch-cli-1.7.7.jar

B:output文件夾是要輸出patch時候使用到的,請提前創建

C:tinker_config.xml中的
<loader value="tinker.sample.android.SampleApplication"/>
替換成自己的application。

輸入此命令後,成功的話,會出現類似這種的界面展示:



此時,output文件夾下,會生成:


測試熱修復效果

① 在手機中安裝舊apk;

② 將patch_signed.apk pull到手機中;

③ 點擊app界面中的『加載patch按鈕』app會重啓,再次點開app時,發現TextView變成了『bug修復後~』。驗證成功!!!

注意

過程中,因爲手機版本不同。權限可能沒有給到,會報錯:

size 3324 verifyPatchMetaSignature fail

這時候需要手動給權限,設置權限中心等。


案例分享

案例demo下載---CSDN

案例demo下載---Github

官方文檔資源下載


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章