五、编写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 生命周期