雖然現在熱修復到處都是,這裏還是記錄一下當時怎麼做的,反正當時問題多很,這裏重抄一遍。
不管怎麼看教程,先看官網纔是重要的。
先註冊賬戶,申請一個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,準備測試
繼續走起:
這裏經常會出現問題:
比如:什麼找不到文件啊
這裏列出幾個別人的
這兩個基本能找到解決 的方法,這個不是熱修改不是即時的,可能需要時間。
這裏把遇到的問題截圖看看