"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".  剛開始很懵, 上網找了下原因, 覺得說的都不是特別清晰, 翻了下Google官網(一定要英文版, 中文版更新太慢), 弄清楚了原因, 記錄在此.

這裡先不賣關子了, 直接說解決辦法.

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. 大概是這個架構上沒有多少人開發, Google官方覺得多維持一個無用的架構太費功夫, 索性不再支援這個架構了.

看下 android-ndk-r14b, 是有arch-mips的.


在看下最新的ndk版本: 已經沒有mips架構了. 而且是所有版本都不帶mips架構了.


查看下Android官網(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 或者更高.