Android - ReactNative Debug 技巧


前言

因为旧的项目使用了 RN,在修复 Bug 的时候,很难定位问题,在 Debug 的时候花费了大量的时间。今天小结下 Debug 技巧,以备日后使用。

笔者是 Android 程序员,因此总结 Android 和 ReactNative 之间的 Debug。

官网有介绍 ReactNative 的 Debug 技巧。如英文官网: https://reactnative.dev/docs/debugging 或者中文官网 https://reactnative.cn/docs/debugging.html 。 然而事情并没有那么简单,还是有些坑需要踩的。


开发环境

我的开发环境: AndroidStudio、WebStorm、RN 0.51 。

因此如果你是一名新手 RN 程序员在调试 Androd 程序,需要注意一下几点:

  1. Android 手机打开开发者选项,打开 USB 调试。

  2. 首先要做的就是使用 AndroidStudio 仅打开 Android 工程,配置好环境,例如配置 Android SDK 路径的路径,下载同步项目的依赖(没代理的话,gradle 最好配置阿里云的镜像)。先使用 AndroidStudio 让项目能跑起来,启动后闪退或者白屏也没关系。AndroidStudio 是专业的开发 Android 的 IDE ,当你的环境配置出错时,给出的错误提示信息更加全面,跑起来闪退/白屏是因为你还没有配置好 RN 相关的环境。

  3. 注意 Node.js 版本与你项目的 RN 版本,开发 RN 需要下载并配置 Node.js,在 Node.js 官网 中显示最新版本为 14.7.0,长期支持版本(LTS)为 12.18.3。一般下载软件,一般都下载稳定版本或 LTS 版本,因为出现问题的时候,可查询资料比较多。结果我就发现一个坑爹的事,项目中 RN 版本为 0.51 ,Mac 使用最新版本 Node.js 可以跑起来,而 Windows 却报错,查询资料后,将 Windows 版本回退到 12.10 版本,才编译通过。

  4. Web 前端开发人员在开发的时候喜欢使用 VSCode,而我使用 WebStrom 更加顺手。Android 项目的配置已经配置完毕,但是你未必跑得起来,因为 RN 环境还没配置呢,Node.js 配置好后,一般在 RN 工程根目录(pakcage.json 所在的目录)执行 npm install -g react-native-cli 和 npm install ,此时是下载依赖包到 node_modules 目录,这个过程未必会一帆风顺,一般情况下需要配置代理或者设置淘宝镜像,否则下载速度很慢。下载完之后,要注意看 npm install 过程中有没有报 error 。

  5. 接下来使用 WebStorm 打开整个 RN 工程。配置启动 Android (不配置也可以,使用命令行就可以运行,但是这样更方便):

点击左上角的 + 号,然后在弹出的列表中选择 ReactNative 单击:

为你的启动配置起个名字,默认名称为 Untitle,可以命名为 Android:

在 Mac 中,如果你的 node 环境和 ReactNative 环境已经配置好,那么配置中的 Node interpreter 以及 React Native package 路径应该会自动显示。如果还是没找到,就排查下环境或者手动指定吧。

React Natice 默认的启动端口为 8081,这个端口很容易被占用,如果在启动 RN 前,8081 端口已经被占用,那么 RN 工程启动会报错,端口被占用。这种错误常见于命令行启动了 RN 后,又打开了一个命令行启动 RN,或者又使用 Webstorm 的配置启动 RN。要么直接关掉占用端口的工程,要么命令行查找后,kill 掉。

Mac 排查端口占用的方法:找到占用端口的进程,然后 kill 掉找到的 pid:

sudo lsof -i:8081kill -9  

Windows 下同理:

netstat -ano | findstr :8081taskkill /PID  /F

配置好后,点击左上角的启动即可:

  1. 编译通过了,安装成功了,如果 Android 程序却没有跑起来,需要手动点击 App 图标,才能跑起来,WebStorm 控制台提示:
Error: Activity class {com.rn_test/com.rn_test.MainActivity} does not exist.

这是因为旧版本 CLI 默认启动的是 MainActivity 类,而你的 Android 工程中,在 AndroidManifest.xml 文件中,入口 Activity 声明的不是 MainActivity,例如你声明的是 LauncherActivity,如下:

                                                    

因此,你要手动指定启动 Activity,注意这里的写法:

react-native run-android --main-activity  LauncherActivity

或者配置中,配置启动参数:


启动之后的问题排查

1.启动之后,如果提示如下:

首先检测你的 Application 中,是否将 UseDeveloperSupport 设置为 true 了,如果设置为 true,意味着使用在线包,RN 使用的资源都从你电脑启动的 8081 服务器获取,那么你的 RN 服务器一定要启动,并且手机和电脑连接在同一网络下。

react-native run-android 命令行启动 或者 WebStorm 配置启动都会先启动服务器,如果启动后没有报错,就是网络问题或者 UseDeveloperSupport 的问题了。

UseDeveloperSupport 设置为 false,意味着离线包,一般正式环境打包才会这样做。

2.手机启动后,如果白屏或者摇一摇没反应或者 adb shell input keyevent 82 后没反应。正常情况下,手机上应该会出现 RN 的调试弹窗。

首先要确定代码中已经将 UseDeveloperSupport 设置为 true 。

旧版本的 RN 调试弹窗需要在手机中为应用开启悬浮窗权限,这个权限默认是关闭的,因此调试弹窗才没出现,或者说 RN 加载过程出错了,因为没有权限,错误信息无法在调试弹窗中显示,所以白屏了。

此时在手机中,找到应用,开启权限,重启应用即可。 有些人使用的是模拟器,找不到打开悬浮窗权限的入口,那么使用模拟器时加个简单的权限判断吧,6.0 以上使用 :

      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(context)) {            Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);            intent.setData(Uri.parse("package:" + getPackageName()));            context.startActivity(intent);        }

上述悬浮窗权限不要直接在生产环境使用,悬浮窗权限判断比较复杂。在 Android 8.0 中 Settings.canDrawOverlays() 判断不准确。


正文

程序终于跑起来了,RN 界面终于显示了,笔者喜极而泣。那么怎么 Debug 排查问题呢?

我的两板斧:日志、断点。

如果Webstorm 的配置以 run 启动工程后:

  1. 在需要调试的位置调用 console.log()。那么在哪里查看日志呢?在 RN 工程下,命令行输入 react-native log-android,可以查看 RN 的打印日志。如果华为手机无法正常打印日志,参考 博客 ,我的华为手机有时候打印日志,有时候不打印,因此我直接换了个手机。

  2. WebStorm 启动 RN 工程后,使用 AndroidStudio 打开 Android 工程,可以直接使用 AndroidStudio 的相关工具,如 Attach Debugger to Process 或者结合 Android 的 Log,可以在 Logcat 中查看原生的日志。这里看不到 RN 的日志,所以排查问题时,需要两个 IDE 结合一起看。


如果 RN 的配置以 Debug 方式启动工程后:

可以像 AndroidStudio 一样断点调试,当然这样会比较卡顿。

  1. 运行过程中,程序闪退了,注意查看 AndroidStudio 的 Logcat 崩溃日志。

Tip

调试 RN 过程中,尽量不要使用华为手机调试:

  1. 有的华为手机无法打印出 RN 日志。
  2. 有的华为手机无法使用 AndroidStudio 断点,具体表现为,华为手机遇到断点后,过了几秒钟会直接闪退。

RN 官网上可以说调试还可以使用 react-devtools,这个工具我没用过,该工具对版本有要求:

Version 4 of react-devtools requires react-native version 0.62 or higher to work properly.

最后

我个人不喜欢 RN,因为原生开发都会遇到很多坑,而简单需求的没必须要用 RN ,复杂的需求用不了,还有个原因就是 js 代码一坨一坨的,不美观。

为了修 Bug ,看了两天 React.js 代码,修复了 RN Bug 。庆幸之前学习过 Vue.js ,这让我很快上手 React.js 。

自己做过原生 iOS、又做过 Android,所幸没花费太多时间。

更多相关文章

  1. 箭头函数的基础使用
  2. NPM 和webpack 的基础使用
  3. Python list sort方法的具体使用
  4. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
  5. 我的android 第8天 - 单元测试
  6. Android程序入口ActivityThread和Android应用程序启动流程详解
  7. simple guide for porting android kernel
  8. Android开发设置Activity全屏与不全屏的方法
  9. [ IOS-Cocos2d-x (Box2d)游戏开发之四] -Cocos2d-x for android

随机推荐

  1. Android(安卓)8.0 Oreo新特性
  2. 四、android studio使用自己库编译工程
  3. android database SQL language
  4. Android背景透明的 Dialog
  5. Android触屏事件处理流程浅析
  6. Android内存监听的方法
  7. 浅析移动开发
  8. 通过aidl service调用activity
  9. android apk 应用 重新签名 方法
  10. Android(安卓)开发艺术探索读书笔记 9 --