"No toolchains found in the NDK toolchains folder for ABI with prefix: mipsel

  • 2019 年 10 月 7 日
  • 笔记

最近Android Studio升级了, 顺便也升级了sdk版本, 但是升级过后编译项目提示"No toolchains found in the NDK toolchains folder for ABI with prefix: mipsel-linux-android".  刚开始很懵, 上网找了下原因, 觉得说的都不是特别清晰, 翻了下谷歌官网(一定要英文版, 中文版更新太慢), 弄清楚了原因, 记录在此.

这里先不卖关子了, 直接说解决办法.

1. 解决方案:

新建或者修改local.properties, 将

ndk.dir=/Users/along/Library/Android/sdk/ndk-bundle

指向一个老版本, 比如:

ndk.dir=/Users/along/Library/Android/sdk/android-ndk-r14b

即可解决.

2. 原因:

接下来说下为什么可以这样解决:

2.1 被官方放弃的MIPS

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.

2.2 gradle plugin的影响

按道理说, 我又没有打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'

     

 }

}

3. 最终解:

所以这里最终解决办法有两种:

一种是ndk版本, 找个低于r17的ndk, 有MIPS, 然后使用ndk.dir指向.

一种是升级gradle版本, 升到3.1.0, 就不会再打MIPS架构的apk了, 就不需要MIPS的ndk了.

修改为 com.android.tools.build:gradle:3.1.0 或者更高.