🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
五、编写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 的文章之后会陆续发布更新。