前言 链接到标题
由于我们有一个双创项目需要开发一个用于演示远程控制自动化设施的控制面板,同时如果能同时开发网页端和手机端那最好。时间紧任务重,我选择了使用React Native。(至于为什么不是Flutter呢,因为我觉得我写TypeScript的效率比写Dart的效率高)
本文记录了我在开发与构建时踩到的很多的坑,并大致描述了我的折腾历程。
我是使用Expo来创建并管理这个项目的。因为省事。
路由 链接到标题
我从登录界面跳转到主界面的时候用的是router.replace。在Web上能正常工作,但是在Android上没有成功跳转。
最后发现其实是跳转了的,只是因为我把是否已经登录使用boolean存储,设置的默认值是false,而我在还没有把这个值获取出来的时候就去判断了,当然就直接跳转回登录界面了。
不过我还是不太能理解为什么在Web上正常工作,但是Android上就不行了。
构建 链接到标题
使用Expo的服务器来进行免费的构建,大大的方便。但是需要排队一会儿,所以我还是倾向于在本机编译。
由于我本机使用的是Windows,以及我又懒得切换系统,所以选择了使用WSL来进行构建任务。(Expo只支持正在Linux和MacOS上进行构建安卓应用)
WSL 链接到标题
由于我之前是在Windows上进行开发的,所以到了WSL里面还需要再配置一遍开发环境。使用apt安装npm。然后安装expo的软件包。
sudo npm install -g eas-cli
sudo npm install -g expo-cli
Android SDK 链接到标题
安装Android SDK的流程我是参考这篇文章的:https://medium.com/@barcelos.ds/install-android-sdk-in-the-ubuntu-20-04-lts-without-android-studio-1b629924d6c5
总能的来说没有遇到什么非常大的问题。
JDK 链接到标题
目前必须使用JDK 17来进行构建,否则一定会报错。
我一开始是习惯性地安装了GraalVM,然后编译失败。最后在sdkman!中换上了Oracle JDK才把问题解决掉。
当时出现的报错信息是这样的:
[RUN_GRADLEW] FAILURE:
[RUN_GRADLEW] Build failed with an exception.
[RUN_GRADLEW] * What went wrong:
[RUN_GRADLEW] Execution failed for task ':react-native-async-storage_async-storage:compileReleaseJavaWithJavac'.
[RUN_GRADLEW] > Could not resolve all files for configuration ':react-native-async-storage_async-storage:androidJdkImage'.
[RUN_GRADLEW] > Failed to transform core-for-system-modules.jar to match attributes {artifactType=_internal_android_jdk_image, org.gradle.libraryelements=jar, org.gradle.usage=java-runtime}.
[RUN_GRADLEW] > Execution failed for JdkImageTransform: /home/iruanp/android-sdk/platforms/android-34/core-for-system-modules.jar.
[RUN_GRADLEW] > Error while executing process /home/iruanp/.sdkman/candidates/java/17.0.11-graal/bin/jlink with arguments {--module-path /home/iruanp/.gradle/caches/transforms-4/d665602e84a280c1d9cc11bc0b8c3a7f-d8f2c8fe-52af-45f8-ac8c-d4af7195b6f6/transformed/output/temp/jmod --add-modules java.base --output /home/iruanp/.gradle/caches/transforms-4/d665602e84a280c1d9cc11bc0b8c3a7f-d8f2c8fe-52af-45f8-ac8c-d4af7195b6f6/transformed/output/jdkImage --disable-plugin system-modules}
目标 链接到标题
iOS应用我没有尝试过,因为我没有苹果的开发者账户。
安卓应用,只能选择universal的aab格式文件或者apk格式文件,而apk格式文件的体积能直接上60M。Expo不提供分别为不同架构编译apk的选项。这样蛮不适合我的。貌似不使用Expo就不会遇到这个问题。