微信熱修復 Tinker 快速上手

前言

希望通過本文能夠幫助之前沒有接觸過 Tinker 的同學,快速了解利用 Tinker 生成及使用補丁包的過程。

Tinker 版本:1.8.1
Tinker 官方文檔:https://github.com/Tencent/tinker/wiki

gradle 接入

我沒有 clone 官方的例子,也沒有在現有項目上直接接入,而是創建了一個新的項目。

在項目的 build.gradle 中,添加tinker-patch-gradle-plugin依賴:

buildscript {
    dependencies {
        classpath ('com.tencent.tinker:tinker-patch-gradle-plugin:1.8.1')
    }
}

然后在 app 的 gradle 文件 app/build.gradle,添加 tinker 的庫依賴以及 apply tinker 的 gradle 插件:

dependencies {
    provided('com.tencent.tinker:tinker-android-anno:1.8.1')
    compile('com.tencent.tinker:tinker-android-lib:1.8.1') 
}
...
apply plugin: 'com.tencent.tinker.patch'

在這一步不用著急編譯,下面還有 gradle 的詳細配置。

生成 Application

tinker 建議編寫一個 DefaultApplicationLike 的子類,并使用@DefaultLifeCycle注解生成 Application.

@DefaultLifeCycle(application = ".MyApplication", //要生成的application名稱
                  flags = ShareConstants.TINKER_ENABLE_ALL)
public class MyApplicationLike extends DefaultApplicationLike {

    public MyApplicationLike(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);
        TinkerInstaller.install(this);
    }
}

注意 application 名稱為.MyApplication,我創建的 MyApplicationLike 所在的包為tech.gujin.tinkersample.application,生成的 MyApplication 也在這個包下。或者將包名寫全:application = "tech.gujin.tinkersample.application.MyApplication",生成的文件都是一樣的。

之后注冊 Application 到 AndroidManifest 中:

<application
    android:name="tech.gujin.tinkersample.application.MyApplication"
    ...
</application>

如果報錯現在不用處理,編譯后會自動生成的。

gradle 配置

我直接拷貝了官方例子,修改了其中獲取 tinkerId 的方法,bakPath 的路徑,移除了多渠道部分。

def bakPath = file("./tinker-old/") //可自行定義文件路徑

ext {
    tinkerId = "tinker_id_" + android.defaultConfig.versionName + "_" + android.defaultConfig.versionCode
    tinkerEnabled = true
    tinkerOldApkPath = "${bakPath}/app-release-1.0-1.apk" //可自行修改文件名
    tinkerApplyMappingPath = "${bakPath}/app-release-1.0-1-mapping.txt"
    tinkerApplyResourcePath = "${bakPath}/app-release-1.0-1-R.txt"
}

因為要生成補丁,tinker 需要上一個版本的安裝包用來比較差異。
我創建了tinker-old文件夾,放入上一個版本名為app-release-1.0-1.apk的安裝包,并將路徑設置給 tinkerOldApkPath.
為了減少補丁包的大小,還可以繼續設置 tinkerApplyMappingPath 和 tinkerApplyResourcePath.
其余地方并無太大變化,更多可以看修改后的gradle
首次接入沒有舊的安裝包也不用擔心,如果指定文件不存在 tinker 會自動忽略。

使用前的準備

創建一個很簡單的 Activity:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ((TextView) findViewById(R.id.tv_msg)).setText("此版本存在BUG");

        File file = new File(getExternalCacheDir(), "/patch_signed_7zip.apk");
        if (file.exists()) {
            TinkerInstaller.onReceiveUpgradePatch(getApplicationContext(), file.getAbsolutePath());
        }
    }
}

這里省去了訪問服務器判斷有沒有補丁包和下載的邏輯,簡化為如果/storage/emulated/0/Android/data/tech.gujin.tinkersample/cache目錄下有patch_signed_7zip.apk補丁包就進行更新。

然后編譯一個 release 包,安裝到手機上:

這是一個存在Bug的版本

制作補丁包

修改 TextView 的文字,然后升級下 versionCode 和 versionName,就當是 1.1 版本修復了 1.0 版本的 Bug.
剛才的打包過程會自動將 apk,mapping 和 R 文件復制到tinker-old文件夾中,根據文件名配置下 tinkerOldApkPath、tinkerApplyMappingPath 和 tinkerApplyResourcePath.

然后在 Terminal 輸入 gradlew tinkerPatchRelease,或者在 Gradle projects 中找到相應的 project 運行即可。

tinkerPatchRelease

等運行結束后,補丁包生成在/build/outputs/tinkerPatch目錄下,使用patch_signed_7zip.apk,它是簽名后并使用 7zip 壓縮的補丁包。

到此為止,補丁包就制作好了。

使用補丁

本例中簡化了流程,我直接將補丁放到 /storage/emulated/0/Android/data/tech.gujin.tinkersample/cache目錄。
殺死進程重新打開應用,可以看到打印出 log:

I/Tinker.DefaultTinkerResultService: DefaultTinkerResultService received a result:
                                     PatchResult:
                                     isSuccess:true
                                     rawPatchFilePath:/storage/emulated/0/Android/data/tech.gujin.tinkersample/cache/patch_signed_7zip.apk
                                     costTime:530
                                     patchVersion:a5c8417e691fd9cffe83c11cd0d37eff

然后應用直接退出了,這是因為 tinker 提供的 DefaultTinkerResultService 中,補丁升級成功后會殺死當前進程,可以繼承 DefaultTinkerResultService 實現自己的回調。

再次打開應用可以看到補丁已經生效了:

已修復Bug

至此,tinker 生成及更新補丁包的過程就已經介紹完畢了。
代碼已托管至 Github:GuJin/TinkerSample
謝謝大家。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,002評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,400評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,136評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,714評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,452評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,818評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,812評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,997評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,552評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,292評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,510評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,035評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,721評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,121評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,429評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,235評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,480評論 2 379

推薦閱讀更多精彩內容