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,就會發現新修改的東西顯示出來了。
就此結束。