Android tinker熱修復

雖然現在熱修復到處都是,這裏還是記錄一下當時怎麼做的,反正當時問題多很,這裏重抄一遍。

不管怎麼看教程,先看官網纔是重要的。

註冊 TinkerPatch 平臺

先註冊賬戶,申請一個key值;

然後是添加依賴,

先在項目裏面添加gradle 遠程倉庫依賴 jcenter

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        // TinkerPatch 插件
        classpath "com.tinkerpatch.sdk:tinkerpatch-gradle-plugin:1.2.14.4"
    }
}

再app 裏面集成 TinkerPatch SDK

dependencies {
    // 若使用annotation需要單獨引用,對於tinker的其他庫都無需再引用
    provided("com.tinkerpatch.tinker:tinker-android-anno:1.9.14.4")
    compile("com.tinkerpatch.sdk:tinkerpatch-android-sdk:1.2.14.4")
}

然後自己寫個gradle文件來專門集成tinker的,爲了方便

apply from: 'tinkerpatch.gradle'

再裏面引用:

tinkerpatchSupport {
    /** 可以在debug的時候關閉 tinkerPatch **/
    tinkerEnable = true

    /** 是否使用一鍵接入功能  **/
    reflectApplication = true

    /** 是否開啓加固模式,只有在使用加固時才能開啓此開關 **/
    protectedApp = false

    /** 補丁是否支持新增 Activity (exported必須爲false)**/
    supportComponent = false

    autoBackupApkPath = "${bakPath}"

    /** 在tinkerpatch.com得到的appKey **/
    appKey = "yourAppKey"
    /** 注意: 若發佈新的全量包, appVersion一定要更新 **/
    appVersion = "1.0.0"

    def pathPrefix = "${bakPath}/${baseInfo}/${variantName}/"
    def name = "${project.name}-${variantName}"

    baseApkFile = "${pathPrefix}/${name}.apk"
    baseProguardMappingFile = "${pathPrefix}/${name}-mapping.txt"
    baseResourceRFile = "${pathPrefix}/${name}-R.txt"
}

這都是官網 的

從百度抄的

apply plugin: 'tinkerpatch-support'

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

//基包路徑
def bakPath = file("${buildDir}/bakApk/")
//基包文件夾名(打補丁包的時候,需要修改)
def baseInfo = "app-1.1.0-1211-11-54-05"
//版本名稱
def variantName = "release"

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

    /** 注意: 若發佈新的全量包, appVersion一定要更新 **/
    appVersion = "1.1.0"

    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
    }
}

這樣基本可以使用了,

先打包基礎包

這裏打dug包應該不會有問題,我這裏沒有dug包,是因爲沒有打dug包,打的是正式包,但是安裝的時候會出現問題,提示有危險,因爲沒有簽名,簽名就好了。需要再app  gradle裏面修改

android {
    compileSdkVersion 29
    buildToolsVersion "29.0.0"
    defaultConfig {
        applicationId "com.woyl.hotfixapplication"
        minSdkVersion 15
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        //添加如下配置就OK了,這裏可能會出錯,具體什麼忘了
        javaCompileOptions { annotationProcessorOptions { includeCompileClasspath = true } }
    }
    // 簽名配置【buildTypes中調用了signingConfigs,則signingConfigs{}要置於buildTypes{}前面】
    signingConfigs {
        release {
            try {
                storeFile file("E:/2019/hot_fix_jianmin/fix.jks")
                storePassword "123456"
                keyAlias "fix"
                keyPassword "123456"
            } catch (ex) {
                throw new InvalidUserDataException(ex.toString())
            }
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
        debug {
            signingConfig signingConfigs.debug
        }
    }
}

這樣好了。

再自己的手機上安裝一個app,準備測試

繼續走起:

這裏經常會出現問題:

比如:什麼找不到文件啊

這裏列出幾個別人的

Tinker熱修復遇到的坑

Tinker 常見問題

這兩個基本能找到解決 的方法,這個不是熱修改不是即時的,可能需要時間。

這裏把遇到的問題截圖看看

 

發佈了117 篇原創文章 · 獲贊 51 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章