Android 相關(guān)七種 CPU 架構(gòu)適配

姓名:郭佳朋? ?學(xué)號(hào):14310116045

轉(zhuǎn)載自:http://blog.csdn.net/kester_/article/details/71055901

【嵌牛導(dǎo)讀】:NDK 開(kāi)發(fā)時(shí)會(huì)涉及到 CPU 架構(gòu)的適配沦辙,不同的機(jī)器上可能會(huì)有不同的 CPU 架構(gòu),也就是說(shuō)投剥,翻譯到機(jī)器上使用的規(guī)則不一樣魁巩,Android 上有7種 CPU 架構(gòu)碱茁。

【嵌牛鼻子】:CPU架構(gòu)

【嵌牛提問(wèn)】:?了解CPU相關(guān)嗎粒褒?

【嵌牛正文】:安卓CPU基礎(chǔ)

凡是接觸過(guò)安卓系統(tǒng)的朋友仗岸,對(duì)CPU一定不會(huì)陌生林螃。

NDK 開(kāi)發(fā)時(shí)會(huì)涉及到 CPU 架構(gòu)的適配奕删,不同的機(jī)器上可能會(huì)有不同的 CPU 架構(gòu),也就是說(shuō)疗认,翻譯到機(jī)器上使用的規(guī)則不一樣完残,Android 上有7種 CPU 架構(gòu)伏钠。

1.armeabi

2.armeabi-v7a

3.arm64-v8a

4.x86

5.x86_64

6.MIPS

7.MIPS64

從廠家上來(lái)分是有三種,arm谨设,x86熟掂,MIPS,arm 系列是絕大多數(shù)手機(jī)上使用的扎拣,x86 主要是運(yùn)用在平板上赴肚,而 MIPS 基本上就沒(méi)見(jiàn)過(guò)。

從類型來(lái)分二蓝,有32位和64位誉券,名字中沒(méi)有64的就是32位的了。

正常來(lái)說(shuō)只使用 armeabi-v7a 就可以適配基本所有手機(jī)了刊愚,因?yàn)楝F(xiàn)在手機(jī)基本上都支持這種CPU架構(gòu)踊跟,但是對(duì)于同時(shí)也能支持 arm64-v8a 的手機(jī)來(lái)說(shuō),性能上就不如使用對(duì)應(yīng) CPU 架構(gòu)的快了鸥诽,畢竟是32位和64位的區(qū)別商玫,值得一提的是,arm 系列本身是沒(méi)有64位衙传,而是 intel 的x86_64先出現(xiàn)的决帖,之后 arm 收購(gòu)了 MIPS64,基于 MIPS64 改良出 arm64-v8a蓖捶,所以也能理解為什么 MIPS 幾乎沒(méi)有地回,而另外,arm64-v8a 的 CPU 架構(gòu)上也能運(yùn)行 armeabi-v7a俊鱼,為什么呢刻像?不是64位上運(yùn)行32位,而是 arm64-v8a 上本身搭載了 armeabi-v7a并闲,所以在 arm64-v8a 上運(yùn)行 armeabi-v7a 是使用32位處理的细睡,沒(méi)毛病。

如果應(yīng)用中有不止一個(gè) so帝火,那就要注意了溜徙,如果這時(shí)你一個(gè) so 同時(shí)支持了 armeabi-v7a 和arm64-v8a,而另一個(gè) so 只支持了一種犀填,那可能會(huì)運(yùn)行有問(wèn)題蠢壹,這時(shí)要么另一個(gè) so 也支持兩種,要么把第一個(gè) so 刪掉對(duì)應(yīng)目錄九巡,只支持相同的一種图贸。

在提供支持多個(gè) CPU 架構(gòu)的 SDK 時(shí),可以同時(shí)提供多個(gè)目錄的 so,雖然此時(shí) SDK 相對(duì)較大疏日,但是被編譯的 so 還是以你在 gradle 里設(shè)置的支持的 ndk 為準(zhǔn):

ndk {

abiFilters ‘a(chǎn)rmeabi-v7a’ // , ‘a(chǎn)rm64-v8a’, ‘x86’, ‘x86_64’

}

查看設(shè)備支持的 CPU 架構(gòu)或者 APP 提供的 CPU 架構(gòu)可以使用 Native Libs Monitor偿洁。

1 查看手機(jī)CPU信息

cmd——adb shell——cd /proc------cat cpuinfo


2 獲取cpu的是arm指令集,armv7指令集沟优、還是neon指令集

[java] view plain copy

/*** * [獲取cpu類型和架構(gòu)]* * @return?

* 三個(gè)參數(shù)類型的數(shù)組涕滋,第一個(gè)參數(shù)標(biāo)識(shí)是不是ARM架構(gòu),第二個(gè)參數(shù)標(biāo)識(shí)是V6還是V7架構(gòu)净神,第三個(gè)參數(shù)標(biāo)識(shí)是不是neon指令集

*/?

public static Object[] getCpuArchitecture() {?

? ? if ((Integer) mArmArchitecture[1] != -1) {?

? ? ? ? return mArmArchitecture;?

? ? }?

? ? try {?

? ? ? ? InputStream is = new FileInputStream("/proc/cpuinfo");?

? ? ? ? InputStreamReader ir = new InputStreamReader(is);?

? ? ? ? BufferedReader br = new BufferedReader(ir);?

? ? ? ? try {?

? ? ? ? ? ? String nameProcessor = "Processor";?

? ? ? ? ? ? String nameFeatures = "Features";?

? ? ? ? ? ? String nameModel = "model name";?

? ? ? ? ? ? String nameCpuFamily = "cpu family";?

? ? ? ? ? ? while (true) {?

? ? ? ? ? ? ? ? String line = br.readLine();?

? ? ? ? ? ? ? ? String[] pair = null;?

? ? ? ? ? ? ? ? if (line == null) {?

? ? ? ? ? ? ? ? ? ? break;?

? ? ? ? ? ? ? ? }?

? ? ? ? ? ? ? ? pair = line.split(":");?

? ? ? ? ? ? ? ? if (pair.length != 2)?

? ? ? ? ? ? ? ? ? ? continue;?

? ? ? ? ? ? ? ? String key = pair[0].trim();?

? ? ? ? ? ? ? ? String val = pair[1].trim();?

? ? ? ? ? ? ? ? if (key.compareTo(nameProcessor) == 0) {?

? ? ? ? ? ? ? ? ? ? String n = "";?

? ? ? ? ? ? ? ? ? ? for (int i = val.indexOf("ARMv") + 4; i < val.length(); i++) {?

? ? ? ? ? ? ? ? ? ? ? ? String temp = val.charAt(i) + "";?

? ? ? ? ? ? ? ? ? ? ? ? if (temp.matches("\\d")) {?

? ? ? ? ? ? ? ? ? ? ? ? ? ? n += temp;?

? ? ? ? ? ? ? ? ? ? ? ? } else {?

? ? ? ? ? ? ? ? ? ? ? ? ? ? break;?

? ? ? ? ? ? ? ? ? ? ? ? }?

? ? ? ? ? ? ? ? ? ? }?

? ? ? ? ? ? ? ? ? ? mArmArchitecture[0] = "ARM";?

? ? ? ? ? ? ? ? ? ? mArmArchitecture[1] = Integer.parseInt(n);?

? ? ? ? ? ? ? ? ? ? continue;?

? ? ? ? ? ? ? ? }?


? ? ? ? ? ? ? ? if (key.compareToIgnoreCase(nameFeatures) == 0) {?

? ? ? ? ? ? ? ? ? ? if (val.contains("neon")) {?

? ? ? ? ? ? ? ? ? ? ? ? mArmArchitecture[2] = "neon";?

? ? ? ? ? ? ? ? ? ? }?

? ? ? ? ? ? ? ? ? ? continue;?

? ? ? ? ? ? ? ? }?


? ? ? ? ? ? ? ? if (key.compareToIgnoreCase(nameModel) == 0) {?

? ? ? ? ? ? ? ? ? ? if (val.contains("Intel")) {?

? ? ? ? ? ? ? ? ? ? ? ? mArmArchitecture[0] = "INTEL";?

? ? ? ? ? ? ? ? ? ? ? ? mArmArchitecture[2] = "atom";?

? ? ? ? ? ? ? ? ? ? }?

? ? ? ? ? ? ? ? ? ? continue;?

? ? ? ? ? ? ? ? }?


? ? ? ? ? ? ? ? if (key.compareToIgnoreCase(nameCpuFamily) == 0) {?

? ? ? ? ? ? ? ? ? ? mArmArchitecture[1] = Integer.parseInt(val);?

? ? ? ? ? ? ? ? ? ? continue;?

? ? ? ? ? ? ? ? }?

? ? ? ? ? ? }?

? ? ? ? } finally {?

? ? ? ? ? ? br.close();?

? ? ? ? ? ? ir.close();?

? ? ? ? ? ? is.close();?

? ? ? ? }?

? ? } catch (Exception e) {?

? ? ? ? e.printStackTrace();?

? ? }?


? ? return mArmArchitecture;?

}?

調(diào)用的該函數(shù)的示例方法

[java] view plain copy

/*

* 獲取FFpeg解碼庫(kù)的名稱(如果是插件何吝,會(huì)涉及到一個(gè)向下兼容的問(wèn)題,例如:如果當(dāng)前cpu是V7neo鹃唯,而又沒(méi)有neon的解碼庫(kù)爱榕,必須要做向下兼容出來(lái)

* ,如果有V7的庫(kù)就加載V7的庫(kù)坡慌,有V6的庫(kù)就加載V6的)

*/?

public static String getFFmpegLibName(Context context) {?

? ? if (LIB_FFMPEG_NAME != null) {?

? ? ? ? return LIB_FFMPEG_NAME;?

? ? }?

? ? Object[] arch = getCpuArchitecture();?


? ? String libDir = getNativeLibraryDir(context);?

? ? String libSysDir = "/system/lib";?


? ? if ("ARM".equals(arch[0])) {?

? ? ? ? try {?

? ? ? ? ? ? String ffmpeg = String.format("ffmpeg-%d%s", (Integer) arch[1], (String) arch[2]);?

? ? ? ? ? ? if (isFileExist(libDir + "/lib" + ffmpeg + ".so") || isFileExist(libSysDir + "/lib" + ffmpeg + ".so")) {?

? ? ? ? ? ? ? ? return ffmpeg;?

? ? ? ? ? ? } else {?

? ? ? ? ? ? ? ? boolean isV7NeonCpu = "neon".equals(arch[2]);?

? ? ? ? ? ? ? ? boolean isV7 = ((Integer) arch[1]) == 7 && "".equals(arch[2]);?

? ? ? ? ? ? ? ? boolean isV6 = ((Integer) arch[1]) == 6;?

? ? ? ? ? ? ? ? if (isV7NeonCpu) {?

? ? ? ? ? ? ? ? ? ? if (isFileExist(libDir + "/libffmpeg-7neon.so")?

? ? ? ? ? ? ? ? ? ? ? ? ? ? || isFileExist(libSysDir + "/libffmpeg-7neon.so")) {?

? ? ? ? ? ? ? ? ? ? ? ? LIB_FFMPEG_NAME = "ffmpeg-7neon";?

? ? ? ? ? ? ? ? ? ? ? ? return "ffmpeg-7neon";?

? ? ? ? ? ? ? ? ? ? } else if (isFileExist(libDir + "/libffmpeg-7.so")?

? ? ? ? ? ? ? ? ? ? ? ? ? ? || isFileExist(libSysDir + "/libffmpeg-7.so")) {?

? ? ? ? ? ? ? ? ? ? ? ? LIB_FFMPEG_NAME = "ffmpeg-7";?

? ? ? ? ? ? ? ? ? ? ? ? return "ffmpeg-7";?

? ? ? ? ? ? ? ? ? ? } else if (isFileExist(libDir + "/libffmpeg-6.so")?

? ? ? ? ? ? ? ? ? ? ? ? ? ? || isFileExist(libSysDir + "/libffmpeg-6.so")) {?

? ? ? ? ? ? ? ? ? ? ? ? LIB_FFMPEG_NAME = "ffmpeg-6";?

? ? ? ? ? ? ? ? ? ? ? ? return "ffmpeg-6";?

? ? ? ? ? ? ? ? ? ? }?

? ? ? ? ? ? ? ? } else if (isV7) {?

? ? ? ? ? ? ? ? ? ? if (isFileExist(libDir + "/libffmpeg-7.so") || isFileExist(libSysDir + "/libffmpeg-7.so")) {?

? ? ? ? ? ? ? ? ? ? ? ? LIB_FFMPEG_NAME = "ffmpeg-7";?

? ? ? ? ? ? ? ? ? ? ? ? return "ffmpeg-7";?

? ? ? ? ? ? ? ? ? ? } else if (isFileExist(libDir + "/libffmpeg-6.so")?

? ? ? ? ? ? ? ? ? ? ? ? ? ? || isFileExist(libSysDir + "/libffmpeg-6.so")) {?

? ? ? ? ? ? ? ? ? ? ? ? LIB_FFMPEG_NAME = "ffmpeg-6";?

? ? ? ? ? ? ? ? ? ? ? ? return "ffmpeg-6";?

? ? ? ? ? ? ? ? ? ? }?

? ? ? ? ? ? ? ? } else if (isV6) {?

? ? ? ? ? ? ? ? ? ? if (isFileExist(libDir + "/libffmpeg-6.so") || isFileExist(libSysDir + "/libffmpeg-6.so")) {?

? ? ? ? ? ? ? ? ? ? ? ? LIB_FFMPEG_NAME = "ffmpeg-6";?

? ? ? ? ? ? ? ? ? ? ? ? return "ffmpeg-6";?

? ? ? ? ? ? ? ? ? ? }?

? ? ? ? ? ? ? ? }?

? ? ? ? ? ? }?

? ? ? ? } catch (Exception e) {?

? ? ? ? ? ? e.printStackTrace();?

? ? ? ? }?

? ? } else if ("INTEL".equals(arch[0])) {?

? ? ? ? if (isFileExist(libDir + "/libffmpeg-x86atom.so") || isFileExist(libSysDir + "/libffmpeg-x86atom.so")) {?

? ? ? ? ? ? LIB_FFMPEG_NAME = "ffmpeg-x86atom";?

? ? ? ? ? ? return "ffmpeg-x86atom";?

? ? ? ? }?

? ? }?

? ? LIB_FFMPEG_NAME = null;?

? ? return null;?

}?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末黔酥,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子洪橘,更是在濱河造成了極大的恐慌跪者,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件熄求,死亡現(xiàn)場(chǎng)離奇詭異渣玲,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)弟晚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門忘衍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人卿城,你說(shuō)我怎么就攤上這事枚钓。” “怎么了瑟押?”我有些...
    開(kāi)封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵搀捷,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我多望,道長(zhǎng)嫩舟,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任怀偷,我火速辦了婚禮至壤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘枢纠。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布晋渺。 她就那樣靜靜地躺著镰绎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪木西。 梳的紋絲不亂的頭發(fā)上畴栖,一...
    開(kāi)封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音八千,去河邊找鬼吗讶。 笑死,一個(gè)胖子當(dāng)著我的面吹牛恋捆,可吹牛的內(nèi)容都是我干的照皆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼沸停,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼膜毁!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起愤钾,我...
    開(kāi)封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤瘟滨,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后能颁,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體杂瘸,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年伙菊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了败玉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡占业,死狀恐怖绒怨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谦疾,我是刑警寧澤南蹂,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站念恍,受9級(jí)特大地震影響六剥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜峰伙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一疗疟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瞳氓,春花似錦策彤、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)裹刮。三九已至,卻和暖如春庞瘸,著一層夾襖步出監(jiān)牢的瞬間捧弃,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工擦囊, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留违霞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓瞬场,卻偏偏與公主長(zhǎng)得像买鸽,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子泌类,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容