最近Android Studio升级了, 顺便也升级了sdk版本, 但是升级过后编译项目提示"No toolchains found in the NDK toolchains folder for ABI with prefix: mipsel-linux-android". 刚开始很懵, 上网找了下原因, 觉得说的都不是特别清晰, 翻了下谷歌官网(一定要英文版, 中文版更新太慢), 弄清楚了原因, 记录在此.
这里先不卖关子了, 直接说解决办法.
新建或者修改`local.properties`, 将
ndk.dir=/Users/along/Library/Android/sdk/ndk-bundle
指向一个老版本, 比如:
ndk.dir=/Users/along/Library/Android/sdk/android-ndk-r14b
即可解决.
接下来说下为什么可以这样解决:
mipsel是一个精简指令集架构, 类似于arm/x86的架构, 详情见wiki. 大概是这个架构上没有多少人开发, 谷歌官方觉得多维持一个无用的架构太费功夫, 索性不再支持这个架构了.
看下 android-ndk-r14b, 是有arch-mips的.
在看下最新的ndk版本: 已经没有mips架构了. 而且是所有版本都不带mips架构了.
查看下安卓官网(https://developer.android.com/ndk/guides/abis), 说NDK r17时移除了MIPS架构的支持. 既然都移除了, 当然就找不到了. 我这里就是因为更新了sdk里的ndk版本, 最新的版本去除了MIPS架构导致的报错. 这种情况, 下个NDK r16及以下的版本, 就可以解决这个问题.
Note: Historically the NDK supported 32-bit and 64-bit MIPS, but support was removed in NDK r17.
按道理说, 我又没有打mips的so, 有没有mips架构的ndk和我有关系么? 抱歉, 真有. 这又要说到gradle-plugin, gradle-plugin 在3.1.0之前, 默认为mips/mips64/armeabi打apk. 没有MIPS架构的ndk, 打包当然就失败了. 而且在最新的gradle版本中, 如果你需要为armeabi打so, 需要通过`include ‘armeabi’`来指定.
看下gradle插件官网描述(https://developer.android.com/studio/releases/gradle-plugin):
When building multiple APKs that each target a different ABI, the plugin no longer generates APKs for the following ABIs by default: mips, mips64, and armeabi.
If you want to build APKs that target these ABIs, you must use NDK r16b or lower and specify the ABIs in your build.gradle file, as shown below:
splits {
abi {
include 'armeabi', 'mips', 'mips64'
...
}
}
所以这里最终解决办法有两种:
一种是ndk版本, 找个低于r17的ndk, 有MIPS, 然后使用ndk.dir指向.
一种是升级gradle版本, 升到3.1.0, 就不会再打MIPS架构的apk了, 就不需要MIPS的ndk了.
修改为 com.android.tools.build:gradle:3.1.0 或者更高.