Android 中的7种CPU详解

CPU历史详解

早起Android只支持ARMv5的CPU架构,而发展到现在,支持以下7种架构:

  • ARMv5:(armeabi )现在很少了,应该不需要支持了(废弃),使用软件浮点运算,兼容所有ARM设备,通用性强,速度慢(只支持armeabi)

  • ARMv7(2010年起)大部分机型:第7代 ARM v7,使用硬件浮点运算,具有高级扩展功能(支持 armeabi 和 armeabi-v7a,目前大部分手机都是这个架构)魅族M9,iphone 3GS,三星I9000等

  • x86(2011年起):联想K800,使用这种架构的较少,毕竟Android手机大部分是ARM32位,一般用于平板,支持armeabi(性能有所损耗)

  • MIPS(2012年):可能有些国产厂商在用(废弃)

  • ARMv8:第8代,高端机型,64位,包含AArch32、AArch64两个执行状态对应32、64bit(支持 armeabi-v7a、armeabi 和 arm64-v8a)华为 Mate 8,Galaxy S

  • MIPS64:暂时没发现什么手机在用(64位)

  • x86_64(2014年):64位平板

现在Android CPU绝大多数已ARM架构为主,少数用Intel的X86架构
以CPU的品牌来说,有 高通【骁龙】、联发科MTK【Helio】、三星【Exynos】、华为海思【Kirin】,其中三星和华为的芯片供自家用不外售。

Android中设备加载so策略

  • 每种架构关联着一种ABI(application binary interface应用程序二进制接口),所以每一种架构都对应一个.so文件。

  • 不同CPU架构的android手机加载时会在libs下找自己对应的目录,从对应的目录下寻找需要的.so文件;
    如果没有对应的目录,就会去armeabi下去寻找,如果已经有对应的目录,却没有找到对应的.so文件,也不会去armeabi下去寻找了;

  • 以x86设备为例,x86设备会在项目中的 libs文件夹寻找是否含有x86文件夹,如果含有x86文件夹,则默认为该项目有x86对应的so可运行文件,只有x86文件夹而文件夹下没有so,程序运行也是会出现 find library returned null 的错误的;如果工程本身不含有x86文件夹,则会寻找armeabi或者armeabi-v7a文件夹,兼容运行。

  • 以armeabi-v7a设备为例,该Android设备当然优先寻找libs目录下的armeabi-v7a文件夹,同样,如果只有armeabi-v7a文件夹而没有 so也是会报错的;如果找不到armeabi-v7a文件夹,则寻找armeabi文件夹,兼容运行该文件夹下的so,但是不能兼容运行x86的so。所以项目中如果只含有x86的so,在armeabi和armeabi-v7a也是无法运行的。以上就是不同CPU架构运行时加载so的策略。* 如果只对armeabi的手机cpu做适配,那么支持armeabi的手机都会去armeabi目录下找对应的so库

  • 这里需要注意很重要的一点:arm64-v8a是可以向下兼容的。如果你有两个文件夹armeabi和arm64-v8a,armeabi里面有a.so 和 b.so,arm64-v8a里面只有a.so,那么arm64-v8a的手机在用到b.so的时候发现有arm64-v8a的文件夹,然而该文件夹里面没有b.so,就报错了。这个时候应该删掉arm64-v8a文件夹,手机发现没有适配arm64-v8a,就会直接去找armeabi的so库。所以要么你别加arm64-v8a,要么armeabi里面有的so库,arm64-v8a里面也必须有。

如何适配

目前主流的Android设备主要是 armeabi-v7a 架构的,然后是 x86 和 armeabi 了。如果同时包含了 armeabi, armeabi-v7a和x86,所有设备都可以运行,程序在运行的时候去加载不同平台对应的so,这是较为完美的一种解决方案,但是有时候为了减少apk的大小,不会同时设置 armeabi, armeabi-v7a 和 x86。根据不同的情况,可以进行不同的适配,
1.只适配 armeabi-v7a,因为目前主流机型是 ARMv7,并且 ARMv8 设备也向下兼容了armeabi-v7a,
Facebook、WhatsApp、王者荣耀等就是只适配了armeabi-v7a。(Google play store下载 Native libs Monitor 进行查看)。
2.只适配 armeabi,因为 ARMv7 、ARMv8 还是 x86 都兼容 armeabi,但是性能都会有些损耗,例如ARMv7 支持硬件浮点运算等没法体现,x86 支持 armeabi 同样具有相应的损耗。微信使用了此策略。
3.同时适配 armeabi-v7a 和 armeabi,既能够支持所有 ARM 架构,同时又能具有 ARMv7 支持硬件浮点运算等特性,例如Line等应用。
4.同时适配 x86 和 armeabi,既能支持所有 ARM 架构,又能支持x86架构,唯一的缺点就是没有了ARMv7 支持硬件浮点运算等一系列特性,例如QQ.
5.同时适配 armeabi, armeabi-v7a 和 x86,在性能方面来说是较为完美的方案,只是APK的大小也会随之的变大。

附:各CPU架构简介

  • ARM架构属于RISC指令集,指令集精简、指令等长,虽然这样的设计可以提高处理效率,但在遇到复杂的指令后,就需要更多的简单指令来堆砌复杂任务;ARM从来只是设计低功耗处理器。其宗旨是设计低功耗处理器,这是他们的强项。
  • armeabi:ARM架构的默认选项,支持基于 ARM* v5TE 的设备,支持软浮点运算,但不支持硬件辅助浮点运算,支持所有的 ARM* 设备。
  • armeabi-v7a:armeabi-v7a 向下兼容,在兼容 armeabi 的基础上,支持基于 ARM* v7 的设备,支持硬件 FPU 指令,支持硬件浮点运算,目前大部分机器都属于armeabi-v7a。
    arm64-v8a:arm64-v8a向下兼容 armeabi 和 armeabi-v7a,最主要的区别在于 arm64-v8a 支持64位,在 MIPS64 架构上增加了 ARMv7 架构中已经拥有的的TrustZone技术、虚拟化技术及NEON advanced SIMD技术等特性(ARM收购MIPS)。架构中包含两个执行状态:AArch32(也就是我们常说的ARMv7)和AArch64(ARMv8),也就是说64位的ARM处理器中同时包含着32位的ARMv7和64位的ARMv8两种架构,直接导致每种架构所拥有的晶体管减半。
  • X86构架是英特尔推出的一种复杂指令集,用于控制芯片的运行的程序,目前该构架的处理器已经广泛运用在PC领域,由于X86构架的处理器芯片在性能上比较强劲,善于执行复杂工作,所以当英特尔进军移动市场领域后(例如联想K800),就出现了X86的架构。X86构架属于典型的CISC,指令集丰富,指令不等长,善于执行复杂工作,更强调串行性能,它的整体运算能力要比只为移动而生的ARM架构强大,并且在PC领域已经广泛应用,拥有深厚的技术背景。英特尔设计超高性能的台式机和服务器处理器,并且的确做的不错。
  • x86:英特尔推出的32位CPU架构,生成的二进制代码可支持包含基于硬件的浮点运算的 IA-32 指令集,同时,x86机器基本上可以使用 intel 的 libhounini 项目直接在x86机器上运行仅含armeabi的动态库代码,也就会说x86机器对armeabi也能够兼容,不过性能上会有些损耗。
  • x86_64:英特尔推出的64位CPU架构,向下兼容x86。
  • mips和mips_64:MIPS是一种高性能的嵌入式CPU构架,其出发点是高性能,主要用于路由器、猫等
  • 总体来说,Android手机大部分采用的是ARM架构的CPU.华为海思芯片,也是基于ARM研发的.

Android 中配置

  • 首先在APP的builder.gradle中的defaultConfig中添加ndk的配置


    image.png
  • 在APP的libs下面创建对应的文件夹,需要什么创建什么,和ndk中是对应的
    ![image.png](https://upload-images.jianshu.io/upload_images/3937928-66c
    20190320145445.png
  • 在项目的build.gradle中的buildTypes{}中添加这句话,就是加载jni的资源文件在libs中寻找

    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }
  • 在项目的build.gradle中的dependencies{}中查看,是否添加了以下依赖
    implementation fileTree(include: ['*.jar'], dir: 'libs')

你可能感兴趣的:(Android 中的7种CPU详解)