单独使用IntelliJ IDEA开发Flutter安卓应用的编译问题

Macbook Pro的存储空间是很昂贵的,做移动端开发,即使你原来已经有熟手的IDE(我是IntelliJ IDEA和VSCode分别对应Java开发和其它所有开发),还需要Android Studio、Xcode这两个庞然大物。Xcode实在是躲不过去,但是AS吧,它就是个用IntelliJ平台改的货,实在没有必要多牺牲那么多昂贵的SSD空间。安装Flutter、JDK、插件等等IntelliJ IDEA都不在话下,安卓的SDK管理和AVD管理也都问题不大,就是注意$ANDROID_HOME(我的在~/Library/Android/sdk下)和$ANDROID_AVD_ROOT(我是放在~/.android/avd里)两个环境参数要设置好,再把$ANDROID_HOME/tools$ANDROID_HOME/platform-tools$ANDROID_HOME/build-tools/[sdk版本号]都加进系统$PATH环境参数里,开发环境基本上就能顺利地跑起来。
然而,当要在安卓模拟器或者真机上测试的时候,会出现构建错误,如:

Unable to make field private final java.lang.String java.io.File.path accessible:module java.base does not "opens java.io" to unnamed module @xxxxxxx

上网一查,发现这是JDK版本的问题,大部分的建议是让把JDK降级到11甚至8。如果用的是JDK16以上但是出现的不是上述的错误,需要检查一下Gradle的版本。我没有在系统里全局安装Gradle,项目用的是Flutter模板给的gradle-wrapper的6.7版本,这个版本跟JDK16不太兼容,我的解决办法是在项目根目录/android/gradle/wrapper里的gradle-wrapper.properties文件里把distributionUrl参数改成最新版本的Gradle包(我现在用的是7.2):distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-all.zip,这样估计就会出来上面的编译错误了。
言归正传,不管是一般软件还是编译器,我从来都喜欢用最新的稳定版,像老版本的JDK,编译出来的程序运行效率不够优化不说,光是不支持块状文本String变量的书写,我就受不了,因为我常用的某个API需要输入大篇幅的脚本文本。于是我是离不开我的JDK16(这个星期已经成17了)的,不降级JDK有什么办法通过安卓端的编译呢?方法是有的。

解决办法1:

在IDEA的设置里的“Build,Execution,Deployment”下的“Gradle-Android Compiler”,在右边的“Command-line Options(命令行选项)”里加入:

--add-exports=java.base/sun.nio.ch=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED

解决办法2:

也可以把这些JVM运行参数加到项目名/android/gradle.properties文件的org.gradle.jvmargs=-Xmx1536M的后面。

总结

两种解决办法本质上是一样的,就是运行安卓的Gradle编译器时加上相应的JVM参数,区别是方法1等于是在IDE全局加上这些参数(我就是这么干的,因为我总是喜欢在新版的JDK上开发,全局加参数一劳永逸),方法2是只针对具体项目设置。

这样,就可以在IDEA上愉快地折腾Flutter的Android开发了。

你可能感兴趣的:(单独使用IntelliJ IDEA开发Flutter安卓应用的编译问题)