Bugly热更新接入步骤

857 阅读2分钟

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 = "{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 = "1.0.6-patch"

    // 打多渠道补丁时指定目录 // buildAllFlavorsDir = "{bakPath}/{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生成

补丁包通过tinker 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包

测试:将补丁放入手机本地目录,启动修复