美文网首页
Android SO库

Android SO库

作者: Android_冯星 | 来源:发表于2018-09-26 15:26 被阅读0次

    查看手机CPU架构:

    $adb shell  
     
    $cat  /proc/cpuinfo
    
    • OnePlus6:
      AArch64 Processor rev 12 (aarch64)
    ➜  ~ adb shell
    OnePlus6:/ $ cat  /proc/cpuinfo
    Processor   : AArch64 Processor rev 12 (aarch64)
    processor   : 0
    BogoMIPS    : 38.40
    Features    : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp
    CPU implementer : 0x51
    CPU architecture: 8
    CPU variant : 0x7
    CPU part    : 0x803
    CPU revision    : 12
    
    processor   : 1
    BogoMIPS    : 38.40
    Features    : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp
    CPU implementer : 0x51
    CPU architecture: 8
    CPU variant : 0x7
    CPU part    : 0x803
    CPU revision    : 12
    
    processor   : 2
    BogoMIPS    : 38.40
    Features    : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp
    CPU implementer : 0x51
    CPU architecture: 8
    CPU variant : 0x7
    CPU part    : 0x803
    CPU revision    : 12
    
    processor   : 3
    BogoMIPS    : 38.40
    Features    : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp
    CPU implementer : 0x51
    CPU architecture: 8
    CPU variant : 0x7
    CPU part    : 0x803
    CPU revision    : 12
    
    processor   : 4
    BogoMIPS    : 38.40
    Features    : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp
    CPU implementer : 0x51
    CPU architecture: 8
    CPU variant : 0x6
    CPU part    : 0x802
    CPU revision    : 13
    
    processor   : 5
    BogoMIPS    : 38.40
    Features    : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp
    CPU implementer : 0x51
    CPU architecture: 8
    CPU variant : 0x6
    CPU part    : 0x802
    CPU revision    : 13
    
    processor   : 6
    BogoMIPS    : 38.40
    Features    : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp
    CPU implementer : 0x51
    CPU architecture: 8
    CPU variant : 0x6
    CPU part    : 0x802
    CPU revision    : 13
    
    processor   : 7
    BogoMIPS    : 38.40
    Features    : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp
    CPU implementer : 0x51
    CPU architecture: 8
    CPU variant : 0x6
    CPU part    : 0x802
    CPU revision    : 13
    
    Hardware    : Qualcomm Technologies, Inc SDM845
    

    那么我的OnePlus6的CPU架构是ARM v8 64位
    ARM v8 64
    ARM v8 64

    SO库

    image.png
    • 一种CPU架构 = 一种ABI = 一种对应的SO库;

    • 加载SO库时,需要加载对应类型的SO库;

    • 尽量提供全平台CPU类型的SO库支持;

    SO库类型和CPU架构类型

    现在至少支持以下七种不同的CPU架构:ARMv5,ARMv7,x86,MIPS,ARMv8,MIPS64和x86_64。每一种CPU类型都对应一种ABI(Application Binary Interface),“armeabi-v7a”文件夹前面的“armeabi”指的就是ARM这种类型的ABI,后面的“v7a”指的是ARMv7。这7种CPU类型对应的SO库的文件夹名是:armeabi,armeabi-v7a,x86,mips,arm64-v8a,mips64,x86_64。

    只提供armeabi架构的.so文件而忽略其他ABIs的

    armeabi与armeabi-v7a表示支持不同的CPU类型
    armeabi是指的该so库用于ARM的通用CPU,而v7a的CPU支持硬件浮点运算。因此armeabi通用性强,但速度慢,而v7a能充分发挥v7a CPU的能力,在AIR打包APK调试模式adobe选择的是通用性强的armeabi模式。

    android支持不同CPU的深层含义
    首先从硬件支持方便来看,我们的adnroid设备目前为止大部分都是支持ARM芯片,(当然市面上此刻最新的android机器还支持intel等另外的几个芯片,例如intel最新的凌动项目芯片,就获得了android4.1的青睐)。从android版本与支持ARM硬件编码的程度来看:

    起初android1.6:只支持armv4与armv5te指令集。

    到了android2.0:增加了支持arm-vfp,armv6,armv6t2指令集。

    到了android2.2:增加支持armv7-a指令集。

    所以armeabi-v7a 应该是与AIR限定支持android2.2以上的条件有关。android2.2以上能让硬件发挥更大的作用。

    我项目中使用armeabi还是armeabi-v7a
    对于AIR项目来说性能问题是最大的瓶颈,能优化一点就一点,所以如果接平台方SDK或者写ANE的时候使用到SO库,个人推荐全部放到armeabi-v7a下,而不要为了兼容放到armeabi

    当你引入一个.so文件时,不止影响到CPU架构。我从其他开发者那里可以看到一系列常见的错误,其中最多的是"UnsatisfiedLinkError","dlopen: failed"以及其他类型的crash或者低下的性能:

    所有的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等等)。

    以减少APK包大小为由是一个错误的借口,因为你也可以选择在应用市场上传指定ABI版本的APK,生成不同ABI版本的APK可以在build.gradle中如下配置:

    android {
        ... 
        splits {
            abi {
                enable true
                reset()
                include 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a' //select ABIs to build APKs for
                universalApk true //generate an additional APK that contains all the ABIs
            }
        }
     
        // map for the version code
        project.ext.versionCodes = ['armeabi': 1, 'armeabi-v7a': 2, 'arm64-v8a': 3, 'mips': 5, 'mips64': 6, 'x86': 8, 'x86_64': 9]
     
        android.applicationVariants.all { variant ->
            // assign different version code for each output
            variant.outputs.each { output ->
                output.versionCodeOverride =
                        project.ext.versionCodes.get(output.getFilter(com.android.build.OutputFile.ABI), 0) * 1000000 + android.defaultConfig.versionCode
            }
        }
     }
    

    减少SO库体积的正确姿势

    1. 构建特定ABI支持的APK
    2. 从网络下载当前设备支持的SO库

    Android动态加载so库

    android 的 armeabi 和armeabi v7 的区别

    我的Android进阶之旅------>Android 关于arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容问题

    相关文章

      网友评论

          本文标题:Android SO库

          本文链接:https://www.haomeiwen.com/subject/hccdoftx.html