http://www.ox-holdings.com

因为它们的芯片也是基于ARM架构开发的,这不是腾讯第一次支持Linux

摘要据腾讯QQ官方消息,腾讯QQ Linux版本回归,支持x64、ARM64、MIPS64架构。资料显示,2008年腾讯曾推出Tencent QQ for Linux,2009年之后就没再更新过。昨天是2019年10月24日,也是1024程序员节,所以今天有程序员相关的梗。作为极客群体的重要一员,程序员们很多离不开Linux系统,没想到腾讯昨天发布了Linux QQ 2.0 beta(点此下载),宣告Linux版QQ回归。这不是腾讯第一次支持Linux QQ,2008年就发布过一个Linux版QQ软件,然后就没有然后了,十年前Linux系统的生态大家可以想像得到,尤其是在中国这样的市场上,Linux QQ显然是没多少人用的。不过现在不一样了,Linux生态系统日益完善,而且由于自主可控的原因,Linux这样的开源系统在国内显然会有更好的发展,大概是这个原因,腾讯今天发布了Linux QQ 2.0 Beta版,支持x64(x86_64、amd64)、arm64(aarch64)、mips64(mips64el)三种架构,每种架构支持Debian系、红帽系、Arch Linux系、其它发行版中的一种或几种(未来可能继续扩充)。每一次发布均会提供架构和发行版的若干种组合支持的安装包,可按下面所述的规则进行选择。根据腾讯官方说明,新版Linux QQ有如下改进:- 支持x64、ARM64、MIPS64三种架构;- 优化消息体验,完善消息收发能力;- 性能优化。

Android 中arm64-v8a、armeabi-v7a、armeabi、x86主要用来存放.so库,主要针对不同的设备兼容,也可以说是专门针对不同android手机下CPU架构的兼容。
下面就来扯一下安卓cpu
Android 设备的CPU类型(通常称为”ABIs”)
早期的Android系统几乎只支持ARMv5的CPU架构,你知道现在它支持多少种吗?7种!
Android系统目前支持以下七种不同的CPU架构:ARMv5,ARMv7 (从2010年起),x86 (从2011年起),MIPS (从2012年起),ARMv8,MIPS64和x86_64 (从2014年起),每一种都关联着一个相应的ABI。
应用程序二进制接口(Application Binary Interface)定义了二进制文件(尤其是.so文件)如何运行在相应的系统平台上,从使用的指令集,内存对齐到可用的系统函数库。在Android 系统上,每一个CPU架构对应一个ABI:armeabi,armeabi-v7a,x86,mips,arm64- v8a,mips64,x86_64。

——MIPS MCU

附:各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.

参考链接

Android jniLibs下目录详解(.so文件)

armeabi-v7a armeabi arm64-v8a

关于Android的.so文件你所需要知道的

各版本分析如下:
• mips / mips64: 极少用于手机可以忽略
• x86 / x86_64: x86 架构的手机都会包含由 Intel 提供的称为 Houdini 的指令集动态转码工具,实现 对 arm .so 的兼容,再考虑 x86 1% 以下的市场占有率,x86 相关的两个 .so 也是可以忽略的
• armeabi: ARM v5 这是相当老旧的一个版本,缺少对浮点数计算的硬件支持,在需要大量计算时有性能瓶颈
• armeabi-v7a: ARM v7 目前主流版本
• arm64-v8a: 64位支持

作为开源ISA,工具链、实际CPU、SoC安装启用、开发可以在设备上运行的兼容软件,这些都很欠缺。华为要花4-5年时间才能拼凑完整,这还是最好的情况。留给华为的时间可能没有那么多。

Android中设备加载so策略

  1. 不同CPU架构的android手机加载时会在libs下找自己对应的目录,从对应的目录下寻找需要的.so文件;
  2. 如果没有对应的目录,就会去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的策略。

二、应用

  1. 错误分析

UnsatisfiedLinkError:找不到对应的so包

分析:很多设备都支持多于一种的ABI。例如ARM64和x86设备也可以同时运行armeabi-v7a和armeabi的二进制包。当一个应用安装在设备上,只有该设备支持的CPU架构对应的.so文件会被安装。在x86设备上,libs/x86目录中如果存在.so文件的话,会被安装,如果不存在,则会选择armeabi-v7a中的.so文件,如果也不存在,则选择armeabi目录中的.so文件(因为x86设备也支持armeabi-v7a和armeabi)。

举例:现有一台x86设备,有a,b,c三个so文件,x86只放置a,b,其余目录都放a,b,c。则在安装apk时会安装x86目录下的so文件,即a,b,没有c。则在运行到c功能时会报UnsatisfiedLinkError错误。

解决办法:尽可能的提供专为每个ABI优化过的.so文件,但要么全部支持,要么都不支持:你不应该混合着使用。你应该为每个ABI目录提供对应的.so文件。

  1. 开发技巧

查看cpu信息

MIPS是一个开源架构,它们的计划是让MIPS系统的每一个组件全部变成开源组件。包括如下一些东西:

CPU架构分类

  1. armeabi
  2. armeabi-v7a(目前大部分机器)
  3. arm64-v8a (高端机型)
  4. x86
  5. x86_64
  6. mips
  7. mips64

Android手机大部分采用的是ARM架构的CPU.

一、cpu三大架构:MIPS、ARM、X86

  1. 用途分布:

armeabi系列:属于ARM (A7、A9、A15、A53、A57) 包含:高通、麒麟(华为海思)、澎湃(小米)、联发科、猎户座(三星Exynos)

mips系列:属于MIPS ,多用在网关、猫、机顶盒等。代表:中国“龙芯”

x86系列:pc模拟器、Intel Atom系列处理器(英特尔放弃应用于手机、PC、平板以及可穿戴设备的Atom处理器)

  1. 详细分类:

arm:armeabi(arm v5 cpu 32位)、armeabi-v7a(针对有浮点运算或高级扩展功能的arm v7 cpu 32位)、arm64-v8a(同时包含着32位的ARMv7和64位的ARMv8两种架构)

mips:mips(32位)、mis64(64位)

x86:x86(32位)、x86_64(64位)

  1. 架构与目录的对应关系

图片 1

图片 2

针对不同平台,如何去适配

目前主流的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的大小也会随之的变大。

三、疑问

  1. 只提供armeabi架构的.so文件而忽略其他ABIs来减小apk大小?

所有的x86/x86_64/armeabi-v7a/arm64-v8a设备都支持armeabi架构的.so文件,因此似乎移除其他ABIs的.so文件是一个减少APK大小的好技巧。但事实上并不是:这不只影响到函数库的性能和兼容性。x86设备能够很好的运行ARM类型函数库,但并不保证100%不发生crash,特别是对旧设备。64位设备(arm64-v8a, x86_64, mips64)能够运行32位的函数库,但是以32位模式运行,在64位平台上运行32位版本的ART和Android组件,将丢失专为64位优化过的性能(ART,webview,media等等)。

如有问题,麻烦指出

为什么在大平洋的彼岸RISC-V没有引起太大的兴趣?主要是因为ARM太流行,虽然ISA是开源的,但并不意味着高性能CPU内核也是免费的,在设计时也缺少经验,RISC-V社区与中国工程师社区的文化也不匹配。

CPU之间的架构兼容

ARMv5 设备:只支持armeabi

ARMv7 设备:支持 armeabi 和 armeabi-v7a

ARMv8 设备:支持 armeabi-v7a、armeabi 和 arm64-v8a

X86 设备:支持 armeabi(性能有所损耗) 和 x86

x86_64 设备:支持 x86 和 x86_64

mips 设备: 支持 mips

mips_64 设备:支持 mips 和 mips_64

思维导图

图片 3

郑重声明:本文版权归新匍京a奥门-最全网站手机版app官方下载所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。