关于bugly热更新集成和使用的一些坑
对于android开发而言,现在热更新技术可以说是比较火热,当然,就国内环境而言,热更新的技术主要由阿里和腾讯两大阵营,尽管他们实现方式不同,也各有优缺点,但是目标都是一致的,就是希望能够带来技术上得革新,以及方便广大开发者更有效率的开发android应用。而具体的一些热更新框架的比较,在此不做赘述,网上有太多这样比较博客了。
由于我们项目之前有用到bugly去统计一些崩溃和ANR,因此,当产品说,我们也需要热更新时,嗯,为了方便那还是就用bugly的热更新吧。毕竟方便,评价也还不错。
bugly热更新框架是基于微信的Tinker的,而具体的集成过程,bugly官网也有相应的文档。按照开发文档的介绍,基本上没啥问题。然而,有一些坑,仍然是我们所需要去解决的。
一,基准包和补丁包
刚开始的时候,我也是一脸懵逼,又是基准包又是补丁包的,就不能一次解决吗?没办法,现实就是这样,遇到很多问题,除了自己硬着头皮上,没人可以真正帮你什么。
所谓的基准包:和我们普通的签名验证的包是一致的,唯一的不同是,我们需要使用app->tasks->build->assembleRelease命令去生成基准包,具体路径看图。
使用该命令后,生成的基准包的位置就在... 看图
image.png
注意:生成基准包时要改tinker-support.gradle文件中的tinkerId,关于这个字段的命名,因人而异,保证唯一就行。
image.png
打完基准包之后,再使用什么加固啊,然后上传应用市场即可。
接下来我们再看补丁包,补丁包需要基准包的支持。首先修改tinker-support.gradle的baseApkDir,即你打基准包生成的文件夹的所有内容,这也是为什么要保存这个文件夹的原因。因为上线版本出现了问题,就要依靠这个基本包文件夹中的所有内容去生成补丁包。
image.png
其次,修改tinker-support.gradle中的tinkerId,同样的,需要保证其唯一性。修改完成后,使用tinker-support中的buildTinkerPatchRelease命令生成补丁包。
image.png
生成补丁包的位置如下:
image.png最后,在bugly后台发布补丁包即可。需要注意的是,发布补丁包之前,需要对基准包联网上报相关信息。否则,发布补丁包时,无法匹配到相对于的基准包版本信息。
二,大坑
按照标准的流程走,确实没啥问题。可是,就在鼓舞欢庆时,出现了问题。根据bugly崩溃统计。大量的android sdk为23的设备出现进入app即崩溃的现象。查看崩溃日志发现了一个错误:java.lang.ArithmeticException error:0f06707b:elliptic curve routines:EC_GROUP_new_by_curve_name:UNKNOWN_GROUP,具体的调用栈为
image.png image.png而且,该错误只出现在Android sdk版本为23的手机上,找了bugly技术客服,无果。google,百度,无果。
后经过两天的反复测试和验证。找了问题产生的地方。由于我们项目之前集成过腾讯IM SDK,在对IM SDK进行初始化时调了改行代码
TIMManager.getInstance().init(getApplicationContext(), Constants.SDK_APPID, Constants.ACCOUNT_TYPE);
从而导致了Tinker热更新时,在进行补丁包插入时,出现了问题。该问题的具体原因为系统方法时调用了
public static BigInteger valueOf(long value) {
if (value < 0) {
if (value != -1) {
return new BigInteger(-1, -value);
}
return MINUS_ONE;
} else if (value < SMALL_VALUES.length) {
return SMALL_VALUES[(int) value];
} else {// (value > 10)
return new BigInteger(1, value);
}
}
最终在BigInt类中的makeValid方法中崩溃。
image.png再往下查看,发现BN_new为natvie方法。我的天啊。
image.png最后,虽然问题是找到了,但是其基本原因还不知道,为什么调用了IM SDK的初始化方法会出现这样的问题暂时不得而知,希望通过这篇文章能给遇到相同问题的朋友一些解决思路。也希望知道根源的朋友能够给我留言。