RN 框架工程相关指南

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 下载链接如下:

编译运行

快捷键: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 成员 A
  • DEF.javamethodB 方法修改… …——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..mkAPP_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)。

原创声明,本文系作者授权云+社区-专栏发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

晋中望的专栏

1 篇文章1 人订阅

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Brian

Linux 基础知识

---- 简要 作为了一个服务端开发人员而言,不仅有强大的内功而且也需要对一些工具和运维方面的知识。Linux毋容置疑是每一个后端开发人员必须熟悉或者精通的“大...

3025
来自专栏张戈的专栏

分享一个自写的Python远程命令和文件(夹)传输类

最近在跟一个自动化发布平台的建设事项,其中 Linux 系统的远程控制通道则由我独立开发完成,其中涉及到了 Linux 系统远程命令和文件传输操作。 因为之前写...

3897
来自专栏熊二哥

Git快速入门

由于GIT刚刚开始使用不久,经常会在Merge时出现没有change-id的情况,在结合gerrit使用时,经常出现不能提交的情形,使得自己很困扰。最近有次熬夜...

18910
来自专栏菩提树下的杨过

IIS7上部署Asp.Net4.0时UrlRouting的若干问题

今天把公司的一个小web项目从Asp.Net3.5升级到Asp.Net4.0,结果在UrlRouting上遇到一系列很纠结的问题.(注:Url路由是Asp.Ne...

19810
来自专栏同步博客

Memcached与MySQL数据同步

  在生产环境中,我们经常使用MySQL作为应用的数据库。但是随着用户的增多数据量的增大,我们将会自然而然的选择Memcached作为缓存数据库,从而减小MyS...

672
来自专栏河湾欢儿的专栏

XSS

XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。比如这些代码包括HTML代码和客户端脚本。攻击者...

851
来自专栏Laoqi's Linux运维专列

日常shell练习题-03(持续更新…)

1573
来自专栏LIN_ZONE

laravel+阿里大于实现发送验证码短信

之前在laravel中使用composer安装阿里大于的扩展包,但是尝试之后,一直返回code=11的错误码,是扩展包的权限不足,具体原因还未找到

662
来自专栏云计算教程系列

如何在Ubuntu上构建Android ROM

Android是当今世界上最流行的操作系统。数以百计的不同设备制造商选择将其安装在他们的设备上,因为它是免费的开源的,并且围绕它构建了大量的应用程序和服务生态系...

1250
来自专栏云计算教程系列

如何使用LVM快照将MySQL数据库备份到腾讯云COS

定期数据库备份是防止意外数据丢失事件的关键步骤。设计有效的备份和恢复策略通常需要通过恢复速度,数据完整性和备份覆盖来权衡性能影响,实施成本和数据存储成本。最佳解...

1062

扫码关注云+社区