写在前面:
在平时开发中,当稳定版本开发出来后,我们要做的就是发布到各个app市场。但是我们发出去的版本存在着bug,这时我们只能修改后又重新发版,想想国内N多个平台,每次发版都想吐。好在有热补丁这以技术的诞生,热补丁解决了项目有bug而不用重新发版,而是通过打补丁的方式修复我们的bug,一下就记录腾讯基于Tinker的Bugly热修复。
接下来:就开始实现嘛
第一步:添加依赖
在project目录下的build.gradle中添加
// tinkersupport插件, 其中lastest.release指拉取最新版本,也可以指定明确版本号,例如1.0.4
classpath "com.tencent.bugly:tinker-support:latest.release"
在module目录下的build.gradle中添加
// 多dex配置
compile 'com.android.support:multidex:1.0.1'
// 升级SDK,其中lastest.release指拉取最新版本,也可以指定明确版本号,例如1.0.4
compile 'com.tencent.bugly:crashreport_upgrade:latest.release'
然后在module目录下新建tinker-support.gradle文件(与build.gradle同级),并在module的build.gradle添加依赖,如图.

第二步: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" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
第三步:初始化SDK
在tinker-support.gradle文件中有个参数enableProxyApplication
- 为false的情况下需要我们配置Application,官方推荐开发者自定义Application方式,因为这种方式有更好的兼容性,缺点是接入成本增加。
- 为true,则无需修改Application,这样tinker帮我们动态替换AndroidMainfest.xml的Application为tinker插件用于反射真是的Application类。
PS 但是以下只介绍自定义Application方式。
### (一)自定义Application,不做任何操作 ###
public class MyApplication extends TinkerApplication {
public MyApplication() {
super(ShareConstants.TINKER_ENABLE_ALL, "com.cn.one.MyApplicationLik","com.tencent.tinker.loader.TinkerLoader", false);
}
}
参数解析:####
- 参数1:tinkerFlags 表示Tinker支持的类型 dex only、library only or all suuport,默认: TINKER_ENABLE_ALL
- 参数2:delegateClassName Application代理类 这里填写我们自定义的ApplicationLike
- 参数3:loaderClassName Tinker的加载器,使用默认即可
- 参数4:tinkerLoadVerifyFlag 加载dex或者lib是否验证md5,默认为false
将AndroidMainfest.xml中application 的name值改成我们的MyApplication

(二)自定义ApplicationLike:
MyApplicationLike这个类是Application的代理类,以前所有在Application的实现必须要全部拷贝到这里, 在onCreate方法调用SDK的初始化方法, 在onBaseContextAttached中调用Beta.installTinker(this)
public class MyApplicationLike extends DefaultApplicationLike {
public MyApplicationLike(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(), "709e98ebf0", true);
}
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
@Override
public void onBaseContextAttached(Context base) {
super.onBaseContextAttached(base);
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);
}
}
第三步:混淆配置
-dontwarn com.tencent.bugly.**
-keep public class com.tencent.bugly.**{*;}
-keep class android.support.**{*;}
注意事项:
- 打基准包安装上报联网,必须填写唯一tinkerId
- 上传补丁包的一定是patch目录的,而不是tinkerPatch目录
- 同一基准包多次修复的,每次打补丁包只需修改tinkerId即可
- 平时debug开发的话只需将module下build.gradle中的apply from: ‘tinker-support.gradle’注释即可
写在最后
后续。。。