优化ApK大小之ABI Filters 和 APK split!
作者: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文件。我们可以通过屏幕密度(mdpi
, hdpi
, xhdpi…
)或者处理器架构(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!相关推荐
- 优化ApK大小之ABI Filters 和 APK split
优化ApK大小之ABI Filters 和 APK split Android支持多种CPU处理器架构: mips mips64 armeabi armeabi-v7a arm64-v8a x86 x ...
- 优化android studio编译的apk大小
默认生成的apk(release版)太大(只打印helloworld的apk大小就有1MB多),需要优化编译,如下,修改build.gradlebuildTypes { release {minify ...
- android开发笔记之APK大小优化
蛋痛引发的争论 晚上,实在是无聊的蛋痛,就用自己的APK查看了一下手机中所有应用软件的信息,忽然看到一个APK, /system/priv-app/ApeTaleEditor/ApeTaleEdito ...
- Android如何减少apk大小
因为推广的需要,公司需要把APK的大小再"减小"一下,4M以内! 当达到4M以内之后,公司建议说,能否再压压?2M如何? 瘦身前 因为平时就考虑到大小的限制,所以很多工作已经做过了 ...
- 减少Android应用程序的八种方法APK大小
自2012年3月推出Android Marketplace以来,普通Android应用的规模已经增长了五倍. 其中一些增加是有意义的:典型Android设备可用的内存增加了,那么为什么不使用这个额外的 ...
- Android--获取apk大小
版权声明:本文为博主原创文章,转载请标明出处. https://blog.csdn.net/chaoyu168/article/details/82226830 //获取apk大小public sta ...
- 【错误记录】Google Play 上架报错 ( APK 大小 | 目标 API 级别 | Google Play 帮助文档 )
文章目录 一.报错信息 二.解决方案 一.报错信息 Google Play 中上架 APK 文件 , 报如下错误 ; 您需要将 APK 文件缩减到 一〇〇 MB,或使用 APK 扩展文件.您的应用目前 ...
- 分析Android studio3.0的instant run开启关闭对APK大小的影响
分析Android studio3.0的instant run开启关闭对APK大小的影响 首先看下默认开启instant run的截图: Android studio2.0后新增加的功能默认开启ins ...
- 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 ...
最新文章
- springboot 整合redis 实现KeySpaceNotification 键空间通知
- php fastcgi配置_IIS7.5配置php(FastCGI)- 自动配置
- 装管家婆系统要开启那些服务器,管家婆服务器维护注意的一些事项?
- J2EE Java泛型的好处
- 【转】图形学基础之透视校正插值
- apche 禁止运行php,学习猿地-apache如何禁止执行php
- 图形学 射线相交算法_计算机图形学中的阴极射线管(CRT)
- js-JavaScript高级程序设计学习笔记1
- activity 点击后传递数据给fragment_ViewModel+LiveData实现Fragment间通信
- docker基础2--镜像基本操作
- 经验分享:vim编辑器的常用命令使用汇总
- leadtools将pdf转tif
- 保险中介3.0时代:数字化中介在场景中打造核心竞争力
- python绘制折线图怎么样填充空白颜色_两条折线图之间填充颜色
- 简单点的java_简单点,学习的方式简单点,java零基础入门语法教学(简单篇)...
- 永磁同步电机力矩控制(二):FOC与DTC
- 图灵1951年报告Intelligent Machinery,A Heretical Theory中英文,公号回复“图灵1951报告”下载PDF双语典藏版
- 淘宝新手如何做推广 最新最全的淘宝店铺免费推广方法秘诀
- 【Bitmap】Canvas: trying to use a recycled bitmap android.graphics.Bitmap问题
- 冯诺依曼 计算机名言,约翰·冯·诺伊曼留给我们的名言之一