RN调试npm包java

42 阅读3分钟

React Native原生模块Java代码的开发与调试流程

在将Java代码打包成NPM包之前,确实需要先进行开发和调试。以下是React Native原生模块Java代码的典型开发调试流程:

1. 使用示例应用进行开发

大多数原生模块开发者会创建一个示例应用来测试和调试模块:

my-native-module/
├── android/                # 模块的Android代码
├── ios/                    # 模块的iOS代码
├── src/                    # JavaScript代码
└── example/                # 示例应用
    ├── android/            # 示例应用的Android项目
    ├── ios/                # 示例应用的iOS项目
    └── src/                # 示例应用的JS代码

这种结构允许您在真实环境中开发和测试模块。

2. 本地链接开发

使用本地链接将模块链接到示例应用:

# 在模块目录中
npm link

# 在示例应用目录中
npm link my-native-module

或者在示例应用的package.json中直接引用本地路径:

"dependencies": {
  "my-native-module": "file:../"
}

3. Android Studio调试

这是调试Java代码的关键步骤:

  1. 打开Android Studio

    # 在模块的example/android目录中
    open -a "Android Studio" .
    # 或在Windows上直接打开Android Studio并导入项目
    
  2. 配置调试设置

    • 创建调试配置
    • 选择"app"模块
    • 选择设备(模拟器或真机)
  3. 设置断点

    • 在您的Java代码中设置断点
    • Android Studio会显示源代码,因为它是从本地文件系统加载的
  4. 启动调试会话

    • 点击"Debug"按钮
    • 应用会在设备上启动
    • 当代码执行到断点时,Android Studio会暂停执行
  5. 调试功能

    • 检查变量值
    • 单步执行代码
    • 评估表达式
    • 修改变量值

4. 使用日志进行调试

在Java代码中添加日志语句:

import android.util.Log;

@ReactMethod
public void downloadPackage(String url, String savePath, Promise promise) {
    Log.d("RNFsMiniApp", "开始下载: " + url + " 到 " + savePath);
    // 实现...
    Log.d("RNFsMiniApp", "下载完成");
}

然后使用logcat查看输出:

# 在终端中
adb logcat | grep RNFsMiniApp

# 或在Android Studio的Logcat面板中

5. 热重载与快速迭代

  1. Java代码修改

    • 在Android Studio中修改Java代码
    • 重新构建应用(⌘F9或Ctrl+F9)
    • 有时需要重启应用
  2. JavaScript代码修改

    • 修改JS代码
    • 保存文件,React Native会自动重新加载

6. 使用React Native开发者菜单

在设备上摇动或按菜单键,打开开发者菜单:

  • 选择"Debug JS Remotely"调试JavaScript
  • 使用"Reload"重新加载JS代码
  • 使用"Show Inspector"检查UI元素

7. 创建测试用例

在示例应用中创建测试用例,验证模块功能:

// example/src/App.js
import React from 'react';
import { Button, Text, View } from 'react-native';
import MyNativeModule from 'my-native-module';

export default function App() {
  const [result, setResult] = React.useState(null);
  
  const testDownload = async () => {
    try {
      const res = await MyNativeModule.downloadPackage(
        'https://example.com/test.zip',
        '/storage/downloads/test.zip'
      );
      setResult(`成功: ${JSON.stringify(res)}`);
    } catch (error) {
      setResult(`错误: ${error.message}`);
    }
  };
  
  return (
    <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
      <Button title="测试下载" onPress={testDownload} />
      {result && <Text>{result}</Text>}
    </View>
  );
}

8. 使用模拟器和真机测试

  • 在模拟器上测试基本功能
  • 在真机上测试硬件相关功能
  • 测试不同Android版本和设备

9. 调试常见问题

  1. 模块未注册

    • 检查Package类是否正确实现
    • 确认MainApplication中已添加Package
  2. 方法未暴露

    • 确认使用了@ReactMethod注解
    • 检查方法签名是否正确
  3. 类型转换问题

    • 检查JS和Java之间的类型映射
    • 使用适当的类型转换
  4. 线程问题

    • UI操作需要在主线程执行
    • 长时间操作应在后台线程执行

10. 发布前的最终测试

在将模块打包为NPM包之前:

  1. 清理示例应用中的依赖
  2. 使用npm pack创建本地包
  3. 在新的测试应用中安装本地包
  4. 验证所有功能正常工作

只有在完成所有这些测试和调试步骤后,才能确信Java代码可以正常工作,然后再发布为NPM包。

这种开发流程确保了您可以在真实环境中调试和测试Java代码,然后再将其打包分发。