Apple Silicon 移动端开发填坑记录(持续更新)

尽管网络上已经有很多关于使用了 Apple Silicon: M1 设备(包括 MacBook Air,MacBook Pro 和 Mac mini)的开箱 & 介绍和性能评测,但评测毕竟是评测,如果你作为一个目标用户,那么可能还是想看点对你购入和日常开发有帮助的而且容易检索的内容。

于是便有了本文。

先说一下 Mac mini 使用体验:

  • 非常安静。使用几天下来,编译我司 Android 项目完全没声音,个人项目更加不用说了。使用以往的 MacBook Pro,风扇声可以说是一个能干扰思考的噪声了。
  • 16 GB 的 UMA(统一内存架构)很能抗,效果能跟以往 32GB 的比。
  • 可以看到 macOS Big Sur 对 M1 是有优化的,相比之下,Intel chip 的设备上跑的 macOS Big Sur,从感觉上来说像是通过转译在跑...
  • 因为需要经过「一番折腾」才能适配好你的工作环境,所以可能还不是一个很好的入手时机,至少你不应该在没有任何其他非 ARM 的电脑下去完全单独使用它。

下文便是「一番折腾」的描述 —— 当然也不算很折腾,至少我觉得对这电脑的目标用户来说,这点折腾是需要会而且值得的。

iOS 开发

配置 CocoaPods

iOS 开发方面,我自己项目主要还是用原生开发,使用 CocoaPods 做依赖管理。

Xcode 不用说,Apple 自然是已经适配了,照常到 App Store 下载即可。

CocoaPods 方面,因为还没适配,你需要安装 FFI (Foreign function interface):

sudo arch -x86_64 gem install ffi

然后这样 install 你的 pods:

arch -x86_64 pod install

arch -x86_64 表示使用 Rosetta 2 运行。

到此为止,我的个人(小)项目 MyerSplash 已经能编译并在 iOS & iPad OS & Intel 的 Mac 上运行了。因为用到 WCDB,里面有个函数支持还有问题,因此暂时还无法通过原生的方式在 M1 上编译通过。

Android 开发

配置 JDK + IDE

首先,Android Studio 还没有适配好 M1 的版本(包括 Canary),因此请打消使用 Rosetta 2 运行 Android Studio 开发的念头 —— 因为会非常非常卡。不过,Canary 版本开始,已经是基于 Intellij IDEA 2020.3.1 开发了,因此按理也很快了。

你需要使用 ARM 64 的 JDK + 已经适配了 M1 的 Intellij IDEA 2020.3.1.

https://link.zhihu.com/?target=https%3A//www.azul.com/downloads/zulu-community/%3Fos%3Dmacos%26architecture%3Darm-64-bit%26package%3Djdk

https://link.zhihu.com/?target=https%3A//www.jetbrains.com/idea/download/%3F_ga%3D2.202373522.2614415.1610627868-1704187074.1610627868%23section%3Dmac

JDK 安装好后,对于使用命令行编译的情况,你还需要手动 export 一下 JAVA_HOME,比如在你的 .zshrc 里:

export JAVA_HOME="/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home"

在使用 IDEA 打开 Project 后,你还需要在 Project 的 Module Settings 里设置使用上述的 JDK,而不是 IDEA 自带的 Java 11。

至此,你可以新建项目进行 Android 开发了。

Gradle 下的一些行为变更

在使用 ARM 64 的 JDK 后,在 gradle 下的根目录已经不是该文件所在项目的位置了。

也就是说,如果你的 gradle 代码是这样写的:

def file = new File("local.properties")

那么去打开这个 file 就铁定找不到了。

因此你需要改成传入 parent:

def file = new File(rootDir, "local.properties")

或者使用 project 的方法:

project.rootProject.file("local.properties")

读取项目目录下的文件是个很常见的需求(比如有一些重要文件不能 checkin 到 Git 的,需要在编译时读并存放到 BuildConfig 里),如果你遇到你的文件读取有问题,务必注意这点。

此外,如果你遇到了 Gradle Sync 的问题,比如无法 apply 某个 plugin。这情况下多数是因为你的 project JDK 设置没有设置对:

Profiler 无法使用的问题

暂时无解。使用 Android Studio 运行,光运行 Profiler 的话,效率目前看还是可以的。

Android Emulator 问题

https://github.com/google/android-emulator-m1-preview​github.com

目前只能使用上面的预览版本。这个需要你的 App 能编译出 ARM v8a 的 APK 才能安装上。

Flutter 开发

因为开发工具跟 Android 类似,这里就不再赘述了。根据官方描述,SDK 本身已经支持了,但不排除某些 package 可能会有问题:https://github.com/flutter/flutter/wiki/Developing-with-Flutter-on-Apple-Silicon​github.com