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

推荐阅读更多精彩内容