https://github.com/BuglyDevTeam/Bugly-Android-Demo
https://bugly.qq.com/docs/user-guide/instruction-manual-android-hotfix/?v=20180709165613
1、首先当然是配置环境了
在Module:app文件配置
在AndroidMainfest.xml中进行以下配置:
2、添加文件:切换至project目录,app目录上new ->File -> 新建: tinker-support.gradle
然后复制以下内容:
apply plugin: 'com.tencent.bugly.tinker-support' def bakPath = file("${buildDir}/bakApk/") /** * 此处填写每次构建生成的基准包目录 */ def baseApkDir = "app-0613-14-19-25" /** * 对于插件各参数的详细解析请参考 */ tinkerSupport { // 开启tinker-support插件,默认值true enable = true // 自动生成tinkerId, 你无须关注tinkerId,默认为false autoGenerateTinkerId = true // 指定归档目录,默认值当前module的子目录tinker autoBackupApkDir = "${bakPath}" // 是否启用覆盖tinkerPatch配置功能,默认值false // 开启后tinkerPatch配置不生效,即无需添加tinkerPatch overrideTinkerPatchConfiguration = true // 编译补丁包时,必需指定基线版本的apk,默认值为空 // 如果为空,则表示不是进行补丁包的编译 // @{link tinkerPatch.oldApk } baseApk = "${bakPath}/${baseApkDir}/app-release.apk" // baseApk = "${bakPath}/${baseApkDir}/app-debug.apk" // 对应tinker插件applyMapping baseApkProguardMapping = "${bakPath}/${baseApkDir}/app-release-mapping.txt" // baseApkProguardMapping = "${bakPath}/${baseApkDir}/app-debug-mapping.txt" // 对应tinker插件applyResourceMapping baseApkResourceMapping = "${bakPath}/${baseApkDir}/app-release-R.txt" // baseApkResourceMapping = "${bakPath}/${baseApkDir}/app-debug-R.txt" // 构建基准包跟补丁包都要修改tinkerId,主要用于区分 tinkerId = "base-1.0.1" // tinkerId = "patch-1.0.1" // 打多渠道补丁时指定目录 // buildAllFlavorsDir = "${bakPath}/${baseApkDir}" // 是否使用加固模式,默认为false // isProtectedApp = true // 是否采用反射Application的方式集成,无须改造Application enableProxyApplication = false // 支持新增Activity supportHotplugComponent = true } /** * 一般来说,我们无需对下面的参数做任何的修改 * 对于各参数的详细介绍请参考: * https://github.com/Tencent/tinker/wiki/Tinker-%E6%8E%A5%E5%85%A5%E6%8C%87%E5%8D%97 */ tinkerPatch { tinkerEnable = true ignoreWarning = false useSign = false 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 = "base-2.0.1" } }
Tip:这里用的是 enableProxyApplication = false 稍微麻烦的方式,但是兼容性高,建议这种方式集成
Tip:记得在注册清单文件中更换application
public class SampleApplication extends TinkerApplication { public SampleApplication() { super(ShareConstants.TINKER_ENABLE_ALL, "xxx.xxx.SampleApplicationLike", "com.tencent.tinker.loader.TinkerLoader", false); } }
//------------------------------------------------------------------------------------------
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); } }
设置你的基准版本号最好是和app version对应
执行assembleRelease编译生成基准包: 双击assembleRelease
这个会在build/outputs/bakApk路径下生成每次编译的基准包、混淆配置文件、资源Id文件,如下图所示:
注:如果你没有开启混淆是不会有mapping.txt文件的,需要在Moudle的build.gradle文件中开启混淆
如果你在混淆的时候遇到麻烦,不妨在混淆文件中添加这个试试(马赛克部分是你的包名):
生成的补丁包在build/outputs/patch目录下,其中7zip.apk就是我们需要使用的补丁包:
打开补丁包可以看到里面会有一个YAPATCH.MF,这里面包含了我们是从base版本到patch版本:以及app的version信息
以上完成基本就能用了!!!
注:部分截图有借用其他博主的,感谢:
https://www.jianshu.com/p/ae47bb2613e3