用Bugly Tinker热更新之 兼容android 10

热修复之升级版----热更新方案(兼容android 10)

之前说了热修复的应用以及自建服务器管理补丁方案,本次再进一步讨论升级版应用方式—热更新。



前言

热更新与热修复如出一辙,只不过是侧重点不同而已。热修复专注于Bug修复,基本上不会新增其他内容;而热更新就是考虑了新增部分功能情况,目的是减少升级频次,升级包大小,用户无感知等。由于Bugly依赖于Tinker,因此,我们还是从Tinker入手分析。


一、Tinker的已知问题

要想使用热更新,避免采坑,就需要了解Tinker的已知问题,目前WIKI上公布如下:
由于原理与系统限制,Tinker有以下已知问题:

  1. Tinker不支持修改AndroidManifest.xml,Tinker不支持新增四大组件(1.9.0支持新增非export的Activity);
  2. 由于Google Play的开发者条款限制,不建议在GP渠道动态更新代码;
  3. 在Android N上,补丁对应用启动时间有轻微的影响;
  4. 不支持部分三星android-21机型,加载补丁时会主动抛出"TinkerRuntimeException:checkDexInstall failed";
  5. 对于资源替换,不支持修改remoteView。例如transition动画,notification icon以及桌面图标。

对于开发者来说,真正关心的一般还是第一条,因为热更新一般都会增加新功能,新UI, 因此必不可免的需要修改AndroidManifest.xml新增四大组件。当我们看到括号里面的描述时,1.9.0之后可以新增Activity,心中立马惊喜起来,大喊一声 “太棒啦!!” 。
为什么只提到Activity呢?可能有的小伙伴不理解,我给大家讲一下,四大组件,无非就是Service ,BroadcastReceiver,ContentProvider,Activity。这些组件使用到的时候,都是需要在AndroidManifest.xml中预先注册的,如果没有注册,就被当做黑户,用到的时候就会闪退关闭程序。
热更新的时候, 对于 Service ,BroadcastReceiver这两个组件,有经验的开发者可以找到解决对策,可以复用已有的 Service ,BroadcastReceiver。比如Intent增加个标记Flag参数,进行业务逻辑区分就可以了,反正都是不可见的组件。ContentProvider这个组件,一般应用很少对外暴露数据,因此很少用到它,所以我们可以忽略。所以我们最关心的就是Activity组件,这个是跟UI直接相关的,呈现在用户眼前的,直接复用会造成很多问题。
1.9.0支持新增非export的Activity 对热更新来说真的是一个巨大的福音,然而,是真的吗??。。。

二、采坑记

拿起手机验证跑一把

先安装基准包,然后新增一个Activity,在AndroidManifest.xml中注册新增Activity,并设置 android:exported=“false” ,修改代码启动这个Activity呈现给用户。OK, 打个补丁包,应用补丁成功,重启应用,点击按钮启动新增Activity,正满怀期待新UI呈现时, WHAT ??闪退了??赶紧抓日志。。。
在这里插入图片描述
日志很明显,就是新增的Activity组件找不到,AndroidManifest.xml中没注册成功的原因。不是说好的支持新增了吗???

于是就各种查资料,经过一阵子折腾,在Bugly-Android-Demo github中终于找到了答案

在这里插入图片描述
这也是新增Activity 遇到的问题,我一看我手机也是 Android 10 ,赶紧试试 Android 低版本,低版本确实可以做到热更新,一切正常。 下面有个回复,链接指向了 Tinker ,跟过去看看

在这里插入图片描述
在 Android 10 上已经无法支持新增 Activity 了, 简直是晴天霹雳,说好的热更新要凉了吗???

三、填坑记

查看Tinker 支持新增Activity源码

遇到无解问题,首先想到研究源码。 看看Tinker是怎么做到支持新增非export Activity的吧。经过一番查找,终于在AndroidManifest.xml的地方发现了端倪。
在这里插入图片描述

  <application>
        <activity android:name="com.tencent.tinker.loader.hotplug.ActivityStubs$STDStub_00" />
        <activity android:name="com.tencent.tinker.loader.hotplug.ActivityStubs$STDStub_01" />
        <activity android:name="com.tencent.tinker.loader.hotplug.ActivityStubs$STDStub_02" />
        <activity android:name="com.tencent.tinker.loader.hotplug.ActivityStubs$STDStub_03" />
        <activity android:name="com.tencent.tinker.loader.hotplug.ActivityStubs$STDStub_04" />
        <activity android:name=
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值