1.工程目录gradle添加 dependencies { classpath 'com.tencent.bugly:tinker-support:1.1.5' } 2.项目gradle添加 buyly及tinker热更新依赖
defaultConfig { multiDexEnabled true}
dependencies { implementation "com.android.support:appcompat-v7:${project.fastjsonLibVersion}" // 多dex配置 implementation 'com.android.support:multidex:1.0.2' // 本地集成aar方式 // compile(name: 'bugly_crashreport_upgrade-1.3.6', ext: 'aar') // 远程依赖集成方式(推荐) implementation 'com.tencent.bugly:crashreport_upgrade:1.3.6' // 指定tinker依赖版本(注:应用升级1.3.5版本起,不再内置tinker) implementation 'com.tencent.tinker:tinker-android-lib:1.9.9' }
// 依赖插件脚本
apply from: 'tinker-support.gradle'
====================tinker-support.gradle=============
apply plugin: 'com.tencent.bugly.tinker-support'
def bakPath = file("${buildDir}/bakApk/")
/**
- 此处填写每次构建生成的基准包目录 */ //def baseApkDir = "app-1108-15-10-04" def baseApkDir = "app-0420-14-55-27"
/**
-
对于插件各参数的详细解析请参考 */ 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 = "
{baseApkDir}/app-release.apk" // baseApk = "
{baseApkDir}/app-debug.apk"
// 对应tinker插件applyMapping baseApkProguardMapping = "
{baseApkDir}/app-release-mapping.txt" // baseApkProguardMapping = "
{baseApkDir}/app-debug-mapping.txt"
// 对应tinker插件applyResourceMapping baseApkResourceMapping = "
{baseApkDir}/app-release-R.txt" // baseApkResourceMapping = "
{baseApkDir}/app-debug-R.txt"
// 构建基准包跟补丁包都要修改tinkerId,主要用于区分 tinkerId = "1.0.6-patch"
// 打多渠道补丁时指定目录 // buildAllFlavorsDir = "
{baseApkDir}"
// 是否使用加固模式,默认为false isProtectedApp = true
// 是否采用反射Application的方式集成,无须改造Application enableProxyApplication = true
// 支持新增Activity supportHotplugComponent = true
}
/**
-
一般来说,我们无需对下面的参数做任何的修改
-
对于各参数的详细介绍请参考:
-
github.com/Tencent/tin… / 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" } }
=====================Application================== public class BuglyTinkerApplication extends Application { @Override public void onCreate() { super.onCreate();
setStrictMode();
// 设置是否开启热更新能力,默认为true
Beta.enableHotfix = true;
// 设置是否自动下载补丁
Beta.canAutoDownloadPatch = true;
// 设置是否提示用户重启
Beta.canNotifyUserRestart = true;
// 设置是否自动合成补丁
Beta.canAutoPatch = true;
/**
* 补丁回调接口,可以监听补丁接收、下载、合成的回调
*/
Beta.betaPatchListener = new BetaPatchListener() {
@Override
public void onPatchReceived(String patchFileUrl) {
Toast.makeText(getApplicationContext(), patchFileUrl, Toast.LENGTH_SHORT).show();
}
@Override
public void onDownloadReceived(long savedLength, long totalLength) {
// Toast.makeText(getApplicationContext(), String.format(Locale.getDefault(), // "%s %d%%", // Beta.strNotificationDownloading, // (int) (totalLength == 0 ? 0 : savedLength * 100 / totalLength)), Toast.LENGTH_SHORT).show(); // }
@Override
public void onDownloadSuccess(String patchFilePath) {
// Toast.makeText(getApplicationContext(), patchFilePath, Toast.LENGTH_SHORT).show(); // Beta.applyDownloadedPatch(); }
@Override
public void onDownloadFailure(String msg) {
// Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show(); }
@Override
public void onApplySuccess(String msg) {
Toast.makeText(getApplicationContext(), "2222222222", Toast.LENGTH_SHORT).show();
}
@Override
public void onApplyFailure(String msg) {
// Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show(); }
@Override
public void onPatchRollback() {
// Toast.makeText(getApplicationContext(), "onPatchRollback", Toast.LENGTH_SHORT).show(); } };
// 这里实现SDK初始化,appId替换成你的在Bugly平台申请的appId,调试时将第三个参数设置为true
Bugly.init(this, "273d6fb859", true);
}
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
// you must install multiDex whatever tinker is installed!
MultiDex.install(base);
// 安装tinker
Beta.installTinker();
}
@TargetApi(9)
protected void setStrictMode() {
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().permitAll().build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll().penaltyLog().build());
}
}
基线包通过build Release生成
def baseApkDir = "app-1108-15-10-04" tinkerId = "1.0.1-base" 基线包-bakApk生成一个目录如app-1108-18-13-15
注意:修改baseApkDir为app-1108-18-13-15生成补丁包 def baseApkDir = "app-1108-18-13-15" tinkerId = "1.0.1-patch" patch包
测试:将补丁放入手机本地目录,启动修复