APK 缩减 | Android media | Android Developers
apk文件目录说明
以下是对APK文件解压后各主要目录及文件的详细说明:
- META - INF:
- 该目录主要存放应用的签名信息、证书等元数据。其中,
MANIFEST.MF文件记录了APK中所有文件的摘要信息;签名相关文件(如CERT.SF和CERT.RSA)用于验证APK的完整性和真实性,确保应用在传输过程中未被篡改,并且可以识别应用的开发者身份。
- 该目录主要存放应用的签名信息、证书等元数据。其中,
- res:
- drawable:用于存放各种图片资源,如PNG、JPEG、SVG等格式的图片。这些图片可用于应用的界面展示,如按钮图标、背景图片等。
- layout:包含应用的布局文件,使用XML格式定义了界面的结构和组件的排列方式。通过布局文件,可以轻松实现不同屏幕尺寸和分辨率下的界面适配。
- values:用于存放各种资源值,如字符串、颜色、尺寸、样式等。在代码中可以通过资源ID来引用这些值,方便进行统一管理和修改。例如,
strings.xml文件用于定义应用中使用的各种字符串,便于多语言支持和字符串的集中管理。
- assets:
- 此目录用于存放应用的原始资源文件,这些文件不会像
res目录中的资源那样被系统自动处理。应用可以通过AssetManager类来访问assets目录中的文件,常用于存放字体文件、数据库文件、文本文件、HTML文件等。例如,将自定义字体文件放在assets目录中,然后在应用中通过AssetManager加载并使用该字体。
- 此目录用于存放应用的原始资源文件,这些文件不会像
- lib:
- 该目录包含应用所依赖的本地库文件,通常是由C或C++编写的代码编译而成的
.so文件。不同的CPU架构(如armeabi、armeabi - v7a、x86等)会有对应的子目录,存放相应架构的本地库。例如,在开发一些涉及到音视频处理、图像识别等对性能要求较高的应用时,可能会使用C或C++编写部分代码,并将其编译成.so文件放在lib目录中,以提高应用的执行效率。
- 该目录包含应用所依赖的本地库文件,通常是由C或C++编写的代码编译而成的
- AndroidManifest.xml:
- 这是APK文件的核心配置文件,它描述了应用的基本信息、组件(如
Activity、Service、Broadcast Receiver、Content Provider)、权限、应用的版本信息、使用的硬件特性等。系统在安装应用时会读取这个文件来了解应用的功能和配置要求。例如,通过该文件可以知道应用有哪些界面(Activity),以及这些界面的启动模式、所需权限等信息;还可以了解应用需要访问哪些系统资源或其他应用的功能,以便在安装时向用户提示相关权限请求。在apk文件中,只有AndroidManifest.xml是必须的。
- 这是APK文件的核心配置文件,它描述了应用的基本信息、组件(如
- classes.dex:
- 该文件包含了应用程序的字节码,是Dalvik虚拟机或ART虚拟机能够识别和执行的代码。它是由Java源代码经过编译后生成的,所有应用的逻辑代码(包括方法、变量、类等定义)都在这个文件中。当应用运行时,虚拟机将加载
classes.dex文件,并执行其中的字节码来实现应用的各种功能。
- 该文件包含了应用程序的字节码,是Dalvik虚拟机或ART虚拟机能够识别和执行的代码。它是由Java源代码经过编译后生成的,所有应用的逻辑代码(包括方法、变量、类等定义)都在这个文件中。当应用运行时,虚拟机将加载
- resources.arsc:
- 这是一个资源索引文件,它记录了
res目录中资源的索引信息,包括资源的ID、类型、名称等。系统通过这个文件可以快速定位和加载应用所需的资源,提高资源访问的效率。
- 这是一个资源索引文件,它记录了
此外,一些APK可能还包含其他文件或目录,如build.prop文件(包含应用的构建信息)、assets目录下的子目录(用于进一步组织和管理原始资源文件)等,这取决于应用的具体功能和所使用的技术框架。
apk大小分析工具
Analyze Apk
Analyze Apk 能帮助开发者深入了解 APK 文件的内部结构、资源使用、代码构成等信息,进而优化应用性能、减小安装包体积。
- APK 文件结构:能查看 APK 文件解压后的各个目录和文件,像
assets(存放原始资源)、res(存放各类资源,如布局、图片等)、lib(存放本地库文件)、classes.dex(包含应用字节码)、AndroidManifest.xml(应用核心配置文件)等。 - 资源使用情况:可分析资源的占用情况,包含图片、字符串、布局等资源的数量和大小。借助这些信息,能识别出大尺寸图片或者未使用的资源,进而对资源进行优化。
- 代码构成:可以查看应用的代码构成,比如类的数量、方法的数量等。对于存在大量类和方法的应用,要留意是否会超出 DEX 文件的方法数量限制(65536 个),必要时考虑采用 Multi - DEX 方案。
- 权限分析:展示应用在
AndroidManifest.xml中声明的权限,帮助开发者确认应用是否申请了不必要的权限,从而提升应用的安全性。 - APK 大小分析:详细列出 APK 文件的总大小以及各个部分的大小占比,这有助于开发者找出导致 APK 体积过大的原因,然后采取相应的优化措施,例如压缩图片、移除无用资源等。
如何使用
- 方法一:直接使用AS工具进行查看,将apk文件拖放到AS的代码编辑窗口
- 方法二:选择 “Build” 菜单,接着点击 “Analyze APK”,之后在弹出的文件选择对话框中挑选要分析的 APK 文件

Size和Download Size区别:
- Size:指 Android 应用程序包(APK)文件的总大小。它包含了应用程序的所有代码、资源、资产、证书和清单文件等,是应用打包后的完整大小,反映了应用在存储方面所占用的空间。
- Download Size:指用户在从分发平台(如 Google Play)下载应用时需要传输的数据量。这个大小可能与 APK Size 不同,因为在下载过程中可能会进行压缩、增量更新等操作,以及考虑到动态功能交付等因素,用户实际下载的数据量会有所变化。
优化重点在于把 Size 和 Download Size 进行对其,尽量使其大小保持一致。
Android Lint分析器
Android Lint 分析器是 Android 开发中一个重要的静态代码分析工具。有以下功能特点:
- 代码质量检查:能检测代码中的常见错误,如未使用的资源、潜在的内存泄漏、性能问题等。例如,当存在未释放的资源、未关闭的文件句柄或未取消注册的广播接收器时,Lint 会发出警告。
- 最佳实践提示:提供符合 Android 开发最佳实践的建议,如推荐使用合适的布局方式,提醒开发者使用资源文件、正确处理多语言支持等。
- 多语言支持:支持对 Java 和 Kotlin 等多种语言的代码分析,确保项目的各个部分都能遵循最佳实践。
- 安全问题检测:可以检测到潜在的安全问题,如敏感信息的明文存储、未加密的网络通信等。
一键生成报告
通过执行gradle命令行,直接生成xml报告进行查看。
操作方式:
- 首先在项目的gradle.properties中配置一下 org.gradle.java.home ,确保环境统一
org.gradle.java.home = D:\\tools\\android-studio-2024.3.1.13-windows\\android-studio\\jbr
- 打开AS的 Terminal 工具窗口,执行以下命令:
./gradlew lint --warning-mode all
- 执行结束后,报告输出位置
> Task :app:lintReportDebug
Wrote HTML report to file:///D:/code/workspace_androidstudio/ApkSizeAnalyzer/app/build/reports/lint-results-debug.html
- 使用浏览器打开,即可看到详细的分析信息,例如:未使用资源显示

也可以使用 AS 的 Code > Inspect Code… 直接在AS中进行查看:

单独分析某个
这里以 unused resources 为例,操作方式:
- 依次打开 Code > Analyze Code > Run Inspection by Name…

- 在弹出的对话框中输入 unused resources ,选择对应的项目,扫描结束后显示如下,红色圈起来的按钮,点击之后会立即执行,请一定要确保该资源没有使用,再点击该按钮,否则就要自行找回了:

注意事项:通过反射使用的资源文件,是无法被扫描到的,所以一定要注意
val resId = resources.getIdentifier("app_unused_string", "string", packageName)
apk优化方案
代码层面优化
移除无用代码和资源
- 使用 Lint 工具:Android Studio 中的 Lint 工具可以帮助检测项目里的无用资源,像未使用的布局文件、图片、字符串等。选中项目,点击菜单栏的 “Code” -> “Inspect Code”,选择要检查的范围,Lint 就会找出无用资源,然后手动删除。
- ProGuard 或 R8 代码混淆:ProGuard 是一个开源的 Java 代码混淆器,R8 是 Android Gradle 插件默认的代码压缩和混淆工具。它们可以移除未使用的代码,对类、方法和字段进行重命名,以此减小代码体积。在
build.gradle.kts文件中启用混淆:
buildTypes {
release {
isMinifyEnabled = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
signingConfig = signingConfigs.getByName("release")
}
}
启用dex压缩
[Android 开发者 | Android Developers](https://developer.android.google.cn/guide/topics/manifest/application-element?hl=zh-cn#:~:text=从 AGP 4.2.0,的原生库。)
采用合适的库
- 避免重复依赖:检查项目依赖,防止引入重复的库。例如,有些库可能包含了其他库的功能,这时就可以移除多余的依赖。
- 使用轻量级库:尽量选择轻量级的库来替代功能类似但体积较大的库。比如,使用 OkHttp 进行网络请求,它体积小且性能出色。
资源层面优化
图片优化
- 压缩图片:使用图像编辑工具(如 Photoshop)或者在线压缩工具(如 TinyPNG)对图片进行压缩,在不影响视觉效果的前提下减小图片文件大小。
- 使用 WebP 格式:WebP 是一种现代的图像格式,与 PNG 和 JPEG 相比,它能提供更高的压缩率。在 Android 中支持 WebP 格式,可将部分图片转换为 WebP 格式以减小 APK 大小。在
build.gradle中配置:
android {
defaultConfig {
// 启用 WebP 支持
vectorDrawables.useSupportLibrary = true
}
}
- 使用图片加载库的图片处理功能:像 Glide 或 Picasso 这样的图片加载库,具备图片裁剪、缩放等处理功能。使用这些功能可以避免在 APK 中包含过大的原始图片。
资源文件优化
- 移除不必要的语言资源:如果应用只支持特定的语言,那么可以移除其他语言的资源文件。在
res目录下,只保留需要的语言文件夹。
defaultConfig {
resConfigs 'zh', 'en'
resConfigs 'xxhdpi'
}
- 使用资源别名:对于一些重复使用的颜色、尺寸等资源,可以使用资源别名来避免重复定义,减小资源文件大小,使用矢量图。
- 使用tint着色器:对于一些按钮或者文本选择器方面的操作,可以使用tint着色器来进行颜色的变化等,避免引入不必要的资源文件来进行状态的改变。
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="true"
android:src="@drawable/home"
android:tint="@color/iv_tint_selector" />
color/iv_tint_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/black" android:state_pressed="true" />
<item android:color="@color/teal_200" />
</selector>
配置层面优化
启用资源压缩
在 build.gradle 文件中启用资源压缩,它会移除未使用的资源:
buildTypes {
release {
isMinifyEnabled = true
isShrinkResources = true // 开启资源压缩
}
}
对于不想被压缩的资源,可以使用keep进行保留,在xml目录下创建keep.xml
<?xml version="1.0" encoding="utf-8"?>
<resouces xmlns:tools="http://schemas.android.com/tools"
tools:discard="@layout/activity_unused" // 不需要保留
tools:keep="@layout/activity_main" /> // 需要保留的,如果有多个前缀一致的需要保留,可以使用*
采用 APK 分割
- ABI 分割:Android 设备支持多种不同的 CPU 架构(如 armeabi-v7a、arm64-v8a、x86 等)。通过 ABI 分割,可为不同的 CPU 架构生成不同的 APK,这样用户只需下载适合自己设备架构的 APK,从而减小 APK 大小。在
build.gradle中配置:
android {
splits {
abi {
enable true
reset()
include 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
universalApk false
}
}
}
- 语言分割:类似 ABI 分割,也可以根据语言进行 APK 分割,为不同语言的用户生成不同的 APK。
其他方案
AndResGuard
https://github.com/shwenzhang/AndResGuard
AndResGuard 是一款由微信团队开发的 Android 资源保护工具,主要用于混淆资源文件、破坏资源文件可读性以及缩小 APK 大小,其原理与 Java Proguard 类似。
- 资源混淆:对资源文件路径和资源 ID 进行混淆,例如将
res/drawable/hello.png混淆为r/s/a.png,并输出映射关系到 mapping 文件。同时,对resources.arsc文件中的资源项值字符串池、资源项 key 字符串池进行混淆替换,修正资源项 entry 中引用的资源项字符串池位置并更改相应大小,提高反编译难度。 - APK 大小优化:通过混淆资源 ID 长度,减少资源文件占用空间,再利用 7z 深度压缩,能显著减小 APK 包大小。
删除Dex debugitem
https://blog.csdn.net/weixin_29658641/article/details/117310908
AAB应用
Android App Bundle 常见问题解答 | Google Play | Android Developers
- Android App Bundle (AAB) 是 2018 年推出的一种 Android 发布格式,得到 Google Play 和其他应用商店以及 Android Studio、Bazel、Buck、Cocos Creator、Gradle、Unity 和 Unreal 等构建工具的广泛支持。
- app bundle 仅用于发布,无法在 Android 设备上安装。Android 软件包 (APK) 是 Android 的可安装、可执行应用格式。 app bundle 必须由分发者处理成 APK 文件才能在设备上安装。
xapk格式
xapk是什么格式文件?xapk怎么安装到手机上? - 站长工具网
XAPK是Android操作系统上用于安装移动应用程序和中间件的另一种包文件格式。由多个apk文件+ OBB数据文件。(OBB(Opaque Binary Blob)文件格式,是安卓游戏通用数据包)组成。

1102

被折叠的 条评论
为什么被折叠?



