作者:gooddaytoyou,

链接:https://www.jianshu.com/p/76db8b87fac3

Android支持多种CPU处理器架构:

  • mips

  • mips64

  • armeabi

  • armeabi-v7a

  • arm64-v8a

  • x86

  • x86_64

想要在项目中使用 native 类库,我们必须对要支持的处理机框架提供对应编译包。每个处理器架构需要我们提供一个或多个包含native代码的.so文件。

当我们决定支持处理器架构的时候,相应的APK会疯狂的增大。对于用户来说设备架构只需要一个子集,但当用户下载APK时,会全部下载(对用户来说相当的不好)。

通过Android Studio 查看APK文件,可以发现lib文件夹占用APK空间比较大:

进一步看下lib文件夹下的文件,可以清楚的看到不同处理器架构文件的native库的大小:

当前 Google Play Store 上传APK限制是100MB。而我们的native库占用APK应用一半以上的空间。为了减少APK的大小,我们需要限制支持的处理器架构。在这里我介绍两种技术:

  • ABI Filters

  • APK Split

ABI Filters

ABI (Application Binary Interface)是两个程序模块之间的接口; 通常,其中一个是库文件或者是操作系统

ABI filters 可以让我们包含进APK里处理器架构native文件。

defaultConfig中加入如下配制:

        ndk {abiFilters "arm64-v8a", "armeabi-v7a"}

通过指定处理器的架构,我们可以看到我们的包小了很多:

通过abiFilters配制有利有弊,在这里以用户角度与开发者角角来分析下。

  • 用户角度:APK包含了用户用不到的类库,造成APK变大,用户需要花更多的网络流量及下载的等待时间;

  • 开发者角度:这种方案提供了单一的APK,节省开发者的维护成本。

如果我们考虑到包大小超过100M或者用户角度的话,ABI filters不再是一个可选方案。我们需要确保用户下载的只有用户需要的native库。这时我们需要使用APK split 技术。

APK split

APK split 允许我们自动生成多个APK文件。我们可以通过屏幕密度(mdpihdpixhdpi…)或者处理器架构(arm64-v8a, armeabi-v7a…)来进行拆分。通过处理架构配制:

 splits{// Configures multiple APKs based on ABI.abi {// Enables building multiple APKs per ABI.enable true// By default all ABIs are included, so use reset() and include to specify that we only// want APKs for x86, armeabi-v7a, and mips.reset()// Specifies a list of ABIs that Gradle should create APKs for.include "x86", "x86_64", "armeabi-v7a", "arm64-v8a"// Specifies that we want to also generate a universal APK that includes all ABIs.universalApk true}}

生成Debug包:

但是由于Debug包拆分不是必须的,我们可以配制仅对release包用效。

splits {abi {def isReleaseBuild = falsegradle.startParameter.taskNames.find {// Enable split for release builds in different build flavors// (assemblePaidRelease, assembleFreeRelease, etc.).if (it ==~ /:app:assemble.*Release/) {isReleaseBuild = truereturn true // break}return false // continue}// Enables building multiple APKs per ABI.enable isReleaseBuilduniversalApk true}}

运行项目之后:

Version codes

由于应用商店不允许上传具有相同的VersionCode的多个APK包。我们需要对每个Release包生成对应的VersionCode。

  // Map for the version code that gives each ABI a value.def abiCodes = ['armeabi-v7a':1, 'arm64-v8a':2,'x86':3, 'x86_64':4]// APKs for the same app that all have the same version information.android.applicationVariants.all { variant ->// Assigns a different version code for each output APK.variant.outputs.each {output ->def abiName = output.getFilter(com.android.build.OutputFile.ABI)output.versionCodeOverride = abiCodes.get(abiName, 0) * 100000 + variant.versionCode}}

我们通过Android Studio 查看app-arm64-v8a-release APK文件,发现versionCode变成了20001:

需要支持的处理器架构

由于处理器架构为armeabi-v7a、arm64-v8a占市场的99%以上的份额,因此我们必须要支持。

这里有一份Android 处理器架构的汇总建议:

  • mips (已弃用)

  • mips64 (已弃用)

  • armeabi (已弃用)

  • armeabi-v7a (需要支持— 现在最流行的处理器架构)

  • arm64-v8a (需要支持 — armeabi-v7a的新版本)

  • x86 (可选, 设备非常有限,可以用于模拟器debugging)

  • x86_64 (可选, 设备非常有限,可以用于模拟器debugging)

相关的参考

  • https://developer.android.com/google/play/publishing/multiple-apks.html#HowItWorks

  • https://medium.com/androiddevelopers/smallerapk-part-4-multi-apk-through-abi-and-density-splits-477083989006

  • https://proandroiddev.com/reducing-apk-size-by-using-abi-filters-and-apk-split-74a68a885f4e

优化ApK大小之ABI Filters 和 APK split!相关推荐

  1. 优化ApK大小之ABI Filters 和 APK split

    优化ApK大小之ABI Filters 和 APK split Android支持多种CPU处理器架构: mips mips64 armeabi armeabi-v7a arm64-v8a x86 x ...

  2. 优化android studio编译的apk大小

    默认生成的apk(release版)太大(只打印helloworld的apk大小就有1MB多),需要优化编译,如下,修改build.gradlebuildTypes { release {minify ...

  3. android开发笔记之APK大小优化

    蛋痛引发的争论 晚上,实在是无聊的蛋痛,就用自己的APK查看了一下手机中所有应用软件的信息,忽然看到一个APK, /system/priv-app/ApeTaleEditor/ApeTaleEdito ...

  4. Android如何减少apk大小

    因为推广的需要,公司需要把APK的大小再"减小"一下,4M以内! 当达到4M以内之后,公司建议说,能否再压压?2M如何? 瘦身前 因为平时就考虑到大小的限制,所以很多工作已经做过了 ...

  5. 减少Android应用程序的八种方法APK大小

    自2012年3月推出Android Marketplace以来,普通Android应用的规模已经增长了五倍. 其中一些增加是有意义的:典型Android设备可用的内存增加了,那么为什么不使用这个额外的 ...

  6. Android--获取apk大小

    版权声明:本文为博主原创文章,转载请标明出处. https://blog.csdn.net/chaoyu168/article/details/82226830 //获取apk大小public sta ...

  7. 【错误记录】Google Play 上架报错 ( APK 大小 | 目标 API 级别 | Google Play 帮助文档 )

    文章目录 一.报错信息 二.解决方案 一.报错信息 Google Play 中上架 APK 文件 , 报如下错误 ; 您需要将 APK 文件缩减到 一〇〇 MB,或使用 APK 扩展文件.您的应用目前 ...

  8. 分析Android studio3.0的instant run开启关闭对APK大小的影响

    分析Android studio3.0的instant run开启关闭对APK大小的影响 首先看下默认开启instant run的截图: Android studio2.0后新增加的功能默认开启ins ...

  9. android安装程序后缀,【单选题】Android安装包文件简称APK,其后缀名是() A. .apk B. .exe C. .txt D. .app...

    [单选题]Android安装包文件简称APK,其后缀名是() A. .apk B. .exe C. .txt D. .app 更多相关问题 要在Excel 作表区域A1:A10中输入等比数列2.4.8 ...

最新文章

  1. springboot 整合redis 实现KeySpaceNotification 键空间通知
  2. php fastcgi配置_IIS7.5配置php(FastCGI)- 自动配置
  3. 装管家婆系统要开启那些服务器,管家婆服务器维护注意的一些事项?
  4. J2EE Java泛型的好处
  5. 【转】图形学基础之透视校正插值
  6. apche 禁止运行php,学习猿地-apache如何禁止执行php
  7. 图形学 射线相交算法_计算机图形学中的阴极射线管(CRT)
  8. js-JavaScript高级程序设计学习笔记1
  9. activity 点击后传递数据给fragment_ViewModel+LiveData实现Fragment间通信
  10. docker基础2--镜像基本操作
  11. 经验分享:vim编辑器的常用命令使用汇总
  12. leadtools将pdf转tif
  13. 保险中介3.0时代:数字化中介在场景中打造核心竞争力
  14. python绘制折线图怎么样填充空白颜色_两条折线图之间填充颜色
  15. 简单点的java_简单点,学习的方式简单点,java零基础入门语法教学(简单篇)...
  16. 永磁同步电机力矩控制(二):FOC与DTC
  17. 图灵1951年报告Intelligent Machinery,A Heretical Theory中英文,公号回复“图灵1951报告”下载PDF双语典藏版
  18. 淘宝新手如何做推广 最新最全的淘宝店铺免费推广方法秘诀
  19. 【Bitmap】Canvas: trying to use a recycled bitmap android.graphics.Bitmap问题
  20. 冯诺依曼 计算机名言,约翰·冯·诺伊曼留给我们的名言之一

热门文章

  1. 【快速检测GPU性能】
  2. 【xbox开发】如何通过unity3d发布xbox one应用
  3. Android 平台上的感应器开发
  4. 数据库基础之NoSQL与RDBMS
  5. 今天复习jsp(2)
  6. 正态分布-高斯分布函数解析
  7. HWND、HANDLE、HMODULE、HINSTANCE的区别
  8. AI外呼机器人的作用
  9. idea查看java代码汇编指令
  10. div,section,article,aside 区分