我的编程空间,编程开发者的网络收藏夹
学习永远不晚

APK结构优化的方法有哪些

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

APK结构优化的方法有哪些

这篇文章主要介绍“APK结构优化的方法有哪些”,在日常操作中,相信很多人在APK结构优化的方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”APK结构优化的方法有哪些”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

01 APK结构的那些事

知己知彼,方能百战不殆。了解应用程序APK的结构对于我们来说很有帮助。APK文件由一个ZIP存档组成,其中包含组成应用程序的所有文件。这些文件包括Java类文件,资源文件和包含编译资源的文件。

APK包含以下目录:

  • META-INF/:包含CERT.SF和 CERT.RSA签名文件以及MANIFEST.MF 清单文件。

  • assets/:包含应用可以使用AssetManager对象检索的应用资源。

  • res/:包含未编译到的资源 resources.arsc

  • lib/:包含特定于处理器软件层的编译代码。该目录包含了每种平台的子目录,像armeabiarmeabi-v7a, arm64-v8ax86x86_64,和mips

  • resources.arsc:包含已编译的资源。该文件包含res/values/ 文件夹所有配置中的XML内容。打包工具提取此XML内容,将其编译为二进制格式,并将内容归档。此内容包括语言字符串和样式,以及直接包含在resources.arsc文件中的内容路径 ,例如布局文件和图像。

  • classes.dex:包含以Dalvik / ART虚拟机可理解的DEX文件格式编译的类。

  • AndroidManifest.xml:包含核心Android清单文件。该文件列出应用程序的名称,版本,访问权限和引用的库文件。该文件使用Android的二进制XML格式。

一般来讲APK结构中比较大的部分一般是classes.dex、lib、res、assets这些文件或者目录。所以接下来将会针对这四种情况进行讲解。

02 减小 classes.dex

classes.dex 包含了所有 Java 代码。当你编译你的应用时,gradle 会将你的所有模块里的 .class 文件转换成 .dex 文件并将这些文件合成一个 classes.dex 文件。

单个的 classes.dex 文件可以容纳大约 64K 方法。如果你达到了这个限制,你必须要在你的工程中启用 multidexing。这将会创建另一个 classes1.dex 文件去存储剩下的方法。所以 classes.dex 文件数目由你的方法数而定。

减少第三库的使用

随着业务的频繁变更以及复杂度的增加,我们往往会使用第三方Libaray,有时候我们可能仅仅用到了很少一部分的功能,这个时候就需要慎重考虑完全引用。从我的开发经验上来讲,宁愿参照自己去实现,也不愿意多引入一个第三方库。

避免枚举

一个枚举可以为您的应用程序的classes.dex文件添加大约1.0到1.4 KB的大小 。这些添加可以快速累积到复杂系统或共享库。如果可能,请考虑使用@IntDef注释,这种类型转换保留了枚举的所有类型安全优势。

使用ProGuard

下面这段来自 build.gradle 文件的代码用于为发布构建启用代码压缩:

  android {      buildTypes {          release {              minifyEnabled true              proguardFiles getDefaultProguardFile('proguard-android.txt'),                      'proguard-rules.pro'          }      }      ...  }

除了 minifyEnabled 属性外,还有用于定义 ProGuard 规则的 proguardFiles 属性:

getDefaultProguardFile('proguard-android.txt') 方法可从 Android SDK tools/proguard/ 文件夹获取默认的 ProGuard 设置。
提示:要想做进一步的代码压缩,请尝试使用位于同一位置的 proguard-android-optimize.txt 文件。它包括相同的 ProGuard 规则,但还包括其他在字节码一级(方法内和方法间)执行分析的优化,以进一步减小 APK 大小和帮助提高其运行速度。

proguard-rules.pro 文件用于添加自定义 ProGuard 规则。默认情况下,该文件位于模块根目录(build.gradle 文件旁)。

03 优化assets和res中的资源文件

题外话

res/raw和assets的相同点:
  1. 两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。

res/raw和assets的不同点:
  1. res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.raw.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类。

  2. res/raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹。

针对不同的情况,对于资源文件有不同的优化策略。一般来讲,对于res/drawable-hdpi中的png资源可以进行压缩。

图片资源优化策略

格式压缩

使用TinyPng或者Guetzli进行压缩。Guetzli的使用可以参见我之前写的博文在Mac上使用Google图片压缩工具Guetzli

使用WebP文件格式

定位Android 3.2(API级别13)或更高级别时 ,您也可以使用WebP文件格式来制作图像,而不是使用PNG或JPEG文件。WebP格式提供有损压缩(如JPEG)以及透明度(如PNG),但可以提供比JPEG或PNG更好的压缩。

Android 4.0 (API level 14) 支持有损压缩的WebP格式,Android 4.3 (API level 18) 开始支持无损透明WebP图像。

使用矢量图形

您可以使用矢量图形来创建与分辨率无关的图标和其他可伸缩媒体。使用这些图形可以大大减少您的APK足迹。矢量图像在Android中表示为VectorDrawable对象。通过一个VectorDrawable对象,一个100字节的文件可以生成一个与屏幕尺寸一致的清晰图像。

但是,系统渲染每个 VectorDrawable对象需要很长时间,而较大的图像需要更长的时间才能显示在屏幕上。因此,只有在显示小图像时才考虑使用这些矢量图形。

其它策略

有时候我们可能对一张图片进行重复利用,比如一张图片仅仅是整体颜色的变换可以使用setColorFilter或者tint。尽量减少使用帧动画,那可是一堆图片呀。

压缩资源

要启用资源压缩,请在 build.gradle 文件中将 shrinkResources 属性设置为 true。

  android {      ...      buildTypes {          release {              shrinkResources true              minifyEnabled true              proguardFiles getDefaultProguardFile('proguard-android.txt'),                      'proguard-rules.pro'          }      }  }

资源压缩器目前不会移除 values/ 文件夹中定义的资源(例如字符串、尺寸、样式和颜色)。这是因为 Android 资源打包工具 (AAPT) 不允许 Gradle 插件为资源指定预定义版本。

同时,我们也可以指定哪些资源可以保留下来。

例如,将下边的代码保存在 res/raw/keep.xml。构建不会将该文件打包到 APK 之中。

  <?xml version="1.0" encoding="utf-8"?>  <resources xmlns:tools="http://schemas.android.com/tools"      tools:keep="@layout/l_used*_c,@layout/l_used_a,@layout/l_used_b*"      tools:discard="@layout/unused2" />

resources有以下属性:

  tools:keep 指出哪些资源会保留  tools:discard 指定哪些资源需要剔除  tools:shrinkMode 资源压缩模式,有两种取值strict和safe,默认为safe

safestrict的优化策略:

safe可以简单理解为安全模式,它会尽最大努力检查代码中可能会使用到的资源进行保留,避免运行时错误。

如果你的代码调用 Resources.getIdentifier(),这就表示你的代码将根据动态生成的字符串查询资源名称。当你执行这一调用时,默认情况下资源压缩器会采取防御性行为,将所有具有匹配名称格式的资源标记为可能已使用,无法移除。

  String name = String.format("img_%1d", angle + 1);  res = getResources().getIdentifier(name, "drawable", getPackageName());

img_ 前缀的资源标记为已使用。

在strict模式下,img_前缀的资源会做未使用的处理,因此你需要使用tools:keep手动进行已使用标识。

移除未使用的备用资源

我们知道google给我们的apk提供了国际化支持,如适应不同的屏幕分辨率的drawable资源,还有适应不同语言的字符串资源等等,但是在很多情况下我们只需要一些指定分辨率和语言的资源就可以了,这个时候我们可以使用resConfigs方法来配置。

  defaultConfig {      // 对于国际化支持只打包中文资源,      resConfigs "zh-rCN"  }

04 lib中资源优化

这里我们主要讲一下lib中动态链接库的优化策略,也就是SO文件。如果你有NDK的开发经验可能会更容易理解一些。

为了支持不同指令集的情况,应用可能会包含armeabi、armeabi-v7a、x86的SO文件等。

目前主流的机型都是支持armeabi-v7a的,并且armeabi-v7a兼容armeabi。所以在一般的开发中我们只需要使用armeabi-v7a 进行ABI支持。

有些SO库可以采用网络下载,把负担放到用户安装完应用之后。对于哪些SO文件可以放到网络中加载,还需要看具体业务情况。

题外话,如果运行时找不到SO的话,会导致应用崩溃。

  java.lang.UnsatisfiedLinkError: Couldn't load stlport_shared from loader dalvik.system.PathClassLoader: findLibrary returned null  at java.lang.Runtime.loadLibrary(Runtime.java:365)  at java.lang.System.loadLibrary(System.java:535)  at com.your.app.NativeClass.<clinit>(Native.java:16)  ... 63 more  Caused by: java.lang.UnsatisfiedLinkError: Library stlport_shared not found  at java.lang.Runtime.loadLibrary(Runtime.java:461)  at java.lang.System.loadLibrary(System.java:557)  at com.your.app.NativeClass.<clinit>(Native.java:16)  ... 5 more

到此,关于“APK结构优化的方法有哪些”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

APK结构优化的方法有哪些

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

APK结构优化的方法有哪些

这篇文章主要介绍“APK结构优化的方法有哪些”,在日常操作中,相信很多人在APK结构优化的方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”APK结构优化的方法有哪些”的疑惑有所帮助!接下来,请跟着小编
2023-06-04

网站结构优化的方法有哪些

这篇文章主要介绍“网站结构优化的方法有哪些”,在日常操作中,相信很多人在网站结构优化的方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”网站结构优化的方法有哪些”的疑惑有所帮助!接下来,请跟着小编一起来
2023-06-10

CSS代码重构与优化的方法有哪些

本篇内容主要讲解“CSS代码重构与优化的方法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“CSS代码重构与优化的方法有哪些”吧!CSS代码重构的目的 我们写CSS代码时,不仅仅只是完成页面
2023-06-10

mysql优化的方法有哪些

使用索引:在经常使用的列上创建索引可以提高查询速度。需要注意的是不要过度索引,否则会影响写操作的性能。优化查询语句:避免使用SELECT *,只选择需要的列;避免在WHERE子句中对字段进行函数操作;合理使用JOIN操作等。适当分区表:将表
mysql优化的方法有哪些
2024-04-16

Hive优化的方法有哪些

Hive优化方法主要包括以下几个方面:数据分区和桶排序:通过将数据分成多个分区,可以减少查询的数据量,提高查询性能。此外,使用桶排序可以使数据在存储时更加紧凑,提高查询效率。数据压缩:使用压缩算法可以减少数据的存储空间,同时也能减少磁盘I/
2023-10-22

clickhouse sql优化的方法有哪些

点击豪斯(ClickHouse)是一个列式存储的数据库管理系统,专门用于大规模分布式数据处理。以下是一些ClickHouse SQL优化的方法:设计合适的表结构:合理设计表的列和数据类型,以满足查询需求,并尽量避免使用复杂的数据类型和结构。
2023-10-23

Hibernate HQL优化的方法有哪些

这篇文章主要讲解了“Hibernate HQL优化的方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Hibernate HQL优化的方法有哪些”吧!初用Hibernate的人也许都遇
2023-06-17

react context优化的方法有哪些

本篇内容介绍了“react context优化的方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、前言我们在使用react的过程中
2023-07-04

mysql查看表结构的方法有哪些

MySQL查看表结构的方法有以下几种:1. 使用DESCRIBE语句:可以使用DESCRIBE或DESC命令来查看表的结构。例如,DESCRIBE table_name; 或DESC table_name;。2. 使用SHOW CREATE
2023-10-19

mysql中有哪些优化方法

mysql中有哪些优化方法?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1、sql优化分解关联查询:将关联(join)放在应用中处理,执行简单的sql,好处是:分解后的sq
2023-06-15

vps图片优化的方法有哪些

对于VPS图片优化,可以采用以下方法:1. 图片压缩:使用图片压缩工具,如JPEGmini、TinyPNG等,可以将图片压缩到较小的文件大小,同时保持较高的图片质量。2. 图片格式选择:选择适合的图片格式,如JPEG、PNG、GIF等。JP
2023-09-08

MySQL语句优化的方法有哪些

有以下几种常见的MySQL语句优化方法:1. 添加索引:通过为经常用于查询的列添加索引,可以提高查询的性能。索引可以加快查询的速度,但是过多的索引会增加写操作的开销,因此需要谨慎选择合适的列添加索引。2. 优化查询语句:通过使用合适的查询语
2023-09-16

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录