记ReactNative项目bug的经历

1,268 阅读3分钟

1. App在安卓8.0.0的崩溃

背景:

春节后因为疫情的影响,一直在老家办公,省去了路上通勤的时间,就升级了ReactNative版本:0.59.9 => 0.61.5。 上周收到安卓用户反馈说新下载的软件无法打开,点击没有任何反应。

解决:

得知这一消息时,急忙到线上应用市场下载安装了App,在我自己的手机及测试机上并没有重现。与用户沟通得知了机型为mi6,系统版本MIUI10、安卓8.0.0,翻遍了测试机终于找到了一部荣耀的安卓8.0.0,果然在这部手机重现了此崩溃:连启动屏都没有显示出来,点击app图标没有任何反应。既然复现了此问题,就要找到原因并修复它。

  1. 由以上场景,至少得出了一点结论:崩溃一定不是js造成的,大概率是应用启动时的原生代码造成的。
  2. 由于用户在年前是能够正常打开的,升级到了年后的版本就不能打开了,而此期间进行的大的代码更改就只有RN的升级了,首先怀疑会不会是ReactNative0.61.5在安卓8.0.0有bug,于是新建了一个0.61.5的项目,调试并没有无效应,能够正常打开,排除了RN的问题,缩小了问题范围。
  3. 既然不是RN的原因,又是启动时造成的bug,那就看一看App启动时都执行了什么代码吧。
  4. 某第三方统计和某开源启动屏库是app启动时执行的代码,突然想起来统计在安卓8.1.0以上的机型存在问题没有正常统计到数据,会不会就是友盟造成的,于是把现有项目的集成删除了,但仍然不能打开app。
  5. 那就试一下把启动屏的代码也加上去新建的RN0.61.5把,可以正常打开。
  6. 此时App启动时会执行的功能已经全部集成了,但没有复现崩溃,但又很明显不可能是js代码的问题,因为启动屏都没来得及打开。于是对比了两个项目的原生代码:waitpay/MainActivity.javaMainApplication.java,并没有什么不同,接着又对比了配置文件AndroidManifest.xml,有些许的不同,当我将此配置文件复制到新建的RN时重现的此崩溃,最终定位到是由于设置了屏幕方向为竖屏引发的android:screenOrientation="portrait"崩溃。
  7. 到了这里似乎找到了原因,并且只要取消掉竖屏的限制就能解决这个问题。但你不好奇为什么设置了竖屏就会在安卓8.0.0上崩溃吗?
  8. 查阅了资料,发现是由于安卓8.0.0上有一个限制:当屏幕是半透明时不能设置屏幕方向,即<item name="android:windowIsTranslucent">true</item>android:screenOrientation="portrait互斥,将targetSdk降级到27一下则可以避免此限制(只有安卓8.0.0有此限制)。
  9. 解决方法见参考资料

参考资料:

  1. Lock screen orientation when targeting Android API 27 with a non-opaque activity
  2. Changing themes and styles based on the Android version on build