五、編寫Application 的代理類
Tinker 表示,Application 無法動態修復,所以有兩種選擇:
1.使用「繼承TinkerApplication + DefaultApplicationLike」。
2.使用「DefaultLifeCycle 注解+ DefaultApplicationLike」。
當然,如果你覺得你自定義的Application 不會用到熱修復,可無視這部分; 但下方代碼中的initTinker()方法記得要拷貝到你項目中,用于初始化Tinker。
第1 種方式感覺比較雞肋,這里使用第2 種(Tinker 官方推薦的方式):
「DefaultLifeCycle 注解+ TinkerApplicationLike」,DefaultLifeCycle 注解生成Application,下面就來編寫Application 的代理類:
1、編寫TinkerApplicationLike
將下方的代碼拷貝到項目中,注釋簡單明了,不多解釋:
```
@SuppressWarnings("unused")
@DefaultLifeCycle(application = "com.lqr.tinker.MyApplication",// application 類名。只能用字
符串,這個MyApplication 文件是不存在的,但可以在AndroidManifest.xml 的application 標簽上
使用(name)
flags = ShareConstants.TINKER_ENABLE_ALL,// tinkerFlags
loaderClass = "com.tencent.tinker.loader.TinkerLoader",//loaderClassName, 我們這里
使用默認即可!(可不寫)
loadVerifyFlag = false)//tinkerLoadVerifyFlag
public class TinkerApplicationLike extends DefaultApplicationLike {
private Application mApplication;
private Context mContext;
private Tinker mTinker;
// 固定寫法
public TinkerApplicationLike(Application application, int tinkerFlags, boolean
tinkerLoadVerifyFlag, long applicationStartElapsedTime, long applicationStartMillisTime,
Intent tinkerResultIntent) {
super(application, tinkerFlags, tinkerLoadVerifyFlag, applicationStartElapsedTime,
applicationStartMillisTime, tinkerResultIntent);
}
// 固定寫法
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
public void registerActivityLifecycleCallbacks(Application.ActivityLifecycleCallbacks
callback) {
getApplication().registerActivityLifecycleCallbacks(callback);
}
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
@Override
public void onBaseContextAttached(Context base) {
super.onBaseContextAttached(base);
mApplication = getApplication();
mContext = getApplication();
initTinker(base);
// 可以將之前自定義的Application 中onCreate()方法所執行的操作搬到這里...
}
private void initTinker(Context base) {
// tinker 需要你開啟MultiDex
MultiDex.install(base);
TinkerManager.setTinkerApplicationLike(this);
// 設置全局異常捕獲
TinkerManager.initFastCrashProtect();
//開啟升級重試功能(在安裝Tinker 之前設置)
TinkerManager.setUpgradeRetryEnable(true);
//設置Tinker 日志輸出類
TinkerInstaller.setLogIml(new MyLogImp());
//安裝Tinker(在加載完multiDex 之后,否則你需要將com.tencent.tinker.**手動放到main
dex 中)
TinkerManager.installTinker(this);
mTinker = Tinker.with(getApplication());
}
}
```
2、搬運自定義Application 中的操作
把項目中在自定義Application 的操作移到TinkerApplicationLike 的onCreate()或onBaseContextAttached()方法中。
```
public class TinkerApplicationLike extends DefaultApplicationLike {
...
@Override
public void onCreate() {
super.onCreate();
// 將之前自定義的Application 中onCreate()方法所執行的操作搬到這里...
}
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
@Override
public void onBaseContextAttached(Context base) {
super.onBaseContextAttached(base);
mApplication = getApplication();
mContext = getApplication();
initTinker(base);
// 或搬到這里...
}
}
```
3、清單文件中注冊
將@DefaultLifeCycle 中application 對應的值,即"com.lqr.tinker.MyApplication",賦值給清單文件的application 標簽的name屬性,如下:
```
<application
android:name="com.lqr.tinker.MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
更多錄播視頻+架構學習資料免費領取請加Android 開發高級技術交流群QQ 群:892872246
android:theme="@style/AppTheme">
...
</application>
```
注意: 此時name 屬性會報紅,因為項目源碼中根本不存在MyApplication.java 文件,但不必擔心,因為它是動態生成的,Build 一下項目就好了,不管它也無所謂。
對于Application 代理類的詳細說明,請參考:「Tinker 官方Wiki:Application代理類」。
到這里就已經集成好Tinker 了,但只是本地集成而已,服務端下發補丁包到app 的文章之后會陸續發布更新。
- 第一章 熱修復設計
- 第一節、AOT/JIT & dexopt 與dex2oat
- 一、AOT/JIT
- 二、dexopt 與dex2oat
- 第二節、熱修復設計之CLASS_ISPREVERIFIED 問題
- 一、前言
- 二、建立測試Demo
- 三、制作補丁
- 四、加載補丁
- 五、CLASS_ISPREVERIFIED
- 第三節、熱修復設計之熱修復原理
- 一、Android 熱修復
- 二、Android 虛擬機和編譯加載順序
- 三、混合模式的理解
- 四、源碼類到機器執行的文件過程
- 五、補丁包
- 六、類補丁生效原理
- 七、Davlik 虛擬機的限制
- 八、Davlik Class resolved by unexpected DEX: 限制和處理方式
- 九、類加載器的雙親委派加載機制
- 第四節、Tinker 的集成與使用(自動補丁包生成)
- 一、簡述
- 二、Tinker 組件依賴
- 三、Tinker 的配置及任務
- 四、Tinker 封裝與拓展
- 五、編寫Application 的代理類
- 六、常用API
- 七、測試
- 八、細節
- 第二章 插件化設計
- 第一節、Class 文件與Dex 文件的結構解讀
- 一、Class 文件
- 二、Dex 文件
- 三、Class 文件和Dex 文件對比
- 第二節、Android 資源加載機制詳解
- 第三節、四大組件調用原理
- 第四節、so 文件加載機制
- 第五節、Android 系統服務實現原理
- 第三章 組件化框架設計
- 第一節、阿里巴巴開源路由框——ARouter 原理分析
- 第二節、APT 編譯時期自動生成代碼&動態類加載
- 第三節、Java SPI 機制
- 第四節、AOP&IOC
- 第五節、手寫組件化架構
- 第四章 圖片加載框架
- 第一節 圖片加載框架選型
- 第二節 Glide 原理分析
- 第三節 手寫圖片加載框架實戰
- 第五章 網絡訪問框架設計
- 第一節 網絡通信必備基礎
- 第二節 OkHttp 源碼解讀
- 第三節 Retrofit2 源碼解析
- 第六章 RXJava響應式編程框架設計
- 第一節 RXJava之鏈式調用
- 第二節 RXJava之擴展的觀察者模式
- 第三節 RXJava之事件變換設計
- 第四節 Scheduler 線程控制
- 第七章 IOC架構設計
- 第一節 依賴注入與控制反轉
- 第二節 ButterKnife 原理上篇、中篇、下篇
- 第三節 IOC架構設計之Dagger2架構設計
- 第八章 Android架構組件 JetPack
- 第一節 LiveData的工作原理
- 第二節 Navigation 如何解決tabLayout 問題
- 第三節 ViewModel 如何感知View 生命周期及內核原理
- 第四節 Room 架構方式方法
- 第五節 dataBinding 為什么能夠支持MVVM
- 第六節 WorkManager 內核揭秘
- 第七節 Lifecycles 生命周期