官网:https://ibotpeaches.github.io/ApkTool
apktool d students.apk
Android studio 2.2之后使用 - 查看apk组成大小,各资源占比 - 查看dex文件组成 - 可以进行apk对比
通过Analyze app
分析(打开方式:Android Studio下 ——> Build——> Analyze app
)
https://github.com/google/android-classyshark
支持多种格式:apk,jar,class,so
等
https://nimbledroid.com/ 可以通过上传apk得知: - 文件大小及排行 - Dex方法数、SDK方法数 - 启动时间、内存等
APK包结构如下:
lib/:
包含特定于处理器软件层的编译代码。该目录包含了每种平台的子目录,像armeabi,armeabi-v7a, arm64-v8a,x86,x86_64,和mips
。大多数情况下我们可以只用一种armeabi-v7a。
assets/
:包含应用可以使用AssetManager
对象检索的应用资源。
res/:
包含未编译到的资源 resources.arsc
,主要有图片资源文件。
META-INF/
:包含CERT.SF和 CERT.RSA
签名文件以及MANIFEST.MF
清单文件。
resources.arsc:
包含已编译的资源。该文件包含res/values/
文件夹所有配置中的XML内容。打包工具提取此XML内容,将其编译为二进制格式,并将内容归档。此内容包括语言字符串和样式,以及直接包含在resources.arsc
文件中的内容路径 ,例如布局文件和图像。
classes.dex
:包含以Dalvik / ART
虚拟机可理解的DEX
文件格式编译的类。
AndroidManifest.xml:
包含核心Android清单文件。该文件列出应用程序的名称,版本,访问权限和引用的库文件。该文件使用Android的二进制XML格式。
往往进行NDK开发的时候,so文件都比较大,将ndk修改为如下:
<br />ndk{
//设置支持的so库架构
abiFilters "armeabi-v7a"
}
armeabi-v7
主要不支持ARMv5(1998年诞生)和ARMv6(2001年诞生)
.
而许多基于 x86 的设备也可运行 armeabi-v7a 和 armeabi NDK
二进制文件。对于这些设备,主要 ABI 将是 x86,辅助 ABI 是 armeabi-v7a
。
如果适配版本高于4.1版本,可以直接上面这样写,当然,如果armeabi-v7a
不是设备主要ABI,那么会在性能上造成一定的影响。
在Android Studio中打开“Analyze” 然后选择"Inspect Code..."
,范围选择整个项目,然后点击"OK"。
打开网址,将大图片导入到tinypng
,替换之前的图片资源。
可以给UI提要求,让他们将图片资源设置为Webp
格式,这样的话图片资源会小很多。当然,如果对图片颜色通道要求不高,可以考虑转jpg
,最好用webp
,因为效果更佳。
一个帧动画几十张图片,再怎么压缩都还是占很大内存比重的。所以建议是让UI去搞,这里可以参考使用lottie-android
,如果项目中动画效果多的话效果更加明显。
每1000行代码在apk当中才会占用5kb的空间
设置shrinkResources true
移除无用资源文件
要通过 ProGuard
启用代码压缩,请在 build.gradle
文件内相应的构建类型中添加 minifyEnabled true
:对无用的代码进行删除
minifyEnabled
这个是用来开启删除无用代码,比如没有引用到的代码
shrinkResources
用来开启删除无用资源,也就是没有被引用的文件(经过实测是drawable,layout,实际并不是彻底删除,而是保留文件名,但是没有内容,等等),但是因为需要知道是否被引用所以需要配合mififyEnable使用,只有当两者都为true的时候才会起到真正的删除无效代码和无引用资源的目的
同样的资源代码测试
minififyEnable false
或者 minififyEnable false && shrinkResources true
APK大小为1.39M 资源文件和layout都存在且是有内容的
minifyEnable true
866K 资源文件和layout都存在且是有内容的
minifyEnable true && shrinkResources true
资源文件在但是没有内容大小都变成67字节,layout
文件内容被清空
classes.dex
中包含了所有的java代码,当你打包时,gradle
会将所有模板力的.class文件转换成classes.dex
文件,当然,如果方法数超过64K,将要新增其他文件进行存储。可以通过multidexing
分多个文件,比如这里的classes2.dex
。换句话说,就是减少代码量。我们可以通过以下方法来实现:
glide,picasso,fresco,image_loader
,如果不是你一个人单独开发完成的很容易出现这种情况),尽量做到一个功能点一个库解决。
7zip
代替压缩资源。
andorid support
库彻底踢出你的项目。
Facebook的redex
优化字节码
redex
是facebook
发布的一款android字节码的优化工具,需要按照说明文档自行配置一下。
redex input.apk -o output.apk --sign -s <KEYSTORE> -a <KEYALIAS> -p <KEYPASS>