NDK is missing a “platforms” directory. 问题解决

背景

第一次开发Native项目,需要在AndroidStudio(简称AS)上配置好NDK。

环境配置:AGP版本=3.4.2,compileSdkVersion=28,targetVersion=26,NDK版本=22.0.7026061,cmake.abiFilters="armeabi-v7a", "arm64-v8a"。

问题

  1. 在下载并配置好NDK后(下载:AS的SDK Tools),sync报错NullPointerException,但它其实是“NDK is missing a "platforms" directory.”引发的,只是这一句日志被标记为警告。
  2. 基于问题一,在网上找了个解决方式(我信了它的邪😭),在ndk目录下新建一个“platforms”的文件夹就可以sync过了。但是接下来又编译报错“Error:ABIs [arm64-v8a] are not supported for platform. Supported ABIs are [armeabi-v7a, x86]”。

解决过程

问题二的难点在于造成类似“ABIs [arm64-v8a] are not supported for platform”的原因有好几种,我归纳总结为:

  1. NDK升级到17之后,不再支持armeabi架构。因此NDK升级是有可能造成类似 “ABIs [xxx] are not supported for platform”的错误;
  2. compileSdkVersion设置为19,也会导致这个问题,因为版本号为19的系统只能是32位的;
  3. 对自己和对NDK的不信任:对自己不信任是因为对编译的东西还不够熟悉,总觉得自己哪里配置出错了;对NDK不信任是觉得从官网下载的NDK为什么会出现“问题一”呢?是不是NDK下载错了,或者xxxxx的原因。

解决方式

根据问题二报出的堆栈信息,进行断点调试:

adb命令:./gradlew :[module]:installDebug -Dorg.gradle.debug=true --no-daemon 。(AGP7以上需要自己处理下Java11兼容问题)

关键断点行:NdkHandler -> supports64Bits() (找不到这个类的同学在app的build.gradle下implementation一下AGP,例如 "com.android.tools.build:gradle:3.4.2")。

问题原因:编译时Gradle会判断这次编译实际支持的abi,当在build.gradle下配置的abi不属于实际支持的abi时,就会报错“ABIs [arm64-v8a] are not supported for platform...”。

实际支持的abi的判断方式为:

判断前提:gradle认为highestVersion>=20时,abi能够支持到64位,反之只能支持32位

//root 即配置NDK路径
File platformDir = new File(root, "/platforms");
File[] platformSubDirs = platformDir.listFiles(File::isDirectory);
int highestVersion = 0;
assert platformSubDirs != null;
for (File platform : platformSubDirs) {
  if (platform.getName().startsWith("android-")) {
    try {
      int version = Integer.parseInt(
          platform.getName().substring("android-".length()));
      //targetVersion即在build.gradle下配置的目标版本 此次为26
      if (version > highestVersion && version < targetVersion) {
        highestVersion = version;
      }
    } catch (NumberFormatException ignore) {
      // Ignore unrecognized directories.
    }
  }
}
return highestVersion;

根据上面的代码举个例子:

targetVersion=26, “platforms”目录下有三个文件夹“android-19”、“android-25”、“android-31”时,经过上面的程序后,会输出highestVersion=25。而根据前提,25>=20,就认为arm64可用。

解决方式:在NDK目录下新建了“platforms”文件夹,并在“platforms”文件夹下新建了“android-19”、"android-21"、"android-31"三个文件夹。

补充
应该有同学会疑问新建空文件夹会不会导致其它的问题产生?实际上并不会。“/platforms/android-N”这个路径实际上在SDK的目录下就有,它的含义为第N个版本的android sdk文件。我猜想在这里Gradle只是想知道当前允许编译哪几个版本的apk,而哪个版本的sdk文件夹存在就认为能够编译对应版本的apk。如果只能编译版本号20以下的apk,那么就可以认为当前并不支持arm64。而判断方式则是根据一个固定路径下的文件名称去判断(无语...)。

为了进一步验证上面的猜想,我新建了一个基于AGP7.0的Cpp项目。这次不用新建“/platforms"文件夹也能编译过去了,因为在AGP7.0上supports64Bits的判断条件为 compileSdkVersion >= AndroidVersion.SUPPORTS_64_BIT (build.gradle下配置的compileSdkVersion)。显然Google也认为在AGP3.4.2上的supports64Bits判断方式并不稳妥。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容