Android 騰訊Bugly熱更新接入(Kotlin語言)
文章目錄
簡介
Bugly熱更新是騰訊推出的熱更新框架,熱更新是指無需到應用市場重新下載安裝app,只需要在app內下載補丁包即可實現app的更新,主要用於app的bug修復或者少量改動。
大家在使用app(特別是遊戲app比較常見)的時候應該都有過類似經歷:開啟app時,一個彈框顯示:有新的更新包,點選下載,只需要下載幾百KB或幾兆的補丁包,app就實現了更新,這就是使用的熱更新技術。
Bugly熱更新官方接入文件:https://bugly.qq.com/docs/user-guide/instruction-manual-android-hotfix/?v=20180709165613
一、新增外掛依賴
工程根目錄下“build.gradle”檔案中新增:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath "com.tencent.bugly:tinker-support:1.1.5"
}
}
二、gradle配置
先生成一個jks金鑰,然後在app module的“build.gradle”檔案中新增(示例配置):
android {
defaultConfig {
ndk {
abiFilters 'armeabi'
}
signingConfigs {
release {
storeFile file(jks金鑰庫路徑)
storePassword 金鑰庫密碼
keyAlias 金鑰名
keyPassword 金鑰密碼
}
}
buildTypes {
release {
//應用簽名資訊
signingConfig signingConfigs.release
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
}
dependencies {
implementation 'com.android.support:design:27.1.1'
implementation 'com.android.support:multidex:1.0.3'
implementation 'com.tencent.bugly:crashreport_upgrade:1.3.5'
implementation 'com.tencent.tinker:tinker-android-lib:1.9.6'
implementation 'com.tencent.bugly:nativecrashreport:2.2.0'
}
三、新建tinker-support.gradle
在app module下新建tinker-support.gradle,內容如下:
apply plugin: 'com.tencent.bugly.tinker-support'
def bakPath = file("${buildDir}/bakApk/")
/**
* 此處填寫每次構建生成的基準包目錄
*/
def baseApkDir = "app-1115-15-33-36"
tinkerSupport {
/**構建基準包和補丁包都要指定不同的tinkerId,並且必須保證唯一性 base/patch*/
tinkerId = "base-1.0.0"
autoBackupApkDir = "${bakPath}"
overrideTinkerPatchConfiguration = true
baseApk = "${bakPath}/${baseApkDir}/app-release.apk"
baseApkProguardMapping = "${bakPath}/${baseApkDir}/app-release-mapping.txt"
baseApkResourceMapping = "${bakPath}/${baseApkDir}/app-release-R.txt"
enableProxyApplication = true
supportHotplugComponent = true
}
/**
* 一般來說,我們無需對下面的引數做任何的修改
* 對於各引數的詳細介紹請參考:
* https://github.com/Tencent/tinker/wiki/Tinker-%E6%8E%A5%E5%85%A5%E6%8C%87%E5%8D%97
*/
tinkerPatch {
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"
}
buildConfig {
keepDexApply = false
}
}
建立完成後,在app module中的build.gradle檔案中新增:
apply from: 'tinker-support.gradle'
四、初始化SDK
先在Bugly管理平臺:https://bugly.qq.com/v2/上申請appId,註冊賬戶後登入,點選新建產品:
然後在我的產品–>設定中可以看到appId
新建BaseApplication:
@Suppress("unused")
class BaseApplication : Application(), BetaPatchListener {
override fun onCreate() {
super.onCreate()
/**Bugly管理平臺:https://bugly.qq.com/v2/ */
Bugly.init(this, Bugly管理平臺申請的appId, false)
}
override fun attachBaseContext(base: Context) {
super.attachBaseContext(base)
MultiDex.install(base)
/**安裝tinker*/
Beta.installTinker()
/**設定監聽器,補丁包應用成功後殺程式,重啟app*/
Beta.betaPatchListener = this
}
/**Bugly BetaPatchListener*/
override fun onApplySuccess(p0: String?) {
/**補丁包應用成功回撥,在這裡殺程式,重啟app,完成熱更新。
否則需要等待使用者下次自己主動殺程式重啟後才能完成更新*/
restartApp()
}
override fun onPatchReceived(p0: String?) {
}
override fun onApplyFailure(p0: String?) {
}
override fun onDownloadReceived(p0: Long, p1: Long) {
}
override fun onDownloadSuccess(p0: String?) {
}
override fun onDownloadFailure(p0: String?) {
}
override fun onPatchRollback() {
}
/**
* 殺程式,重啟app
*/
private fun restartApp() {
val intent = Intent(this, MainActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(intent)
android.os.Process.killProcess(android.os.Process.myPid())
}
}
五、AndroidManifest.xml配置
在AndroidMainfest.xml中進行以下配置:
- 許可權配置
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- Activity配置
<activity
android:name="com.tencent.bugly.beta.ui.BetaActivity"
android:configChanges="keyboardHidden|orientation|screenSize|locale"
android:theme="@android:style/Theme.Translucent" />
- 配置FileProvider
先在res目錄新建xml資料夾,建立provider_paths.xml檔案如下:
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path
name="beta_external_path"
path="Download/" />
<external-path
name="beta_external_files_path"
path="Android/data/" />
</paths>
在AndroidManifest中配置FileProvider:
<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>
六、混淆配置:
如果開啟了混淆,在proguard-rules.pro檔案中新增以下混淆規則:
# bugly混淆規則
-dontwarn com.tencent.bugly.**
-keep public class com.tencent.bugly.**{*;}
# tinker混淆規則
-dontwarn com.tencent.tinker.**
-keep class com.tencent.tinker.** { *; }
# v4包混淆規則
-keep class android.support.**{*;}
七、生成基準包
我們對基準包和補丁包做一個簡單的測試,在基準包的MainActivity中顯示一個TextView,文字為“基準包”,補丁包中將其顯示文字修改為“補丁包”。
編輯activity_main:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/tv_test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
編輯MainActivity:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
tv_test.text = "基準包"
}
}
執行app,顯示如下:
執行成功後,在Bugly管理後臺的我的產品–>版本管理介面可以看到如下顯示:
生成基準包:
點選圖示位置的assembleRelease,生成基準包,完成後在下圖位置可以看到app_release.apk
在手機聯網狀態下,安裝此基準包,否則上傳補丁包時會報錯:“未匹配到可應用補丁包的App版本,請確認補丁包的基線版本是否配置正確”
八、生成補丁包
修改MainActivity中的程式碼:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
tv_test.text = "補丁包"
}
}
生成補丁包:
1.先將tinker-support.gradle中的baseApkDir修改為第七步生成的apk資料夾名
2.再將tinkerId修改為patch-1.0.0
3.然後點選下圖位置的buildTinkerPatchRelease生成補丁包
生成的補丁包在這裡:
這裡注意路徑不要找錯了,是patch/release資料夾下的patch_signed_7zip.apk,而不是apk/tinkerPatch/release資料夾下的patch_signed_7zip.apk,如果上傳apk資料夾下的補丁包,Bugly管理平臺會報錯:“上傳失敗!補丁檔案缺失必需欄位:Created-Time、Created-By、YaPatchType、VersionName、VersionCode、From、To,請檢查補丁檔案後重試!”
九、上傳補丁包,見證熱更新
在Bugly管理後臺的 應用升級 --> 熱更新 中,點選發布新補丁:
上傳patch/release資料夾下的patch_signed_7zip.apk:
上傳成功後,顯示如下:
然後我們靜靜等待熱更新生效,生效時間大概十分鐘,生效之後顯示如下:
以上,就是Bugly熱更新的接入。
相關文章
- 熱更新語言--lua學習筆記筆記
- Android接入騰訊廣告平臺廣點通Android
- Android 接入騰訊IM即時通訊(詳細圖文)Android
- Android開發基礎08-掌握kotlin語言AndroidKotlin
- Kotlin-first - 谷歌宣佈Kotlin成為Android開發首選語言Kotlin谷歌Android
- Android Studio 3.0更新:Kotlin正式可用AndroidKotlin
- 騰訊互動白板+即時通訊+實時音視訊,Android學生端接入Android
- Android如何在kotlin中進行函數語言程式設計?kotlin版本原始碼解析AndroidKotlin函數程式設計原始碼
- Android熱更新實現方式Android
- Android開發框架Collection-kotlin(更新篇)Android框架Kotlin
- Android 開發學習程式0.28 騰訊TBS接入和相關問題Android
- Android-貪吃蛇小遊戲-分析與實現-Kotlin語言描述Android遊戲Kotlin
- Flutter Android 端熱修復(熱更新)實踐FlutterAndroid
- Android端Flutter熱更新,相容FlutterBoostAndroidFlutter
- 驗證碼簡訊 API 接入指南:Java 語言示例程式碼APIJava
- Android 音視訊入門:C語言基礎AndroidC語言
- 2022 年程式語言趨勢:Swift、Kotlin 熱度持續增長,收入最高的 5 種程式語言竟是它們SwiftKotlin
- 騰訊雲 圖形驗證碼接入
- 使用 Kotlin 語言開發 NeoForge 模組Kotlin
- [Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)Android元件化Kotlin
- Go語言將支援AndroidGoAndroid
- Android AppLinks 接入AndroidAPP
- Flutter 使用 bugly 進行異常上報與熱修復Flutter
- Android技術分享| Bugly 應用升級自定義UIAndroidUI
- PYPL 6月程式語言排行:Kotlin與PHP亮了KotlinPHP
- 哪種程式語言最熱門?
- C#語言————第二章 C#語言快速熱身C#
- 日均350000億接入量,騰訊TubeMQ效能超過KafkaMQKafka
- 使用Kotlin語言兩年後,我有話要說Kotlin
- 【Android】 Android使用Java 8 語言功能注意事項AndroidJava
- 從ClassLoader到Android外掛化以及熱更新原理Android
- android kotlin 安全除法AndroidKotlin
- Kotlin 程式語言詳解:特點、應用領域及語法教程Kotlin
- .NET 團隊 更新了 .NET 語言策略
- 騰訊直播SDK接入及封裝(一)之錄屏直播封裝
- Android工程接入UnityLibrary工程AndroidUnity
- 與Android熱更新方案Amigo的初次接觸AndroidGo
- 與Android熱更新方案Amigo的親密接觸AndroidGo