Android Apk瘦身优化

您所在的位置:网站首页 安装包提取apk Android Apk瘦身优化

Android Apk瘦身优化

2023-04-25 23:15| 来源: 网络整理| 查看: 265

一、缩减应用大小

随着业务迭代,apk体积逐渐变大。项目中积累的无用资源,未压缩的图片资源等,都为apk带来了不必要的体积增加。而APK 的大小会影响应用加载速度、使用的内存量以及消耗的电量。

二、了解 APK 结构

在讨论如何缩减应用的大小之前,有必要了解下应用 APK 的结构。APK 文件由一个 Zip 压缩文件组成,中包含构成应用的所有文件。这些文件包括 Java 类文件、资源文件和包含已编译资源的文件。

image.png

APK 包含以下目录: META-INF/ :包含 CERT.SF 和 CERT.RSA 签名文件,以及 MANIFEST.MF 清单文件。 assets/ :包含应用的资源;应用可以使用 AssetManager 对象检索这些资源。 res/ :包含未编译到 resources.arsc 中的资源(图片、音视频等)。 lib/ :包含特定于处理器软件层的已编译代码。此目录包含每种平台类型的子目录,如 armeabi 、armeabi-v7a 、 arm64-v8a 、 x86 、 x86_64 和 mips 。

APK 还包含以下文件。在这些文件中,只有 AndroidManifest.xml 是必需的。 resources.arsc :包含已编译的资源。此文件包含 res/values/ 文件夹的所有配置中的 XML 内容。打包工具会提取此 XML 内容,将其编译为二进制文件形式,并压缩内容。此内容包括语言字符串和样式,以及未直接包含在 resources.arsc 文件中的内容(例如布局文件和图片)的路径。 classes.dex :包含以 Dalvik/ART 虚拟机可理解的 DEX 文件格式编译的类。 AndroidManifest.xml :包含核心 Android 清单文件。此文件列出了应用的名称、版本、访问权限和引用的库文件。该文件使用 Android 的二进制 XML 格式。

三、Android Size Analyzer

Android Size Analyzer 工具可轻松地发现和实施多种缩减应用大小的策略。 首先在 Android Studio 中的插件市场下载安装 Android Size Analyzer 插件。安装插件后,从菜单栏中依次选择 Analyze > Analyze App Size,对当前项目运行应用大小分析。分析了项目后,系统会显示一个工具窗口,其中包含有关如何缩减应用大小的建议。

image.png image.png

分析了项目后,系统会显示一个工具窗口,其中包含有关如何缩减应用大小的建议,如图 所示。

image.png 1.将png替换成webp

发现问题: 大部分是png图,大家都是png是带透明度的大文件图片,相比jpg要大很多; 有个别图片尺寸特别大,这些图片大多是大尺寸的背景图; 解决办法: 所有图片可以用webp格式代替,操作如下截图(Android Studio选中图片单击右键,选择Convert To WebP即可);

image.png 四、移除未使用资源

APK瘦身关键就在一个字:删!没用的就删了。 启用资源缩减 (不打包) 如果在应用的 build.gradle 文件中启用了资源缩减: shrinkResources ,则 Gradle 在打包APK时可以自动忽略 未使用资源。 资源缩减只有在与代码缩减: minifyEnabled 配合使用时才能发挥作用。在代码缩减器移除所有不使用的代码后,资源缩减器便可确定应用仍要使用的资源 。

android { // Other settings buildTypes { release { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } 五、用Lint分析器(物理删除)

lint 工具是 Android Studio 中附带的静态代码分析器,可检测到 res/ 文件夹中未被代码引用的资源。 从菜单栏中依次选择 Analyze > Run Inspection By Name分析完成后会弹出:lint 工具不会扫描 assets/ 文件夹、通过反射引用的资源或已链接至应用的库文件。此外,它也不会移除资源,只会提醒您它们的存在。 与资源缩减不同,这里点击删除,那就是把文件删了。

image.png image.png

左边扫描出来的资源文件,全选后点击右边的 Remove All Unused Resources 按钮:

image.png

反射引用资源:

getResources().getIdentifier("layout_main","layout",getPackageName());

自定义要保留的资源 如果有想要特别声明需要保留或舍弃的特定资源,在项目中创建一个包含 标记的 XML 文件,并在 tools:keep 属性中指定每个要保留的资源,在 tools:discard 属性中指定每个要舍弃的资源。这两个属性都接受以逗号分隔的资源名称列表。还可以将星号字符用作通配符。

将该文件保存在项目资源中,例如,保存在 res/raw/keep.xml 中。构建系统不会将此文件打包到 APK 中。

一键删除无用资源 Android Studio给我们提供了一键移除所有无用的资源。从菜单栏中依次选择 Refactor > Remove Unused Resources,但是这种方式不建议使用,因为如果某资源仅存在动态获取资源id 的方式,那么这个资源会被认为没有使用过,从而会直接被删除。 移除未使用的备用资源 Gradle 资源缩减器只会移除未由应用代码引用的资源,这意味着,它不会移除用于不同设备配置的备用资源。可以使用 Android Gradle 插件的 resConfigs 属性移除应用不需要的备用资源文件。 例如,如果使用的是包含语言资源的库(如 AppCompat ),那么 APK 中将包含这些库中所有已翻译语言的字符串。如果只想保留应用正式支持的语言,则可以使用 resConfig 属性指定这些语言。系统会移除未指定语言的所有资源。

android { defaultConfig { ... resConfigs "zh-rCN" } }

配置resConfigs 只打包默认与简体中文资源。

六、动态库打包配置

so文件是由ndk编译出来的动态库,是 c/c++ 写的,所以不是跨平台的。ABI 是应用程序二进制接口简称 (Application Binary Interface),定义了二进制文件(尤其是.so文件)如何运行在相应的系统平台上,从使用的指令集,内存对齐到可用的系统函数库。在Android 系统中,每一个CPU架构对应一个ABI,目前支持的有:armeabi-v7a,arm64- v8a,x86,x86_64。目前市面上手机设备基本上都是arm架构, armeabi-v7a 几乎能兼容所有设备。因此可以配置:

android{ defaultConfig{ ndk { abiFilters "armeabi-v7a" } } }

对于第三方服务,如百度地图、Bugly等会提供全平台的cpu架构。进行了上面的配置之后,表示只会把armeabi�v7a打包进入Apk。从而减少APK大小。 对于arm64架构的设备,如果使用armeabi-v7a也能够兼容,但是不如使用arm64的so性能。因此现在部分应用市场会根据设备提供不同架构的Apk安装。此时我们需要打包出针对arm64的apk与armv7a的apk,可以使用

flavorDimensions "default" productFlavors{ arm32{ dimension "default" ndk { abiFilters "armeabi-v7a" } } arm64{ dimension "default" ndk { abiFilters "arm64-v8a" } } }

也可以使用:

splits { abi { enable true reset() include 'arm64-v8a','armeabi-v7a' // exclude 'armeabi' universalApk true //是否打包一个包含所有so的apk } } 七、使用矢量图

我们项目中平时最常见的就是jpg、png格式的图片,俗称位图,特点是缩放会失真。还有一种svg格式的矢量图,特点就是缩放不会失真,所以同样的图片,无论你在屏幕中是放大显示还是缩小显示,清晰度都一样。Android从5.0才开始对矢量图的支持,但并不能直接像jpg或png那样使用,需要将svg转换成Vector形式的xml文件,存放于drawable目录下。因为矢量图不能使用GPU缓存及绘制效率问题,官方建议我们最好使用在色彩较简单及小于200*200的图片内。

1、通过Android Studio提供的Vector Asset对svg进行转换,Clip Art中提供了studio内置的一些svg图片,Local file中可进行本地svg或psd格式图片的转换。

image.png

2、使用第三方svg2vector jar包对svg进行转换,可批量。命令:java -jar svg2vector.jar -d source/ -o svg

-d:批量转换的源文件夹地址 -f:单个转换的源文件地址 -o:转换后要输出的文件地址 -h:输出的高 -w:输出的宽

svg2vector下载地址

注意:如果转换时提示不支持的错误信息,请查看图片中是否引用了滤镜等特效,或使用了字体,字体可转换为形状后再使用。

3、关于兼容Android 5.0之前的版本,有两种方案: 第一种: 在build.gradle 配置generatedDensities,这种方式实际就是在5.0以下设备中,Android会在对应的drawable中生成png图片。

image.png 第二种:使用谷歌提供的VectorDrawable依赖库,详细的使用方法可自行查找,这里就不过多讲解了。

参考: 链接:https://blog.csdn.net/weixin_43889841/article/details/106276798 链接:https://www.jianshu.com/p/420f46f50c1b 链接:https://www.jianshu.com/p/b81cbc20f6a7 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3