如何使用 Android Studio 调试原生反应原生库?

Posted

技术标签:

【中文标题】如何使用 Android Studio 调试原生反应原生库?【英文标题】:How to debug native react native libraries with Android Studio? 【发布时间】:2017-04-14 13:57:09 【问题描述】:

这个问题不是关于如何调试 React-Native 应用程序的 javascript-land。它是关于如何在 node_modules-folder 中调试 native library(在本例中为 JAVA-Code)。

虽然使用 XCode 调试 RN 应用程序的原生 ios 部分对我来说非常容易,但我偶然发现了 android Studio 的各种问题...... 最主要的是,将项目导入 Studio 后 node_modules-Folder 不存在,为什么无法设置断点进行调试。

版本:

Android Studio 2.2.2(当前最新版本) react-native 0.38.0(也是最新版本) gradle 1.3.1(从 react-native init 预配置) 也尝试升级到 gradle 2.2.2 安装的 Android SDK 和 -Build Tools 最高版本 23,包括 NDK

我是如何做到的/重现的步骤

1.创建新的 react native 项目:

react-native init debugTest

2。使用您想在本地调试的本地代码安装第三方库

cd debugTest && 
react-native install react-native-sqlite-storage

3.确保一切都可以在 android 端运行:

启动 GenyMotion

启动 AVD

在终端中使用此命令运行应用程序:

react-native run-android

(这将打开打包程序以及传输 js-bundle 所需的所有其他内容)。 如果想省略这一步,需要手动启动打包器:

node node_modules/react-native/local-cli/cli.js start

4.启动 Android Studio

在即将出现的启动器对话框中,选择“导入项目” 选择你项目的目录“android”并点击“import” (这些步骤来自official RN-documentation):

如果您想使用 Android Studio 处理原生代码,请从 Android Studio 的欢迎屏幕选择“导入项目”并选择 您应用的 android 文件夹。

5. Android Studio 要求将 gradle 版本从预配置的 1.3.2 更新到 2.2.2。我首先否认了整个工作流程,后来我尝试了一下(两者对我来说没有太大区别)

6.由于this issue

,必须停用Instant Run

7.点击Android Studio工具栏中的“运行”或“调试”

到目前为止一切正常。我能够在 MainApplication.java::onCreate 中设置断点,然后可以进入此方法。

但这里有一些问题:

    node_modules-Folder 在 Android Studio 中不存在,因此无法通过这种方式进行调试。如何实现?

    调试 onCreate-Method 并进一步深入 Java 堆栈,非常奇怪的是,“源代码与字节码不匹配”

调试器挂在源代码 cmets 中的其他位置,但不完全是在选择执行的那一行。

Android SDK:

我已经安装了所有 SDK 和构建工具和 NDK 以及自版本 23 以来的所有其他内容:

TL;DR:

如何使用 Android Studio 调试 React Native 应用程序的 node_modules-Folder 中存在的原生库,因为它们在 AS 中不可见,因此无法通过断点?

更新

我终于找到了根本原因。对我来说,它不起作用,因为我想调试的库没有在 Android Studio 中显示。但这是我自己的一个错误,因为库没有正确设置,为什么 gradle 无法注意到它。

因此,这个问题可以像博客文章一样使用,如何正确使用(如果 3rd 方库使用“rnpm-link”或“react-native link”开箱即用就足够了)[其中在我的示例中不是这种情况]

【问题讨论】:

【参考方案1】:

你做过rnpm linkreact-native link 吗?一旦你这样做了,就会有额外的模块和 app 模块一起出现,就像这样。

你可以查看native模块中的所有java代码并放置breakdpoints、debug等

【讨论】:

你是如何将 RN-project 导入到 android studio 中的?跟我一样吗? 我通常只是从 Android Studio 中打开 android 文件夹而不是导入。但我想它也有同样的目的。您是否尝试过从 android studio 或 gradle sync 构建项目,通常它会在 build.gradle 发生更改时提示。不应该是npm install react-native-sqlite-storage --save 而不是react-native install react-native-sqlite-storage 吗? 后一种(react-native install...)是“较新”的命令,包括“npm install --save”(或yarn install)和react-native link,是现代的“rnpm 链接”的形式。我也尝试手动逐步同步,文件夹仍未显示,但存在于文件系统中 我终于明白了……你为我指明了正确的方向。现在将提交答案【参考方案2】:

Bam....我现在可以自己回答这两个问题中的第一个。感谢@agent_hunt,他让我走向了正确的方向......

在此示例应用程序中,绑定设置不正确。 “rnpm 链接”和较新的“react-native 链接”,它是“react-native 安装”的一部分,在 android-part 中无法正常工作,因为它没有在 3rd-party-library 权利中实现现在,我已经在这个例子中使用了。

这就是 gradle 没有注意到这个库的原因。正确设置后,文件夹 react-native-sqlite-storage 出现在 Android Studio 中,我能够通过断点并在那里停止执行。

尽管如此,调试这个库工作正常,但是当我不想进入 android SDK 的较低/“更深”的方法时,它仍然有问题指向正确的代码行 (“源代码没有匹配字节码")

【讨论】:

以上是关于如何使用 Android Studio 调试原生反应原生库?的主要内容,如果未能解决你的问题,请参考以下文章

原创如何在Android Studio下调试原生安卓Framework层面的源代码

在 Android Studio 中调试原生代码

Android调试系列—使用android studio调试smali代码

使用 Android Studio 调试 Android NDK

Android逆向 Android Studio动态调试smali代码

使用Android Studio调试系统应用之TvSettings:build.gradle