提起版本更新,是每個app和開發(fā)者最熟悉的東西,但是頻繁的更新會讓用戶反感,但是不更新的話在發(fā)現(xiàn)了bug怎么辦呢?在用戶體驗和版本穩(wěn)定性的碰撞下,熱修復出來了,熱修復就不用多說了,常見熱修復分為冷啟動修復和實時修復,這里不多介紹,感興趣的朋友可以了解各大平臺的熱修復原理,這次由于公司有用到Bugly的熱修復,所以記錄下來。
1.引入依賴及簽名配置
首先在我們app目錄下的build.gradle文件中引入:
implementation 'com.tencent.bugly:crashreport_upgrade:latest.release'
implementation 'com.tencent.bugly:nativecrashreport:latest.release'
implementation 'com.tencent.tinker:tinker-android-lib:1.9.9'
這里的latest.release代表最新版本的意思,然后我們在Project的build.gradle文件中引入
classpath "com.tencent.bugly:tinker-support:1.1.5"
回到我們app目錄下的build.gradle文件,在頂部加入
apply from: 'tinker-support.gradle'
然后配置好簽名,為什么要配置簽名呢?因為在我們等下自動打包的時候會用上,在app目錄下的build.gradle文件中android節(jié)點下加入
signingConfigs {
release {
keyAlias '簽名文件別名'
keyPassword '密碼'
storeFile file('簽名文件路徑')
storePassword '簽名文件密碼'
}
}
配置好后,我們還要在 buildTypes 的節(jié)點中設置:
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release//在這里設置配置的簽名
}
}
以上我們就完成了自動打包的簽名配置,接下來接入和初始化,需要在清單文件中先配置:
<!--騰訊bugly升級服務start-->
<activity
android:name="com.tencent.bugly.beta.ui.BetaActivity"
android:configChanges="keyboardHidden|orientation|screenSize|locale"
android:theme="@android:style/Theme.Translucent" />
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.fileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
<!--騰訊bugly升級服務end-->
provider文件主要是為了支持andorid N以上訪問共享路徑的文件,如果你的項目中有其他第三方庫也配置了,可以繼承FileProvider類來解決合并沖突的問題:
<provider
android:name="com.tencent.bugly.beta.utils.BuglyFileProvider"
android:authorities="${applicationId}.fileProvider"
android:exported="false"
android:grantUriPermissions="true"
tools:replace="name,authorities,exported,grantUriPermissions">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"
tools:replace="name,resource"/>
</provider>
然后我們需要在res目錄新建xml文件夾,創(chuàng)建provider_paths.xml文件如下:
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<!-- /storage/emulated/0/Download/${applicationId}/.beta/apk-->
<external-path name="beta_external_path" path="Download/"/>
<!--/storage/emulated/0/Android/data/${applicationId}/files/apk/-->
<external-path name="beta_external_files_path" path="Android/data/"/>
</paths>
這樣我們就完事具備,只欠東風,在Application中初始化:
Beta.autoInit = true;
Beta.canShowUpgradeActs.add(MainActivity.class);
Beta.installTinker();
Bugly.init(this, "appId", true);
Beta類作為Bugly的初始化擴展,通過Beta類可以修改升級的檢測時機,界面元素以及自定義升級行為,詳情可以查看官方文檔Beat拓展類,在這里呢,我就不多說了,由于自動檢測更新我覺得有延遲,所以可以在主頁面調(diào)用Beta.checkUpgrade(isManual ,isSilence );方法來檢測更新
參數(shù)1:isManual 用戶手動點擊檢查,非用戶點擊操作請傳false
參數(shù)2:isSilence 是否顯示彈窗等交互,[true:沒有彈窗和toast] [false:有彈窗或toast]
然后打包上傳一氣呵成,這里提交后要稍等幾分鐘才能生效,然后關掉app,打開就會有更新提示了。

更新完成后,到我們的重頭戲熱更了。
2.熱更新配置
首先我們要在app的目錄下創(chuàng)建tinker-support.gradle,然后拷入代碼:
apply plugin: 'com.tencent.bugly.tinker-support'
def bakPath = file("${buildDir}/bakApk/")
/**
* 此處填寫每次構建生成的基準包目錄
*/
def baseApkDir = "app-0523-11-17-07"
/**
* 對于插件各參數(shù)的詳細解析請參考
*/
tinkerSupport {
// 開啟tinker-support插件,默認值true
enable = true
// 指定歸檔目錄,默認值當前module的子目錄tinker
autoBackupApkDir = "${bakPath}"
// 是否啟用覆蓋tinkerPatch配置功能,默認值false
// 開啟后tinkerPatch配置不生效,即無需添加tinkerPatch
overrideTinkerPatchConfiguration = true
// 編譯補丁包時,必需指定基線版本的apk,默認值為空
// 如果為空,則表示不是進行補丁包的編譯
// @{link tinkerPatch.oldApk }
baseApk = "${bakPath}/${baseApkDir}/app-release.apk"
// 對應tinker插件applyMapping
baseApkProguardMapping = "${bakPath}/${baseApkDir}/app-release-mapping.txt"
// 對應tinker插件applyResourceMapping
baseApkResourceMapping = "${bakPath}/${baseApkDir}/app-release-R.txt"
// 構建基準包和補丁包都要指定不同的tinkerId,并且必須保證唯一性
tinkerId = "0.0.39.2-pasth"
//tinkerId = "0.0.39.1-app"
// 構建多渠道補丁時使用
// buildAllFlavorsDir = "${bakPath}/${baseApkDir}"
// 是否啟用加固模式,默認為false.(tinker-spport 1.0.7起支持)
// isProtectedApp = true
// 是否開啟反射Application模式
enableProxyApplication = true
// 是否支持新增非export的Activity(注意:設置為true才能修改AndroidManifest文件)
supportHotplugComponent = true
}
/**
* 一般來說,我們無需對下面的參數(shù)做任何的修改
* 對于各參數(shù)的詳細介紹請參考:
* https://github.com/Tencent/tinker/wiki/Tinker-%E6%8E%A5%E5%85%A5%E6%8C%87%E5%8D%97
*/
tinkerPatch {
//oldApk ="${bakPath}/${appName}/app-release.apk"
ignoreWarning = false
useSign = 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
//tinkerId = "1.0.1-base"
//applyMapping = "${bakPath}/${appName}/app-release-mapping.txt" // 可選,設置mapping文件,建議保持舊apk的proguard混淆方式
//applyResourceMapping = "${bakPath}/${appName}/app-release-R.txt" // 可選,設置R.txt文件,通過舊apk文件保持ResId的分配
}
}
大多數(shù)配置不用修改,在這里注意
baseApkDir
tinkerId
baseApkProguardMapping
這三個參數(shù),第一個呢暫時不用管,是打補丁包時的基準包目錄,第二個時標識符,可以隨意明明,但是注意唯一性,第三個參數(shù)如果項目沒有啟用混淆,可以屏蔽掉,由于我們配置好了簽名,先修改tinkerId的參數(shù),隨意命名(最好用版本號加項目名),然后打開anroid studio的Gradle菜單:

如圖打基準包的箭頭所指,雙擊,等待控制臺日志如下圖:

出現(xiàn)BUILE SUCCESSFUL字樣,表示編譯成功,然后我們在以下目錄可以看到生成的基準包:

基準包有了,我們先修改一下app的內(nèi)容,修改完后,將tinker-support.gradle文件中的baseApkDir修改為編譯生成的基準包的目錄名,如上圖的app-0523-16-28-51,然后記得修改tinkerId,之后點擊Gradle菜單中的buildTinkerPatchRelease,等待日志出現(xiàn)BUILD SUCCESSFUL的字樣,在如下路徑中找到補丁包:

箭頭所指就是我們的補丁包,打工告成,記住,上傳補丁包前請先安裝基準包并打開,否則會報找不到版本的錯誤。

等待十幾分鐘后,重新打開app會發(fā)現(xiàn)修復成功。
總結
熱更新的配置不是很麻煩,熟悉了以后就很快了,關鍵是Bugly生效時間慢,一開始配置成功見沒生效還以為沒弄好,這是個坑,希望能幫到配置Bugly熱更的大家。