今天看了腾讯的bugly热更新,觉得真心方便,在此记录一下。
通过热修复进行局部问题的修复是很好用的。

首先我们在腾讯bugly官网注册开发者账号,点击我的产品进行应用创建,获取APPId;
然后在自己的工程里进行配置就可以了,配置步骤如下:
一、在工程根目录下“build.gradle”文件中添加如下代码:

buildscript {repositories {jcenter()}dependencies {classpath "com.tencent.bugly:tinker-support:latest.release"// NOTE: Do not place your application dependencies here; they belong// in the individual module build.gradle files}
}

二、集成SDK,在app下的build.gradle文件里添加依赖,如下:

    compile 'com.android.support:multidex:1.0.1'// 多dex配置compile 'com.tencent.bugly:crashreport_upgrade:latest.release'//其中latest.release指代最新版本号,也可以指定明确的版本号,例如1.2.0compile 'com.tencent.bugly:nativecrashreport:latest.release'//其中latest.release指代最新版本号,也可以指定明确的版本号,例如2.2.0

三、在app的build.gradle文件的同级目录下创建tinker-support.gradle这个文件,其内容如下:

apply plugin: 'com.tencent.bugly.tinker-support'def bakPath = file("${buildDir}/bakApk/")/*** 此处填写每次构建生成的基准包目录*/
def baseApkDir = "app-0403-13-30-14"/*** 对于插件各参数的详细解析请参考*/
tinkerSupport {// 开启tinker-support插件,默认值trueenable = true// 指定归档目录,默认值当前module的子目录tinkerautoBackupApkDir = "${bakPath}"// 是否启用覆盖tinkerPatch配置功能,默认值false// 开启后tinkerPatch配置不生效,即无需添加tinkerPatchoverrideTinkerPatchConfiguration = true// 编译补丁包时,必需指定基线版本的apk,默认值为空// 如果为空,则表示不是进行补丁包的编译// @{link tinkerPatch.oldApk }baseApk = "${bakPath}/${baseApkDir}/app-release.apk"// 对应tinker插件applyMappingbaseApkProguardMapping = "${bakPath}/${baseApkDir}/app-release-mapping.txt"// 对应tinker插件applyResourceMappingbaseApkResourceMapping = "${bakPath}/${baseApkDir}/app-release-R.txt"// 构建基准包和补丁包都要指定不同的tinkerId,并且必须保证唯一性tinkerId = "patch-2.0.1"// 构建多渠道补丁时使用// buildAllFlavorsDir = "${bakPath}/${baseApkDir}"// 是否启用加固模式,默认为false.(tinker-spport 1.0.7起支持)isProtectedApp = true// 是否开启反射Application模式enableProxyApplication = false// 是否支持新增非export的Activity(注意:设置为true才能修改AndroidManifest文件)supportHotplugComponent = true}/*** 一般来说,我们无需对下面的参数做任何的修改* 对于各参数的详细介绍请参考:* https://github.com/Tencent/tinker/wiki/Tinker-%E6%8E%A5%E5%85%A5%E6%8C%87%E5%8D%97*/
tinkerPatch {//oldApk ="${bakPath}/${appName}/app-release.apk"ignoreWarning = falseuseSign = truedex {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 = "2.0.0-base"//applyMapping = "${bakPath}/${appName}/app-release-mapping.txt" //  可选,设置mapping文件,建议保持旧apk的proguard混淆方式//applyResourceMapping = "${bakPath}/${appName}/app-release-R.txt" // 可选,设置R.txt文件,通过旧apk文件保持ResId的分配}
}

然后在app的build.gradle文件里添加代码:

apply from: 'tinker-support.gradle'

四、初始化SDK。初始化SDK分为两种情况:

1、 tinker-support.gradle文件中的enableProxyApplication = false:

        这种情况是Tinker推荐的接入方式,一定程度上会增加接入成本,但具有更好的兼容性。集成Bugly升级SDK之后,我们需要按照以下方式自定义ApplicationLike来实现Application的代码(以下是示例):

自定义Application

public class SampleApplication extends TinkerApplication {public SampleApplication() {super(ShareConstants.TINKER_ENABLE_ALL, "xxx.xxx.SampleApplicationLike","com.tencent.tinker.loader.TinkerLoader", false);}
}

注意:这个类集成TinkerApplication类,这里面不做任何操作,所有Application的代码都会放到ApplicationLike继承类当中
参数解析
参数1:tinkerFlags 表示Tinker支持的类型 dex only、library only or all suuport,default: TINKER_ENABLE_ALL
参数2:delegateClassName Application代理类 这里填写你自定义的ApplicationLike
参数3:loaderClassName Tinker的加载器,使用默认即可
参数4:tinkerLoadVerifyFlag 加载dex或者lib是否验证md5,默认为false

我们需要您将以前的Applicaton配置为继承TinkerApplication的类即SampleApplication(此处我修改了该类的名称) :

自定义ApplicationLike:

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);}@Overridepublic void onCreate() {super.onCreate();// 这里实现SDK初始化,appId替换成你的在Bugly平台申请的appId// 调试时,将第三个参数改为trueBugly.init(getApplication(), "your APPId", false);}@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)@Overridepublic 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);}
}

注意:tinker需要你开启MultiDex,你需要在dependencies中进行配置compile “com.android.support:multidex:1.0.1”才可以使用MultiDex.install方法; SampleApplicationLike这个类是Application的代理类,以前所有在Application的实现必须要全部拷贝到这里,在onCreate方法调用SDK的初始化方法,在onBaseContextAttached中调用Beta.installTinker(this);

2、enableProxyApplication = true 的情况:

public class MyApplication extends Application {@Overridepublic void onCreate() {super.onCreate();// 这里实现SDK初始化,appId替换成你的在Bugly平台申请的appId// 调试时,将第三个参数改为trueBugly.init(this, "900029763", false);}@Overrideprotected void attachBaseContext(Context base) {super.attachBaseContext(base);// you must install multiDex whatever tinker is installed!MultiDex.install(base);// 安装tinkerBeta.installTinker();}
}

注:这种情况下无须修改Application,主要是为了降低接入成本,我们插件会动态替换AndroidMinifest文件中的Application为我们定义好用于反射真实Application的类(需要您接入SDK 1.2.2版本 和 插件版本 1.0.3以上)。

五、配置AndroidManifest.xml文件。
在AndroidMainfest.xml中进行以下配置:
1、权限配置

<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" />

2、Activity配置

<activity
    android:name="com.tencent.bugly.beta.ui.BetaActivity"android:configChanges="keyboardHidden|orientation|screenSize|locale"android:theme="@android:style/Theme.Translucent" />

3、 配置FileProvider

<provider
    android:name="android.support.v4.content.FileProvider"android:authorities="${applicationId}.fileProvider"android:exported="false"android:grantUriPermissions="true"><meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/provider_paths"/>
</provider>

如果你使用的第三方库也配置了同样的FileProvider, 可以通过继承FileProvider类来解决合并冲突的问题,示例如下:

<provider
    android:name=".utils.BuglyFileProvider"android:authorities="${applicationId}.fileProvider"android:exported="false"android:grantUriPermissions="true"tools:replace="name,authorities,exported,grantUriPermissions"><meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/provider_paths"tools:replace="name,resource"/>
</provider>

这里要注意一下,FileProvider类是在support-v4包中的,检查你的工程是否引入该类库。
在res目录新建xml文件夹,创建provider_paths.xml文件如下:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android"><!-- /storage/emulated/0/Download/${applicationId}/.beta/apk--><external-path name="beta_external_path" path="Download/"/><!--/storage/emulated/0/Android/data/${applicationId}/files/apk/--><external-path name="beta_external_files_path" path="Android/data/"/>
</paths>

这里配置的两个外部存储路径是升级SDK下载的文件可能存在的路径,一定要按照上面格式配置,不然可能会出现错误。

注:1.3.1及以上版本,可以不用进行以上配置,aar已经在AndroidManifest配置了,并且包含了对应的资源文件。

六、混淆配置
在proguard-rules.pro文件下添加如下代码:

-dontwarn com.tencent.bugly.**
-keep public class com.tencent.bugly.**{*;}
-keep class android.support.**{*;}

至此算是配置完成了,接下来就是如何使用了。

使用步骤如下:
1、配置签名文件。
2、打开Android Studio右侧菜单栏中的Gradle,找到如下工具,双击进行打包:

打包成功后在工程的app文件夹下生成一个名为“bakApk”的文件夹,如下图所示;

如上图所示,该文件夹下诸多文件夹,其中app-release.apk即为安装的存在问题的基线版本apk。

注意:app-release.apk一定要安装后联网打开用以上传apk信息到腾讯bugly后台,否则不能实现热更新

3、修改tinker-support.gradle文件下的内容,主要包括如下图所示两部分(其他地方一般不用修改):

第一部分修改为已安装版本的apk的文件夹名,第二部分为tinkerId。

完成后找到如下工具进行补丁包打包:

完成后在app的build文件夹下的output文件夹中找到patch文件夹,其中的patch-signed-7zip.apk即为我们需要的补丁:

4、此时打开腾讯bugly的后台,找到当前的应用,点击应用升级 –> 热更新 –> 发布新补丁:

将不定文件上传,选择全量设备,立即下发即可。

此时有问题的APK在打开后就会下载补丁文件并进行合并,想要补丁生效的话需要将APP关闭后重新启动,重新启动后的APP就是经过热更新后修改了的APP了。

主要借鉴于:腾讯bugly

Android 腾讯Bugly热更新笔记相关推荐

  1. Android 腾讯 Bugly 热修复

    依赖配置流程 Bugly 文档中心 引入依赖 在项目的 build.gradle 中加入依赖 buildscript {repositories {jcenter()google()}dependen ...

  2. Android 腾讯Bugly的应用升级热更新

    经过去年的九月份至现在,发现自己很久没有写过比较好的文章了.今天就趁着通宵的劲,写一下对腾讯Bugly的应用升级&热更新的理解,希望对新手有所帮助,有兴趣的可以了解下,没兴趣的也可以看完之后吐 ...

  3. Android热更新初探,Bugly热更新的集成和使用(让你的应用轻松具备热更新能力)

    介绍   在介绍Bugly之前,需要先向大家简单介绍下一些热更新的相关内容.当前市面的热补丁方案有很多,其中比较出名的有阿里的AndFix.美团的Robust以及QZone的超级补丁方案.但它们都存在 ...

  4. walle多渠道打包+Tinker(bugly)热更新集成+360加固(乐固)

    这三个东东是干啥的相信大家都有所耳闻了,如果你没有听说过,请出门左拐,百度一下你就知道.这里不对这三个东东具体的集成方式做详细的介绍,因为官方文档已经写的很详细了,主要是对同时使用这三个东东时所需要注 ...

  5. bugly热更新加固应用失败详解

    最近做了一个热更新的功能,前几天把热更新的坑全部踩了一遍之后,热更新功能得以使用,但是昨天又发现了一个新的问题,就是热更新成功,但是加固后的包就不行了.注意:我这里是用的360和乐固加固测试的. 最初 ...

  6. Android 腾讯Bugly使用(异常上报,全量升级,热更新)

    1.0.1腾讯Bugly使用(异常上报,全量升级,热更新) 说明 Bugly全量升级,热更新以及异常上报是一起集成的,还包括运营统计,本文档着重演示热更新功能. 接入步骤 1.在Project的bui ...

  7. bugly热更新、多渠道集成及加固问题

    Bugly Android热更新使用指南–>大部分步骤按照文档即可:官方文档 ========================================================== ...

  8. 安卓开发腾讯Bugly热修复集成和使用思路

    文章目录 一,官方集成 一.获取App ID 二.添加插件依赖 三.集成SDK 四.配置Tinker 1.overrideTinkerPatchConfiguration 2.baseApkDir 3 ...

  9. webstorm 运行android,Windows React Native环境搭建:webstorm+android studio 及解决热更新

    工具准备: SDK Android SDK Build-tools:23.0.1 SDK Platform:Android N .6.0 .5.1.1.5.0.1.4.4.2.4.1.2 Androi ...

  10. bugly热更新使用

    官网文档:https://bugly.qq.com/docs/user-guide/instruction-manual-android-hotfix/?v=20181014122344 官网介绍 1 ...

最新文章

  1. mysql select 返回列,是否可以对在mysql SELECT语句中返回列的顺序进行排序?
  2. NGINX发布支持动态配置的开源Web服务器
  3. 使用ASP.Net 3.5 的Ajax与Web服务开发实例
  4. 微信小程序多选取值判断显示内容
  5. html个人博客完整代码_hexo | 不用写代码,2小时快速搭建个人博客
  6. 卧薪尝胆三千越甲可吞吴
  7. 机器学习基础(二十六)—— 将 SVM 推广到多类问题
  8. android 存储空间监控,浅谈 Android 内存监控(中)
  9. GPS卫星星历与历书
  10. android手机怎么用车载高德地图,用手机更新车载高德地图,汽车导航升级方法...
  11. unity素材三:未来城市场景
  12. BLEU——机器翻译评测
  13. Redis总结笔记(总结自Redis开发与运维)
  14. HarmonyOS:Preferences的封装使用与避坑
  15. java 支付宝 H5支付
  16. 自定义拍照时 拍照界面_拍照时图片比例怎么选?比构图还要提前一步的摄影攻略要做好...
  17. Ubuntu 14.04安装配置Calamari
  18. tab标签页-选项卡后边+后端所返数据的数量
  19. 手机端富文本编辑器_在手机上也能高效写作,这款好用的移动端编辑器值得你尝试...
  20. 【Photoshop实用教程】如何用魔术棒工具替换背景?

热门文章

  1. 计算机应用中双绞线细铜线几根,《计算机应用基础_在线作业_E100.doc
  2. Google, with new Pixel and camera, is serious about devices
  3. work profile关闭时桌面图标变灰
  4. 炒黄金短线交易如何放大收益
  5. TS 中的 keyof 和 typeof 操作符
  6. C语言经典案例——第六章 字符串
  7. ChemDraw怎么画3D图?
  8. windows10使用administrator登录后出现“无法使用内置管理员账户打开应用”的解决方法
  9. OCR表格识别(三)——文本检测与文本识别理论学习
  10. lync2013持久聊天服务器如何修复,部署企业版lync2013之四:持久聊天