android開發_熱修復

demo地址: https://download.csdn.net/download/android410223sun/11869081(只看代碼,可以粘貼複製就行,不能運行,因爲你可登錄不上我的Tinker賬號哦   - - 。)

最近閒來無事,捉摸了下這個熱修復東西,花了大概一天的時間寫了個demo,然後測試上傳熱修復補丁,success!記錄一下。

本人用的是微信開源的tinker,所以下面全是關於它的:

第一步:去tinker官網(http://www.tinkerpatch.com)註冊個appkey  然後新建個項目   版本號跟應用名字最好跟你app內設置的一致。

patch版本:4   說明我已經上傳了四個測試補丁。(如果你同時下發新舊好幾個補丁,那麼沒用接收到舊補丁的設備就會直接安裝最新的補丁)

現在已經有appkey跟版本號了。開始進入as:

在項目的根build.gradle的dependencies 中添加如下代碼:

dependencies {
    // TinkerPatch 插件
    classpath "com.tinkerpatch.sdk:tinkerpatch-gradle-plugin:1.1.8"
    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files
}

在app的根build.gradle添加如下代碼:

provided("com.tinkerpatch.tinker:tinker-android-anno:1.9.8")
compile("com.tinkerpatch.sdk:tinkerpatch-android-sdk:1.2.8")

還要在該文件的最下面同時加上  apply from: 'tinkerpatch.gradle'

tinkerpatch.gradle就是我們接下來要創建的tinker配置文件

它在這裏新建:

《-----------------tinkerpatch.gradle全部代碼  start------------------》

apply plugin: 'tinkerpatch-support'

/**
 * TODO: 請按自己的需求修改爲適應自己工程的參數
 */

//基包路徑
def bakPath = file("${buildDir}/bakApk/")
//基包文件夾名(打補丁包的時候,需要修改)
def baseInfo = "app-1.0-1016-10-09-29"  //第一次打基準包的時候  可以這樣寫def baseInfo = " "
////版本名稱
def variantName = "debug"

/**
 * 對於插件各參數的詳細解析請參考
 *
 */
tinkerpatchSupport {
    //可以在debug的時候關閉 tinkerPatch
    tinkerEnable = true
    //是否使用一鍵接入功能 默認爲false  是否反射 Application 實現一鍵接入;
    // 一般來說,接入 Tinker 我們需要改造我們的 Application, 若這裏爲 true, 即我們無需對應用做任何改造即可接入。
    reflectApplication = true
    //將每次編譯產生的 apk/mapping.txt/R.txt 歸檔存儲的位置
    autoBackupApkPath = "${bakPath}"
    appKey = "f956d84445f9xxxx"// 注意!!!!!!!!!  需要修改成你的appkey   appkey只跟線上的版本號(appVersion )有關係

    /** 注意: 若發佈新的全量包, appVersion一定要更新 **/
    appVersion = "1.0"    //這個對應的就是tinker平臺上的版本    該版本的補丁只能給該版本提供線上熱修復!


    def pathPrefix = "${bakPath}/${baseInfo}/${variantName}/"

    def name = "${project.name}-${variantName}"
    /**
     * 基準包的文件路徑, 對應 tinker 插件中的 oldApk 參數;編譯補丁包時,
     * 必需指定基準版本的 apk,默認值爲空,則表示不是進行補丁包的編譯
     */
    baseApkFile = "${pathPrefix}/${name}.apk"

    /**
     * 基準包的 Proguard mapping.txt 文件路徑, 對應 tinker 插件 applyMapping 參數;在編譯新的 apk 時候,
     * 我們希望通過保持基準 apk 的 proguard 混淆方式,
     * 從而減少補丁包的大小。這是強烈推薦的,編譯補丁包時,我們推薦輸入基準 apk 生成的 mapping.txt 文件。
     */
    baseProguardMappingFile = "${pathPrefix}/${name}-mapping.txt"
    /**
     * 基準包的資源 R.txt 文件路徑, 對應 tinker 插件 applyResourceMapping 參數;在編譯新的apk時候,
     * 我們希望通基準 apk 的 R.txt 文件來保持 Resource Id 的分配,這樣不僅可以減少補丁包的大小,
     * 同時也避免由於 Resource Id 改變導致 remote view 異常
     */
    baseResourceRFile = "${pathPrefix}/${name}-R.txt"
    /**
     *  若有編譯多flavors需求, 可以參照: https://github.com/TinkerPatch/tinkerpatch-flavors-sample
     *  注意: 除非你不同的flavor代碼是不一樣的,不然建議採用zip comment或者文件方式生成渠道信息(相關工具:walle 或者 packer-ng)
     **/

}

/**
 * 用於用戶在代碼中判斷tinkerPatch是否被使能
 */
android {
    defaultConfig {
        buildConfigField "boolean", "TINKER_ENABLE", "${tinkerpatchSupport.tinkerEnable}"

    }
}
/**
 * 一般來說,我們無需對下面的參數做任何的修改
 * 對於各參數的詳細介紹請參考:
 * https://github.com/Tencent/tinker/wiki/Tinker-%E6%8E%A5%E5%85%A5%E6%8C%87%E5%8D%97
 */
tinkerPatch {
    ignoreWarning = false
    useSign = true  //是否需要簽名,打正式包如果這裏是true,則要配置簽名,否則會編譯不過去
    dex {
        dexMode = "jar"
        pattern = ["classes*.dex"]
        loader = []

    }
    lib {
        pattern = ["lib/*/*.so"]

    }

    res {
        pattern = ["res/*", "r/*", "assets/*", "resources.arsc", "AndroidManifest.xml"]
        ignoreChange = []
        largeModSize = 100

    }
    packageConfig {

    }
    sevenZip {
        zipArtifact = "com.tencent.mm:SevenZip:1.1.10"
        //        path = "/usr/local/bin/7za"

    }
    buildConfig {
        keepDexApply = false

    }

}

《-----------------tinkerpatch.gradle全部代碼  end------------------》

注:tinkerpatch.gradle這些代碼你要注意的就是appVersion 跟 appKey   還有baseInfo   這三個參數   ,appVersion 跟appKey   前面已經說過了,baseInfo   的參數是打補丁包的時候需要用到的,後面會說,第一次打基準包的話就啥都不填。

開始初始化tinker:

public class MyAppApplication extends MultiDexApplication {


    @Override
    public void onCreate() {
        super.onCreate();


        // 我們可以從這裏獲得Tinker加載過程的信息
        ApplicationLike  tinkerApplicationLike = TinkerPatchApplicationLike.getTinkerPatchApplicationLike();

        // 初始化TinkerPatch SDK, 更多配置可參照API章節中的,初始化SDK
        TinkerPatch.init(tinkerApplicationLike)
                .reflectPatchLibrary()
                .setPatchRollbackOnScreenOff(true)
                .setPatchRestartOnSrceenOff(true);

        TinkerPatch.with().fetchPatchUpdate(true);// 實時訪問後臺時候有更新,通過handler實現輪訓的效果
        // 每隔3個小時去訪問後臺時候有更新,通過handler實現輪訓的效果
//        new FetchPatchHandler().fetchPatchWithInterval(1);
    }
    @Override
    public void onTerminate() { // 程序終止的時候執行
        super.onTerminate();
        Log.e("kill","killed");
    }
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }

}

現在代碼上就over了;

開始打基準包:(注:因爲是測試 所以我下面打得都是debug的補丁跟基準包,發佈線上的話就選擇release的按鈕)

然後bulid完成後在下面這裏就會出現個apk文件:

這個apk文件就是你這次打出的基準包,現在你可以把它發送到到一臺設備上進行安裝,紅圈圈起得那個文件夾名字(圈起來重點)打補丁要用到;

隨便修改下你項目裏的代碼,佈局,吐司之類的隨便,就是爲了方便看到補丁修上去了而已!

現在開始打補丁;修改tinkerpatch.gradle中的baseInfo 爲上面紅圈圈起來的名字,最好複製進去,比較長……

點擊:

build完成後會生成

這個_7zip結尾的文件就是你這次打出的補丁。

然後把這個上傳到我們剛開始在tinker平臺中新建的項目中,點擊發布補丁,大概5分鐘左右吧,重啓打開app,就會發現新修改的東西顯示出來了。

就此結束。

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