Check out 工程
工程 svn 路径:http://tc-svn.tencent.com/ReactNative/react_native_proj/branches/rn_39_release_project
工程结构介绍
目前框架内部主要为四个部分:
- app —- 应用主体业务部分(Module 1)
- ReactAndroid —- RNAndroid 源码部分 (Module 2)
- ReactCommon —- RNAndroid/RNiOS 公共源码部分
- jsbundle —- js 代码,包含第三方控件与 API、以及业务相关代码(目前为 Demo 集合展示)
配置 NDK 路径(Not Necessary)
如果有修改 c 代码重新打包新的 so 的需要,请在工程的 config/config.gradle
中将 ndkAutoBuild
参数设置为 true
:
此开关决定是否开启编译时 ndk 自动构建,默认为关。当打开时,若 c 部分代码存在改动,编译运行时会自动编译生成最新的 so 打入 apk,但是需要 Facebook 规定的 r10e 版本的环境。
请参照工程中提供的 local-template.properties
文件修改指定的 NDK 路径。
各平台的 NDK 下载链接如下:
- Mac OS (64-bit) - http://dl.google.com/android/repository/android-ndk-r10e-darwin-x86_64.zip
- Linux (64-bit) - http://dl.google.com/android/repository/android-ndk-r10e-linux-x86_64.zip
- Windows (64-bit) - http://dl.google.com/android/repository/android-ndk-r10e-windows-x86_64.zip
- Windows (32-bit) - http://dl.google.com/android/repository/android-ndk-r10e-windows-x86.zip
编译运行
快捷键:Control R (Mac) / Shift F10 (Win)
是不是很熟悉~ 是的,就是它的快捷键:
如果需要单独编译 so,也可以尝试在工程根目录下命令行输入:gradlew ndkBuild
打包 jsbundle
目前项目中使用的内置 jsbundle 暂命名为 index.android.bundle
,对应注册名为 rn
,放置在 app/src/main/assets
下。
如上文结构中提到,js 代码在 jsbundle 文件夹下,若需要编译打包新的 jsbundle,可以考虑直接在 jsbundle
目录下直接命令行运行 npm install
下载需要的依赖。下载完成后,可以尝试打包 jsbundle,打包命令为:
react-native bundle --platform android --dev true --entry-file UIExplorer/UIExplorerApp.android.js --bundle-output [YOUR BUNDLE DEST PATH]index.android.bundle
将生成的 bundle 放置在上文的路径即可。
PS:后面会支持读 SD 卡的外部 bundle。
RN 源码修改记录与同步(Important)
考虑到 FB 对 RN 的版本升级仍处于一个较为频繁的节奏,因此原则上我们需要尽量避免对 RN 源码进行修改,减少升级同步代码所带来的工作量。然而由于业务或工程需要(打入 log、修复隐藏的坑等等),不得不修改源码时,请将修改的部分在工程中的 CodeModificationAttention.md
文件中做好记录方便所有成员周知,例如:
ABC.java
中新增methodA
方法、新增paramA
成员变量… …——by 成员 ADEF.java
中methodB
方法修改… …——by 成员 B
具体请参照 CodeModificationAttention.md
内已修改部分即可。
RN 源码升级(Important)
PS:若需要升级 RN 源码请知会 joltwang && mangosmwang && timorzheng && xepherjin
当需要升级 RN 版本时,请确保从 github 上拉到的是已稳定 release 版本的 RN 源码!
从新的源码工程中提取出 ReactAndroid 与 ReactCommon 部分,替换至本工程对应的部分,需要注意的几点如下:
- 打开
ndkAutoBuild
开关(参考"配置 NDK 路径") - 拷贝过来后按照
CodeModificationAttention.md
补齐对应的修改(Important) - 删减不需要的平台的 so:修改 ReactAndroid 模块下
src/main/jni/Application..mk
中APP_ABI
参数,调整为APP_ABI := armeabi-v7a
- 移除
BUCK
相关的无用文件 - 对比更新 ReactAndroid 模块下的
build.gradle
中的下载编译逻辑,一些包括文件名与下载地址在内的常量信息同步更新至config/config.gradle
,并将最新的需要下载的文件提前下载好更新至preDownloads
目录下 - 升级完成后提交修改时,不要忘记提交最新的编译好的 so
混淆代码部分
待补充
常见问题
1、Q:打开 ndk 开关后编译报错:
Android NDK: ../FastArithmetic/ReactAndroid/src/main/jni/first-party/fb/Android.mk: Cannot find module with tag 'folly' in import path
A:请修改 NDK 版本为 r10e 版本,参照上文"配置 NDK 路径"。
2、Q:(接 1)为什么我修改了还是报这个错?
A:试试先 gradle sync ,再运行工程。
3、Q:为什么打开 ndk 开关后,我的 c 代码修改没有生效打进新的 so 中?
A:请关闭 Instant Run 功能(AS Ver >= 2.0),并设置强制每次编译强制安装最新的 apk:
4、Q:为什么 npm install 很慢,一直卡在那里不动了?
A:请切换到 staff-wifi 再运行(Mac)。
5、Q:为什么最新的 RN 官方源码工程打开后一直在 gradle sync?
A:请切换到 staff-wifi 再运行(Mac)。