Android 平台编译 JavaScriptCore 实践

2018-12-21

介绍

如何编译在 Android 上用的 JavaScript Core 呢?React 社区提供了一个 jsc-android-buildscripts 项目,专门用于构建编译供 Android 使用的 JavaScriptCore。由于 Hybrid 移动开发技术的发展,编译 JavaScript Core 的过程已经得到了大大简化。

项目主页在这里,详细介绍可以参见链接内的介绍。

在本文中记录了我使用 jsc-android-buildscripts 的构建经历。

构建

Step1:clone jsc-android-buildscripts 工程。

  • 进入工程根目录。

Step2:npm run clean,先清理一下工程。

Step3:npm run download,下载编译所需的资源。

  • 具体执行的是 scripts/download.sh
  • 执行过程中会下载源代码。

Step4:npm run start,进行编译。

  • 具体执行的是 scripts/start.sh
  • JavaScriptCore 还依赖了 ICU,因此会首先编译 ICU。

编译完成后,会进入 createAAR 过程,将个平台下的 so 封装到一个 AAR 里面去。

遇到的问题

编译过程肯定不会是一帆风顺,肯定会遇到问题,不过,有问题就有原因,找到原因解决即可。编译过程遇到的问题有:

问题一:环境变量 ANDROID_HOMEANDROID_NDK 未指定。

解决方法,添加环境变到到对应的位置。

我发现,编译过程一旦中断,重新运行 npm run start 时会从头开始,再次经历漫长的过程。

问题二:realpath: command not found

问题三:磁盘空间不足

  • 编译时我的电脑只剩下不到 2GB 的空间,没想到不够用
  • 编译时需要注意,多留出一些硬盘空间来

08m:42s 后,终于完成了 WebKit 的编译,但是我太天真了,这只是在一个平台上的编译完成,我忘记 Android 有多种平台架构了,估计所有平台编译完得至半个多小时时间……

问题四:gradle-4.8-all 下载失败

当 JavaScriptCore 编译完成之后,下一步是生成 aar。在初始化项目的 gradle 的时候,需要联网下载 gradle-4.8-all.

由于国内的网络情况,始终下载出错。

我采取的办法是,在浏览器中下载 gradle-4.8-all.zip,并将它拷贝到以下位置:

~/.gradle/wrapper/dists/gradle-4.8-all/41c9mvq2w0645xx6nsenaerjl/gradle-4.8-all.zip

彩蛋

在完全编译完成后,脚本还向屏幕中输出一句:

I am not slacking off, my code is compiling.

哈哈哈,乐死我了。

现成的二进制

其实 jsc-android-buildscripts 已经对外提供了编译好的二进制,如果我们只想拿来用的话,无需自己编译,直接拿过来用就可以。

二进制作为一个 npm 库提供出来,这个库装在本地后,实际上是一个本地 Maven 库。

结论

最终,我们成功打出了 JavaScriptCore 的 Android AAR 包。编译过程至此就告一段落了,下一步考虑如何在 Android 工程中使用 JavaScriptCore。