一.背景
入手了apple macbook m1芯片版本,迫不及待的想配置开发环境进行开发调试,但是却遇到了如下Android Studio同步报错问题:
二.复现步骤
2.1.配置jdk
首先下载jdk:
https://cdn.azul.com/zulu/bin/zulu11.50.19-ca-jdk11.0.12-macosx_aarch64.dmg
(这里为什么要用zulu jdk呢,因为zulu提供了m1芯片版本的openjdk,如果使用oracle jdk或者其他的openjdk,则是intel架构的版本,虽然m1可直接运行,但是指令转换始终会有性能损耗,故选择了专门为m1架构适配编译的zulu jdk)
然后配置jdk环境
export JAVA_HOME=/Library/Java/JavaVirtualMachines/zulu-11.jdk/Contents/Home
export PATH=$PATH:$JAVA_HOME
最后配置Studio的jdk为zulu的:
2.2.导入使用了AndResGuard的项目
配置好了m1的Android Studio开发环境后,开始导入一个使用了AndResGuard的项目,然后问题出现了:
三.问题定位
3.1日志分析
通过错误日志,可以看到是找不到SevenZip-osx-aarch_64.exe文件:
A problem occurred configuring project ':app'.
> Could not resolve all files for configuration ':app:AndResGuardLocatorSevenZip'.
> Could not find SevenZip-osx-aarch_64.exe (com.tencent.mm:SevenZip:1.2.13).
Searched in the following locations:
https://mirrors.tencent.com/nexus/repository/maven-public/com/tencent/mm/SevenZip/1.2.13/SevenZip-1.2.13-osx-aarch_64.exe
但是一般maven仓库报错是报aar 或者jar找不到,这个exe是什么鬼,先拉源码断点调试下
3.2.断点调试
先clone AndResGuard源码
git clone https://github.com/shwenzhang/AndResGuard.git
导入Studio,做好gradle插件调试配置
这里主要是添加一个Remote JVM Debug;
(注意现在已经打开了两个项目,一个是使用了AndResGuard的项目,一个是AndResGuard源码项目)
这时候通过命令行cd到使用了AndResGuard插件的项目执行如下命令
./gradlew app:assembleDebug -Dorg.gradle.daemon=false -Dorg.gradle.debug=true
执行完,gradle会卡住,等待附加调试器,这时候切到上面添加了Remote JVM Debug的AndResGuard源码工程,打下断点,点击执行图中的按钮附加调试器:
然后可以看到执行到下断点的地方
通过断点看到内存数据,存在kv键值对:
classifier -> osx-aarch_64
osx-aarch_64是通过获取运行时系统特征获取到的:project.osdetector.classifier
单步调试完,发现代码执行到File file = config.fileCollection(dep).singleFile,就抛出了找不到SevenZip-osx-aarch_64.exe异常,所以应该是osx-aarch_64类型的exe不存在,check AndResGuard的7zip目录,确实不存在SevenZip-osx-aarch_64.exe文件:
所以这里只需要提交下SevenZip-osx-aarch_64.exe文件就可以解决这个问题了
4.问题解决
下载https://www.7-zip.org/a/7z2103-mac.tar.xz,改名为SevenZip-osx-aarch_64.exe提交仓库,编译一个新的版本即可解决问题