Caused by: java.io.IOException: error=2, No such file or directory
本着尝鲜的心态,最近把Android studio
升级到了Android Studio 3.1.2
,升级之后项目突然不能正常编译运行了,报:
:app:transformNativeLibsWithStripDebugSymbolForDebug
Caused by: java.io.IOException: error=2, No such file or directory
详细报错信息:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
问题分析:
看最后一段报错信息:
- 1
- 2
- 3
- 4
- 5
- 6
java IO异常,找不到文件或者目录。一般报这种问题,都是缺少文件。既然是缺少文件,那我们向上看,看看缺少哪些文件或者目录,找到了这个路径:
- 1
我们根据这个路径,去看看是不是真的缺少这个文件或者目录:
/Users/yang/Library/Android/sdk/ndk-bundle/toolchains/mips64el-linux-android-4.9/prebuilt/darwin-x86_64/
上面这个目录下缺少文件,只到了.../prebuilt/darwin-x86_64/
这个层级,缺少.../prebuilt/darwin-x86_64/bin/mips64el-linux-android-strip
这个目录是ndk预编译的一种工具链,用来预编译以mips CPU指令集的so文件。
我们看到Android SDK中ndk的版本为17.0.4754217
,最新的。我们猜测Google是在新版本的NDK中删去了对mips指令集CPU预编译的支持。
我们找一下老版本的NDK文件,看看该目录下是不是有完整的mips工具链文件,从这里下载老版本NDK文件:
https://developer.android.com/ndk/downloads/older_releases
我们下载上一个版本16b,下载解压后,到相同路径下去看,文件都是齐全的:
至此我们找到了问题的原因,Google在新版本17.0.4754217
的NDK中,删去了对mips指令集CPU预编译的支持,在预编译具有mips的so文件的项目时,就会报缺少文件或者目录的错误。
解决办法:
第一种:
这种方法最简单,在gradle文件中配置打包参数,打包时排除/mips64/
和/mips/
文件下的所有so文件。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
第二种:
删除/mips64/
和/mips/
文件下的所有so文件
第三种:
将SDK中的NDK回退到16b版本,去这里下载16b版本的ndk文件
https://developer.android.com/ndk/downloads/older_releases
解压之后,替换掉原来SDK中的ndk-bundle文件,即.../Android/sdk/ndk-bundle/
或者将解压后的.../prebuilt/darwin-x86_64/
,复制过去,这样17版本的ndk也具有了预编译mips so文件的能力