公司原先的業務本身不需要熱更新的植入,但是最近業務發散了很多,所以還是早點接入吧,總比望bug興嘆要好點,
更何況為了自己的KPI,經過兩天的探索,踩了各種小坑,然后就梭進去了,下面做個記錄,
更加詳細的可以參見官方的檔案 Bugly Android熱更新使用指南,另外就是再加入的時候一定要按照步驟來,不要
前后顛倒或者自己覺得什么樣更好,到時候出一些奇怪的錯誤,也是不好找,下面簡單介紹一下,集成的步驟,以及示例
代碼,
第一,添加依賴,專案的根目錄哈,對于這個配置,建議直接下載官方給提供的示例,然后從示例上拷貝,檔案上偏舊一些,
bugly官方github示例
// tinkersupport插件(1.0.3以上無須再配置tinker插件)
classpath "com.tencent.bugly:tinker-support:1.2.0"
第二,在Moudle中集成SDK
android {
defaultConfig {
ndk {
//設定支持的SO庫架構
abiFilters 'armeabi' //, 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a'
}
}
}
dependencies {
compile "com.android.support:multidex:1.0.3" // 多dex配置
//注釋掉原有bugly的倉庫
//compile 'com.tencent.bugly:crashreport:latest.release'//其中latest.release指代最新版本號,也可以指定明確的版本號,例如1.3.4
compile 'com.tencent.bugly:crashreport_upgrade:1.3.8'
// 指定tinker依賴版本(注:應用升級1.3.5版本起,不再內置tinker)
compile 'com.tencent.tinker:tinker-android-lib:1.9.14'
compile 'com.tencent.bugly:nativecrashreport:latest.release' //其中latest.release指代最新版本號,也可以指定明確的版本號,例如2.2.0
}
同時在在app module的“build.gradle”檔案中添加插件
apply from: 'tinker-support.gradle'
第三,app module的“build.gradle”的同等級目錄下,新建tinker-support.gradle,這個建議,直接copy官方例子的,不要自己搞,下邊是根據自己需要改,基本 與官方的沒有差別
apply plugin: 'com.tencent.bugly.tinker-support'
def bakPath = file("${buildDir}/bakApk/")
/**
* 此處填寫每次構建生成的基準包目錄
*/
def baseApkDir = "app-1204-17-26-16"
/**
* 對于插件各引數的詳細決議請參考,如果沒有特殊需求下面的引數都可以不用更改;如果apk需要加固等可以參考具體描述設定引數
*/
tinkerSupport {
// 開啟tinker-support插件,默認值true
enable = true
// 指定歸檔目錄,默認值當前module的子目錄tinker
autoBackupApkDir = "${bakPath}"
//建議設定true,用戶就不用再自己管理tinkerId的命名,插件會為每一次構建的base包自動生成唯一的tinkerId,默認命名規則是versionname.versioncode_時間戳
//具體參考https://github.com/BuglyDevTeam/Bugly-Android-Demo/wiki/Tinker-ID%E8%AF%A5%E6%80%8E%E4%B9%88%E8%AE%BE%E7%BD%AE
autoGenerateTinkerId = true
//tinkerId必須保證唯一性,如果兩個base包的tinkerid是一樣的,并且都聯網激活了,那么后續補丁上傳到后臺的時候會出現匹配錯誤
tinkerId = "if autoGenerateTinkerId=true ,no need set here"
// 是否啟用覆寫tinkerPatch配置功能,默認值false
// 開啟后tinkerPatch配置不生效,即無需添加tinkerPatch
overrideTinkerPatchConfiguration = true
// 編譯補丁包時,必需指定基線版本的apk,默認值為空
// 如果為空,則表示不是進行補丁包的編譯
// @{link tinkerPatch.oldApk }
baseApk = "${bakPath}/${baseApkDir}/app-debug.apk"
// 對應tinker插件applyMapping
baseApkProguardMapping = "${bakPath}/${baseApkDir}/app-release-mapping.txt"
// 對應tinker插件applyResourceMapping
baseApkResourceMapping = "${bakPath}/${baseApkDir}/app-debug-R.txt"
// buildAllFlavorsDir = "${bakPath}/${baseApkDir}"
// 是否開啟加固模式,默認為false
isProtectedApp = false
enableProxyApplication = true
supportHotplugComponent = true
}
/**
* 一般來說,我們無需對下面的引數做任何的修改
* 對于各引數的詳細介紹請參考:
* https://github.com/Tencent/tinker/wiki/Tinker-%E6%8E%A5%E5%85%A5%E6%8C%87%E5%8D%97
*/
tinkerPatch {
//oldApk ="${bakPath}/${appName}/app-debug.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-patch"
//applyMapping = "${bakPath}/${appName}/app-debug-mapping.txt" // 可選,設定mapping檔案,建議保持舊apk的proguard混淆方式
//applyResourceMapping = "${bakPath}/${appName}/app-debug-R.txt" // 可選,設定R.txt檔案,通過舊apk檔案保持ResId的分配
}
}
第四,修改自己的Application,初始化SDK,這個步驟看自己專案的情況了,二選一 ,下面是官方的一些介紹
enableProxyApplication = false 的情況
這是Tinker推薦的接入方式,一定程度上會增加接入成本,但具有更好的兼容性,
集成Bugly升級SDK之后,我們需要按照以下方式自定義ApplicationLike來實作Application的代碼(以下是示例):
自定義Application
public class SampleApplication extends TinkerApplication {
public SampleApplication() {
super(ShareConstants.TINKER_ENABLE_ALL, "xxx.xxx.SampleApplicationLike",
"com.tencent.tinker.loader.TinkerLoader", false);
}
}
注意:這個類集成TinkerApplication類,這里面不做任何操作,所有Application的代碼都會放到ApplicationLike繼承類當中
引數決議
引數1:tinkerFlags 表示Tinker支持的型別 dex only、library only or all suuport,default: TINKER_ENABLE_ALL
引數2:delegateClassName Application代理類 這里填寫你自定義的ApplicationLike
引數3:loaderClassName Tinker的加載器,使用默認即可
引數4:tinkerLoadVerifyFlag 加載dex或者lib是否驗證md5,默認為false
我們需要您將以前的Applicaton配置為繼承TinkerApplication的類:

自定義ApplicationLike
public class SampleApplicationLike extends DefaultApplicationLike {
public static final String TAG = "Tinker.SampleApplicationLike";
public SampleApplicationLike(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();
// 這里實作SDK初始化,appId替換成你的在Bugly平臺申請的appId
// 除錯時,將第三個引數改為true
Bugly.init(getApplication(), "900029763", false);
}
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
@Override
public void onBaseContextAttached(Context base) {
super.onBaseContextAttached(base);
// you must install multiDex whatever tinker is installed!
MultiDex.install(base);
// 安裝tinker
// TinkerManager.installTinker(this); 替換成下面Bugly提供的方法
Beta.installTinker(this);
}
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
public void registerActivityLifecycleCallback(Application.ActivityLifecycleCallbacks callbacks) {
getApplication().registerActivityLifecycleCallbacks(callbacks);
}
}
注意:tinker需要你開啟MultiDex,你需要在dependencies中進行配置
compile "com.android.support:multidex:1.0.1"才可以使用MultiDex.install方法; SampleApplicationLike這個類是Application的代理類,以前所有在Application的實作必須要全部拷貝到這里,在onCreate方法呼叫SDK的初始化方法,在onBaseContextAttached中呼叫Beta.installTinker(this);,
enableProxyApplication = true 的情況
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// 這里實作SDK初始化,appId替換成你的在Bugly平臺申請的appId
// 除錯時,將第三個引數改為true
Bugly.init(this, "900029763", false);
}
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
// you must install multiDex whatever tinker is installed!
MultiDex.install(base);
// 安裝tinker
Beta.installTinker();
}
}
第五,按照官方的要求,加入一些權限配置以及混淆配置的什么的,還是建議直接copy官方demo
在AndroidMainfest.xml中進行以下配置:
1. 權限配置
<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" />
2. Activity配置
<activity
android:name="com.tencent.bugly.beta.ui.BetaActivity"
android:configChanges="keyboardHidden|orientation|screenSize|locale"
android:theme="@android:style/Theme.Translucent" />
3. 配置FileProvider
注意:如果您想兼容Android N或者以上的設備,必須要在AndroidManifest.xml檔案中配置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>
如果你使用的第三方庫也配置了同樣的FileProvider, 可以通過繼承FileProvider類來解決合并沖突的問題,示例如下:
<provider
android:name=".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>
這里要注意一下,FileProvider類是在support-v4包中的,檢查你的工程是否引入該類別庫,
在res目錄新建xml檔案夾,創建provider_paths.xml檔案如下:
<?xml version="1.0" encoding="utf-8"?>
<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>
這里配置的兩個外部存盤路徑是升級SDK下載的檔案可能存在的路徑,一定要按照上面格式配置,不然可能會出現錯誤,
注:1.3.1及以上版本,可以不用進行以上配置,aar已經在AndroidManifest配置了,并且包含了對應的資源檔案,
混淆配置
為了避免混淆SDK,在Proguard混淆檔案中增加以下配置:
-dontwarn com.tencent.bugly.**
-keep public class com.tencent.bugly.**{*;}
# tinker混淆規則
-dontwarn com.tencent.tinker.**
-keep class com.tencent.tinker.** { *; }
如果你使用了support-v4包,你還需要配置以下混淆規則:
?-keep class android.support.**{*;}
第六,到這一步配置方面可以說搞完了,下面就是根據自己的業務需求來操作,先生成基準包,然后出現了問題,根據基本包目錄,去生成補丁包,
下面簡單的說一下測驗的步驟,因為新版本的studio跟檔案上有點不太一樣,所以做下記錄,
在新版的studio里面,進行基準包操作的腳本在other里面,直接build生成的話,會出現一些奇怪的問題

這個如果線上發布的基本包出問題了,先修改代碼,填寫基本包的目錄,忘記提了打完基本包治好記得一定要備份,防止因為clean或者其他原因導致丟失或者損壞,
上個圖中的baseApkDir就是基本包的目錄,就是你要對哪個包打補丁做修正,記得填寫哪個,所以說備份很重要哈,

打完path包之后,會在bulid的目錄下邊,生成對應的檔案包,這個后綴為7zip的就是咱要在平臺上上傳的補丁包,

之后,就是登陸自己的平臺,去做補丁包的上傳和分發,一次完整的接入程序, 也就OK了,最后再次提醒,一定按照步驟來
如果出現一些比較奇怪的問題,這個時候,可以去檢查步驟或者配置,肯定是有些細節沒改對,整體難度不大,基本一遍成,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/230746.html
標籤:其他
上一篇:播放yuv資料
