"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 或者更高.