解决 React Native 0.62 安卓打包apk后,index.android.bundle 被修改为二进制文件

React Native 2020-07-15 阅读 179 评论 0

问题描述

React Naitve 升级到 0.62,打包正式版 apk 前,将 React Naitve 模块的 js 文件捆绑到 index.android.bundle,运行

npx react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res/

使用 Android Studio,打包正式版 apk,解压 apk,可以发现 index.android.bundle 文件为二进制文件。

$ unzip app-release.apk
$ less assets/index.android.bundle
"assets/index.android.bundle" may be a binary file.  See it anyway?

由于 app 做了 javascript 运行错误日志收集,对于修改 bug 非常有用,之前一直能对错误日志进行代码定位。错误格式如下:

{
  "message": "Can't find variable: test",
  "stack": [
    {
      "file": "index.android.bundle",
      "methodName": "value",
      "arguments": [],
      "lineNumber": 814,
      "column": 15055
    },
    {
      "file": "[native code]",
      "methodName": "value",
      "arguments": [],
      "lineNumber": null,
      "column": null
    },
    {
      "file": "index.android.bundle",
      "methodName": "onPress",
      "arguments": [],
      "lineNumber": 232,
      "column": 1701
    },
    ...
  ]
}

以下是升级到 0.62 后,错误日志的格式。methodName 和 lineNumber(都为第1行)都变得不可定位。

{
  "message": "Property 'test' doesn't exist",
  "stack": [
    {
      "file": "index.android.bundle",
      "methodName": "value (address at",
      "arguments": [],
      "lineNumber": 1,
      "column": 901699
    },
    {
      "file": "index.android.bundle",
      "methodName": "onPress (address at",
      "arguments": [],
      "lineNumber": 1,
      "column": 271115
    },
    {
      "file": "index.android.bundle",
      "methodName": "value (address at",
      "arguments": [],
      "lineNumber": 1,
      "column": 267186
    },
    ...
  ]
}

解决方法

修改文件 android/app/build.gradle,将 enableHermes 修改为 false

 project.ext.react = [
-    enableHermes: true,  // clean and rebuild if changing
+    enableHermes: false,  // clean and rebuild if changing
 ]

在开发模式下,可以修改为 true,方便使用 flipper 调试。

最后更新 2020-07-16
MIP.watch('startSearch', function (newVal, oldVal) { if(newVal) { var keyword = MIP.getData('keyword'); console.log(keyword); // 替换当前历史记录,新增 MIP.viewer.open('/s/' + keyword, {replace: true}); setTimeout(function () { MIP.setData({startSearch: false}) }, 1000); } }); MIP.watch('goHome', function (newVal, oldVal) { MIP.viewer.open('/', {replace: false}); });