AndroidStudio编译不过报 :Device supports,but APK only supports.....

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/eyishion/article/details/85342445

AndroidStudio的开发中偶尔出现下面这样的问题:
Device supports,but APK only supports…
就像下图这样:
在这里插入图片描述
出现这个问题的原因是因为,当前APK支持的系统cpu架构中,手机是不支持的;
手机一共有7中,
armeabi、armeabi-v7a、arm64-v8a、mips、mips64、x86、x86_64;
图片中的手机设备支持 armeabi、armeabi-v7a、arm64-v8a
而我们的apk却只是支持mips、mips64、x86、x86_64
所以出现上面的情况;
那么如何解决呢?
其实这根我们在项目中build.gradle中配置的NDK参数有关系:

        ndk {
         abiFilters  "mips","mips64","x86_64"
          }

我们是这样配置的,只要把手机支持的类型加上去,这个问题就解决了

 		ndk { 
        	abiFilters  "mips","mips64","x86_64","armeabi","armeabi-v7a","arm64-v8a"
  		}

那么如果我不知道手机支持的cpu架构怎么办,通过下面的命令可以获取
abd shell
cat /proc/cpuinfo
上两个命令,估计使用了,你也不知道怎么获取;我用了看了也是一头雾水;
那怎么知道自己手机是那种型号,其实就是瞎搞出来的,就是胡乱试试,结果Ok了;
这样在自己工程里配置

ndk { 
        	abiFilters  "mips"
  		}

因为很少手机是mips,配置完了直接运行项目,会出现如下:
在这里插入图片描述
一般都会提示手机支持哪些类型的cpu架构和apk支持的类型,这样就很容易知道了;

补充:android 7中cpu架构

  • Android 设备的CPU类型(通常称为”ABIs”)
    • armeabi
      • 第5代 ARM v5TE,使用软件浮点运算,兼容所有ARM设备
      • 通用性强,速度慢(只支持armeabi)
    • armeabi-v7a
      • 第7代 ARM v7,使用硬件浮点运算,具有高级扩展功能
      • (支持 armeabi 和 armeabi-v7a,目前大部分手机都是这个架构)
    • arm64-v8a
      • 第8代,64位,包含AArch32、AArch64两个执行状态对应32、64bit
      • (支持 armeabi-v7a、armeabi 和 arm64-v8a)
    • x86
      • intel 32位,一般用于平板
      • (支持 armeabi(性能有所损耗) 和 x86)
    • x86_64
      • intel 64位,一般用于平板
      • (支持 x86 和 x86_64)
    • mips
      • 基本没见过
      • (支持mips)
    • mips64
      • 基本没见过
      • (支持 mips 和 mips_64)
  • Android是如何加载So库的
    • 程序对当前手机cpu架构(比如 armeabi-v7a)做了适配,那手机跑程序时候就直接在这个目录下找对应的so库,如果找不到就直接报错
    • 如果只对armeabi的手机cpu做适配,那么支持armeabi的手机都会去armeabi目录下找对应的so库
  • 项目中如何适配
    • 如果适配不止一个cpu架构,比如armeabi、 armeabi-v7a 、arm64-v8a这三个,那么一定要确保三个目录中的so库数目一样;第三方库如果支持者提供这三个cpu架构的so库,那非常理想,对应放到目录就可以;
    • 如果适配的上面三个cpu架构,第三方库只提供了两个cpu(比如armeabi、 armeabi-v7a)的库,那也要提供的armeabi的so库,复制一份(armeabi或者armeabi-v7a的so库,因为arm64-v8a兼容armeabi 和 armeabi-v7a)到没有提供的arm64-v8a这个架构目录下;如果不这么做,当应用跑到arm64-v8a架构的手机上时,找不到对应的so库就会报错
    • 具体自己项目适配几种cpu架构,得看app性质,比如微信,主要考虑到兼容,让几乎所有手机都可以适配,另外也相对减少了apk的大小;而另外一个app,比如游戏或者一些对手机性能有要求的app,这种app就挑用户了,只适配到armeabi-v7a,因为目前主流手机都支持armeabi-v7a,就算app支持到只支持armeabi这种架构的手机,app也未必能运行的起来,体验也未必好,算是app放弃也这些用户吧,再说使用只支持armeabi这种架构的手机估计年纪也大了,也不会使用到这个app;
    • 如果只适配一种cpu架构,armeabi(都兼容,但性能有所损耗,如微信和qq)或者armeabi-v7a(目前大部分手机都支持这种cpu架构(王者荣耀));目前手头的app目前只支持armeabi,armeabi-v7a,但是现在apk包越来越大,后面也会考虑只支持一个cpu架构的方案(可以减少10M);
    • 如果app适配了armeabi、 armeabi-v7a 、arm64-v8a三种cpu架构,以我的手机mate9为例, mate9支持 armeabi、 armeabi-v7a 、arm64-v8a,那么app在找so文件时会从最新的一代的cpu 架构(arm64-v8a)找so文件,如果找不到会直接报错,不会再去armeabi-v7a 和armeabi里面找,一定要确保三个目录中的so库数目一样;如果适配armeabi、 armeabi-v7a,mate9手机上app在找so文件时会从armeabi-v7a找对应so,没有就报错;如果只适配一种,那么手机只要支持这种cpu架构,就会去这个文件夹下找对应的so,找不到就报错,如果手机不支持这种cpu架构就报错
  • 具体适配的cpu架构,以gradle 里设置的支持的 ndk 为准:
    ndk { abiFilters ‘armeabi,armeabi-v7a’ // , ‘arm64-v8a’, ‘x86’, ‘x86_64’ }

猜你喜欢

转载自blog.csdn.net/eyishion/article/details/85342445