天天看點

Android 微信熱更新檔Tinker -- 項目內建

在上篇文章Android熱更新檔方案中介紹了Tinker的原理架構,那麼我們現在就從初級入門開始,學習一下它的項目內建,首先,我們來看看它官方Demo的使用,體驗一下熱修複。

體驗官方Demo

步驟:

  • 下載下傳 Sample

    打開Tinker開源代碼位址Tinker,把 Tinker 項目下載下傳到本地後,使用 AS 導入項目

    tinker-sample-android

  • 設定 tinkerId

    打開 app 的 build.gradle檔案,找到

    getTinkerIdValue()

    方法中:TINKER_ID :

    gitSha()

    ,将

    gitSha()

    替換成自己想要的 tinkerId 命名規則;
  • 編譯 Base APK

    編譯打包,此時 Tinker 會在工程的

    app/build/bakApk/

    目錄下儲存打包好的apk檔案,先在手機上安裝該 apk ;
  • 設定Base APK路徑

    找到剛才生成的 apk 檔案,複制其完整檔案名,在 app 的 build.gradle 檔案,設定:

    tinkerOldApkPath = "${bakPath}/<剛才生成的apk檔案名>"

  • 修複 Bug

    在 Base Apk的代碼基礎上修改代碼修複 Bug;

  • 生成更新檔

    找到 Gradle 腳本中的tinker目錄下

    tinkerPatchDebug

    輕按兩下運作它将生成 debug 版的 patch (更新檔) apk 檔案,在 output/tinkerPatch/debug 下,檔案為

    patch_signed_7zip.apk

  • 打入更新檔

    patch_signed_7zip.apk

    這個檔案拷貝到 Android 裝置的

    ExternalStorageDirectory()

    路徑下.檔案的路徑可以随意設定,隻需在

    MainActivity

    中指明更新檔 Apk 路徑即可;随後點選 Demo 中 Load Patch 按鈕,提示成功後,點選 Kill Self 結束目前程序,重新開機應用,即可看到所改的代碼修複的 Bug 現象。

##項目內建

###步驟:

(1) 在項目的 build.gradle 中,添加

tinker-patch-gradle-plugin

的依賴;

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

TINKER_VERSION 可以在項目 properties 中配置。

(2) 在 app 的 gradle 檔案

app/build.gradle

,我們需要添加 Tinker 的庫依賴以及 apply tinke r的 gradle 插件;

dependencies {
    // tinker 熱修複導入
    compile('com.tencent.tinker:tinker-android-lib:${TINKER_VERSION}') { changing = true }
    compile('com.tencent.tinker:tinker-android-anno:${TINKER_VERSION}') { changing = true }
    // 多dex支援
    compile 'com.android.support:multidex:1.0.1'
}

// apply tinker插件
apply plugin: 'com.tencent.tinker.patch' 
           

(3) 參照官方 Sample 工程,把 gradle 檔案中剩下的拷貝進來(需要的考,已有的不需要考);

在這裡,我們可以定制一些自己的配置,比如 Tinkerid、PatchVersion 等,并且記得修改

buildWithTinker()

中 dex 的 loader 修改成自己的 Application 名。

def createTinkerId(){
    return YourTinkerID;
}

def createPatchVersion(){
    return YourPatchVersion;
}
           

有些具體的gradle配置的參數,大家可以參考Tinker介入指南中的表格,要是你英語夠好的話,可以去看sample中的app/build.gradle的英文介紹。

(4) 拷貝官方 Sample 項目中的檔案并配置;

  • 拷貝 keyStore 檔案夾;
  • 拷貝 keep_in_main_dex.txt 混淆檔案且自定義其中的application,并在 proguard-rules 混淆檔案加入保護:

    -keepattributes SourceFile,LineNumberTable

  • 拷貝 java 檔案,并作适當修改,如修改檔案名、在 service 的 onPatchResult 函數中加入自己的邏輯

(5) 配置ApplicationLike代理

XXApplicationLike.java

中的注解包名,用于自動生成 Applicaion,并在 Menifest 中給 Application 節點設定 name ,指向自動生成的 Application:

-public class YourApplication extends Application {
 +public class YourApplicationLike extends DefaultApplicationLike {
           

同時我們需要将 gradle 的 dex loader 中的 Application 改為新的 YourApplication:

dex {
    loader = ["com.tencent.tinker.loader.*",
        //warning, you must change it with your application
        "tinker.sample.android.YourApplication"
    ]       
}
           

然後配置一下 ApplicationLike 中 Application 以及 Tinker 配置:

@DefaultLifeCycle(
    application = ".SampleApplication",                       //application類名
    flags = ShareConstants.TINKER_ENABLE_ALL,                 //tinkerFlags
    loaderClass = "com.tencent.tinker.loader.TinkerLoader",   //loaderClassName, 這裡使用預設即可!
    loadVerifyFlag = false)                                   //tinkerLoadVerifyFlag
public class SampleApplicationLike extends DefaultApplicationLike {
           

采用 Annotation 生成 Application ,需要将原來的 Application 類删掉。

将原本 Application 中的内容全部拷貝到 ApplicationLike.java 中。

(6) 編譯和更新檔

  • 每次編譯或發包将安裝包與mapping檔案備份;
  • 若有更新檔包的需要,按自身需要修改你的代碼、庫檔案等;
  • 将備份的基準安裝包與mapping檔案輸入到tinkerPatch的配置中;
  • 運作tinkerPatchRelease,即可自動編譯最新的安裝包,并與輸入基準包作差異,得到最終的更新檔包。

在打更新檔時注意gralde中關于路徑的修改:

Android 微信熱更新檔Tinker -- 項目內建
Android 微信熱更新檔Tinker -- 項目內建

##Tinker 接入文檔

  • 如何快速接入請參考Tinker 接入指南;
  • 如何自定義類請參考Tinker 自定義擴充;
  • Tinker的API預覽請參考Tinker API預覽;
  • 其他常見問題,請參考常見問題;