Android客户端.So 精简策略

简介: /** * Created by chenchangjun on 17/10/27. */1..So 理论基础首先介绍一下 目前所有手机上 .So 的指令集Android系统目前支持以下七种不同的CPU架构,每一种都关联着一个相应的ABI。
/**
 * Created by chenchangjun on 17/10/27.
 */

1..So 理论基础

首先介绍一下 目前所有手机上 .So 的指令集

Android系统目前支持以下七种不同的CPU架构,每一种都关联着一个相应的ABI。而架构上对应的指令集是以下几种

  • Intel 64 指令集在 x86基础上扩展的(x86指令集有两种CPU位,既有32位的,也有64位的.)
  • armabi 是针对旧的或者普通的ARM v5 CPU.
  • armabi-v7a 是针对ARM v7 CPU (是针对有浮点运算或高级扩展功能的arm cpu).
  • arm64-v8a 是针对最新的 ARM v8a CPU的(就是在MIPS64架构上增加了ARMv7).

安卓这些固定平台的应用通常都编译成ARM处理器的程序,不全都会编译成Intel或者MIPS处理器的程序。

为了解决这个问题,Intel和MIPS要使用特殊的转换软件把ARM的指令转换成他们处理器使用的指令。这当然是会降低性能的

2.项目问题解决

2.1 思路分析

目前项目中的jniLib是这样的,相当冗余.

img_db5ad242f1e6ab78f6187b08a9ab26c6.png
image.png

思路是这样的

  1. armabi指令集是全arm平台(包括armV7 armv8,以及x86,x86_64),都兼容的 指令集.
  1. armabi-v7a 是针对有浮点运算或高级扩展功能的arm cpu,也就是armabi的高性能版本. Android 5.0+同时支持32位与64位ABI的.so. 有arm64-v8a就用,没有就fallback到armeabi-v7a或armeabi.
  1. arm64-v8a 64位指令集,运行在64位手机cpu上,目前主流cpu都已经是64位.

所以说:

为了尽量兼容市面所有手机类型, 尽可能减少crash几率. 所以,
ARM7, ARM8设备能够向下兼容ARM5的SO,也就是说只打包armabi下的so即可

2.2 调研第三方lib库

为了验证这个导论, 我反编译了一些流行app文件.

反编译了 微博 的jniLib中的 文件.

只用了 armabi的兼容包.

img_3fbb82ccf546143f398adb123d03146e.png
image.png

反编译 微信

他们只用了armabi的兼容包,但是里面有_v7.so后缀的 高性能包,提高性能.

img_3c874085abf94ba02c19b1eb0a687e20.png
image.png

反编译 淘宝

只用了 armabi的兼容包.

img_5867bc91b2ca5ed82428b9ad35194425.png
image.png

第三方总结

这里, 都是用了 armeabi包下的.so .

不同的是, 有的他们在这个文件夹下的.so直接做了v7兼容包, 有的则可能选择了插件加载.so的方式.

相同的是, 都是只打包armeabi,提高最大的兼容性,并且减少apk体积.

3.实现,测试

3.1 代码实现

为了确保不出现问题(比如gradle引用第三方可能存在so),保留可选择性的打包.我没有删掉其他cpu指令集,而是用代码选择性编译,只保留armeabi进行编译.

//'armeabi-v7a' // , ‘arm64-v8a’, ‘x86’, ‘x86_64’
        ndk {
            abiFilters 'armeabi'
        }
        

3.2 结果对比

img_d421a50640ee50443f98867906bc5b88.png
image.png

4. 总结

目前,可以只编译armeabi下的so,因为armeabi兼容所有的cpu架构.
理论上行得通, 主流app也都是这么做的.
至于,性能问题,so包影响程度不超过15%,性能问题 最大的还是在手机质量和运行内存..........

5. 后期方向

5.1 只保留armabi-v7a或者arm64-v8a

随着Android 版本的提高(Android5.0以后的版本支持v7和v8指令集), 手机性能的提高(不管高通,麒麟还是联发科,目前主流cpu都是64位处理器.

也就是说支持v7和v8指令集.越来越没必要做ARM5和X86的支持了,以后就更没必要。

5.2 采用插件化 加载.so 包

我们可以采用 插件化加载.so .

目录
相关文章
|
17天前
|
Java 数据库 Android开发
【专栏】Kotlin在Android开发中的多线程优化,包括线程池、协程的使用,任务分解、避免阻塞操作以及资源管理
【4月更文挑战第27天】本文探讨了Kotlin在Android开发中的多线程优化,包括线程池、协程的使用,任务分解、避免阻塞操作以及资源管理。通过案例分析展示了网络请求、图像处理和数据库操作的优化实践。同时,文章指出并发编程的挑战,如性能评估、调试及兼容性问题,并强调了多线程优化对提升应用性能的重要性。开发者应持续学习和探索新的优化策略,以适应移动应用市场的竞争需求。
|
4天前
|
XML API PHP
Android使用XML-RPC实现blog客户端
Android使用XML-RPC实现blog客户端
10 2
|
14天前
|
缓存 监控 Android开发
提升安卓应用性能的五大关键策略
【4月更文挑战第30天】 在竞争激烈的应用市场中,卓越的性能是确保用户留存和应用成功的核心因素。本文将详细阐述五种提高安卓应用性能的有效技术策略。这些策略包括优化内存使用、减少网络请求延迟、多线程与并发处理、UI渲染优化以及电池效率改进。通过深入分析每项技术的原理及其在实际开发中的应用,旨在帮助开发者构建更快速、流畅且响应敏捷的安卓应用。
|
15天前
|
监控 Java Android开发
安卓应用开发:打造高效用户界面的五大策略
【4月更文挑战第29天】 在安卓应用开发的世界中,构建一个既美观又高效的用户界面(UI)对于吸引和保留用户至关重要。本文将深入探讨五种策略,这些策略可以帮助开发者优化安卓应用的UI性能。我们将从布局优化讲起,逐步过渡到绘制优化、内存管理、异步处理以及最终的用户交互细节调整。通过这些实践技巧,你将能够为用户提供流畅而直观的体验,确保你的应用在竞争激烈的市场中脱颖而出。
|
4天前
|
存储 缓存 监控
提升安卓应用性能的实用策略
【5月更文挑战第10天】 在竞争激烈的应用市场中,一个流畅、高效的应用是吸引和保持用户的关键。本文将深入探讨针对安卓平台的性能优化技巧,包括内存管理、多线程应用、UI渲染效率以及电池寿命优化等方面。我们的目标是为开发者提供一套实用的策略,帮助他们构建出既快速又稳定的安卓应用。
|
6天前
|
安全 Java Android开发
构建高效Android应用:采用Kotlin进行内存优化的策略
【5月更文挑战第8天】 在移动开发领域,性能优化一直是开发者关注的焦点。特别是对于Android应用而言,合理管理内存资源是确保应用流畅运行的关键因素之一。近年来,Kotlin作为官方推荐的开发语言,以其简洁、安全和互操作性的特点受到开发者青睐。本文将深入探讨利用Kotlin语言特性,通过具体策略对Android应用的内存使用进行优化,旨在帮助开发者提高应用性能,减少内存消耗,避免常见的内存泄漏问题。
9 0
|
8天前
|
Java Android开发
Android HIDL客户端构建
Android HIDL客户端构建
15 0
|
14天前
|
缓存 监控 测试技术
提升Android应用性能的实用策略
【4月更文挑战第30天】 在移动应用开发的世界中,性能优化既是艺术也是科学。本文将深入探讨针对安卓平台的几种实用技术,旨在帮助开发者提升应用的响应速度和流畅度。我们将透过分析内存管理、多线程处理以及电池效率等方面,提供一系列经过验证的最佳实践。通过这些策略,应用不仅能在用户体验上得到显著提升,还能在竞争激烈的市场中保持优势。
|
14天前
|
缓存 监控 Android开发
提升安卓应用性能的关键策略
【4月更文挑战第30天】 在竞争激烈的移动应用市场中,性能优化已成为开发流程中不容忽视的一环。尤其对于安卓平台,由于设备多样性和系统碎片化,确保应用流畅运行并减少资源消耗显得尤为关键。本文旨在探讨几个实用的策略,帮助开发者诊断常见性能瓶颈,并提供针对性的解决方案,以期达到更高效的应用性能表现。
|
14天前
|
移动开发 数据库 Android开发
提升安卓应用性能的实用策略
【4月更文挑战第30天】 在竞争激烈的应用市场中,一款流畅、高效、稳定的应用是吸引和保留用户的关键。本文将针对安卓平台,深入探讨影响应用性能的各种因素,并提出一系列实用的优化策略。从内存管理到多线程处理,再到布局优化以及响应式编程模型,我们将逐一分析如何通过这些技术手段显著提升应用的性能表现。