對於原有app集成tinker,仍是比較簡單的,根據tinker上的wiki的指示操做便可。
具體步驟以下:java
buildscript {
dependencies {
classpath 'com.tencent.tinker:tinker-patch-gradle-plugin:1.7.9'
}
}複製代碼
dependencies {
//可選,用於生成application類
provided 'com.tencent.tinker:tinker-android-anno:1.7.9'
//tinker的核心庫
compile 'com.tencent.tinker:tinker-android-lib:1.7.9'
}
...
...
//apply tinker插件
apply plugin: 'com.tencent.tinker.patch'複製代碼
dexOptions {
jumboMode = true
}複製代碼
tinker的最佳實踐,防止因爲字符串增多致使force-jumbol,致使更多的變動最後能夠把tinker相關的代碼挪動到tinkerpatch.gradle中android
改造SampleApplication,經過SampleApplicationLike代理SampleApplication的行爲。具體能夠看wiki和SampleApplication相關的改動能夠參考 TinkerDemogit
從1.7.8開始,tinker又支持加固了,只須要修改tinkerpatch.gradle中的這部分github
buildConfig {
applyMapping = getApplyMappingPath()
applyResourceMapping = getApplyResourceMappingPath()
tinkerId = getTinkerIdValue()
keepDexApply = false
isProtectedApp = true //開啓加固
}複製代碼
patchsdk 使用的是 github.com/baidao/tink…步驟以下api
repositories {
jcenter()
}
dependencies {
...
compile 'com.dx168.patchsdk:patchsdk:1.1.3'
}複製代碼
使用ApplicationLike代理原來的Applicationbash
@SuppressWarnings("unused")
@DefaultLifeCycle(application = "com.dx168.patchsdk.sample.MyApplication",
flags = ShareConstants.TINKER_ENABLE_ALL,
loadVerifyFlag = false)
public class MyApplicationLike extends TinkerApplicationLike {
public MyApplicationLike(Application application, int tinkerFlags, boolean tinkerLoadVerifyFlag, long applicationStartElapsedTime, long applicationStartMillisTime, Intent tinkerResultIntent) {
super(application, tinkerFlags, tinkerLoadVerifyFlag, applicationStartElapsedTime, applicationStartMillisTime, tinkerResultIntent);
}
@Override
public void onCreate() {
super.onCreate();
String appId = "20170112162040035-6936";
String appSecret = "d978d00c0c1344959afa9d0a39d7dab3";
PatchManager.getInstance().init(getApplication(), "http://xxx.xxx.xxx/hotfix-apis/", appId, appSecret, new ActualPatchManager() {
@Override
public void cleanPatch(Context context) {
TinkerInstaller.cleanPatch(context);
}
@Override
public void patch(Context context, String patchPath) {
TinkerInstaller.onReceiveUpgradePatch(context, patchPath);
}
});
PatchManager.getInstance().register(new Listener() {
...
});
PatchManager.getInstance().setTag("your tag");
PatchManager.getInstance().setChannel("");
PatchManager.getInstance().queryAndPatch();
}
}複製代碼
對於渠道包,若是不是須要使用熱修復,那麼怎麼生成渠道包均可以的。
對於flavor編譯渠道包,會致使不一樣的渠道包因爲BuildConfig變化致使classes.dex差別,這種方案是不可取的。
將渠道信息寫在apk文件的zip comment中,是很是推薦的,例如可使用項目packer-ng-plugin或者可以使用V2 Scheme的walle, 也包括最新出來的多渠道打包神器ApkChannelPackage,說一下區別,若是要使用熱修復的話,對於不須要加固的app,那麼生成渠道包,這三種方案均可以採用;對於要加固的app,只能採用ApkChannelPackage這種方案中的根據已有APK生成渠道包(若是有其餘的方案,請記得告訴我)。這篇文章對多渠道打包工具對比作了詳細的區分。目前採用的也是ApkChannelPackage方案。微信
以TinkerDemo爲例app
根據生成補丁的若干步驟,來測試補丁包是否有效,在第三步生成渠道包後,安裝其中的一個渠道apk到手機上,而後呢,我這邊是經過補丁管理後臺上傳的補丁,而後客戶端pull補丁,根據log,能夠清晰的看到補丁是否下載完成,是否有效。下載完補丁後,會進行dex合成。而後在後臺或者屏幕關閉後app會被殺死,重啓後補丁纔會生效,這個時候咱們才真正修復了問題。ide
博客地址:工具
若是你以爲此文對您有所幫助,歡迎入羣 QQ交流羣 :232203809
微信公衆號:終端研發部