APK 组成以及大小压缩优化:参考 https://www.jianshu.com/p/a0db5e588506
app组成结构
META-INF/:包含CERT.SF和CERT.RSA签名文件以及MANIFEST.MF 清单文件
assets/:包含应用可以使用AssetManager对象检索的应用资源。
res/:包含未编译到的资源 resources.arsc。
lib/:包含特定于处理器软件层的编译代码。该目录包含了每种平台的子目录,像armeabi,armeabi-v7a, arm64-v8a,x86, x86_64,和mips。
resources.arsc:包含已编译的资源。该文件包含res/values/ 文件夹所有配置中的XML内容。打包工具提取此XML内容,将其编 译为二进制格式,并将内容归档。此内容包括语言字符串和样式,以及直接包含在*resources.arsc8文件中的内容路径 ,例如布局文件和图像。(包括 :R.java和resources.arsc,生成的工具是aapt)
classes.dex:包含以Dalvik / ART虚拟机可理解的DEX文件格式编译的类。(Android运行的是dex文件,java是.class文件)
AndroidManifest.xml:包含核心Android清单文件。该文件列出应用程序的名称,版本,访问权限和引用的库文件。该文件使用Android的二进制XML格式。
apk 大小优化
1 :减少dex文件大小
shrinkResources为true表示移除未引用资源,和代码压缩协同工作。
minifyEnabled为true表示通过ProGuard启用代码压缩,配合proguardFiles的配置对代码进行混淆并移除未使用的代码。
代码混淆在压缩apk的同时,也提升了安全性
2:减少res,压缩图文文件:
图片文件压缩是针对jpg和png格式的图片。我们通常会放置多套不同分辨率的图片以适配不同的屏幕,这里可以进行适当的 删减。在实际使用中,只保留一到两套就足够了(保留一套的话建议保留xxhdpi,两套的话就加上hdpi),然后再对剩余的图片 进行压缩(jpg采用优图压缩,png尝试采用pngquant压缩)
同时android 为了适配国际化,app的value 对应数据只需要配置对应得语言
3:减少lib文件大小:
由于引用了很多第三方库,lib文件夹占用的空间通常都很大,特别是有so库的情况下。很多so库会同时引入armeabi、armeabi-v7a和x86这几种类型,这里可以只保留armeabi或armeabi-v7a的其中一个就可以了,实际上微信等主流app都是这么做的。
APK 代码混淆:
博客连接 : https://www.jianshu.com/p/cba8ca7fc36d
https://blog.csdn.net/sdfsdfdfa/article/details/81058270
前言介绍:
Android中的“混淆”可以分为两部分,一部分是 Java 代码的优化与混淆,依靠 proguard 混淆器来实现----》由于代码混淆用简单抽象的单词代替原有长而通俗易懂的代码,因而减少APK的体积
另一部分是资源压缩,将移除项目及依赖的库中未被使用的资源----》Gradle为Android提供的插件,能将项目中未使用的资源安全移除,大大减少APK体积
出现问题:
proguard-android.txt ---->默认 ProGuard 配置文件 (proguard-android.txt) 足以满足需要,ProGuard 会移除所有(并且只会移除)未使用的代码。但是,ProGuard可能会移除应用真正需要的代码
当应用引用的类只来自 AndroidManifest.xml 文件时;
当应用调用的方法来自 Java 原生接口 (JNI) 时;
当应用在运行时(例如使用反射或自检)操作代码时。
继承某个Activity, 但是Activity内部类混淆导致程序崩溃
json转换成某个包下的 model 后,这个包被混淆了,那么解析json 可能会出错
APK 多渠道打包:
前言 参考 https://github.com/Meituan-Dianping/walle
在安装包中添加不同的标识,配合自动化埋点,应用在请求网络的时候携带渠道信息,方便后台做运营统计,比如说统计我 们的应用在不同应用市场的下载量等信息,或者不同版本app 上架不同应用市场等
1: 在manifest.xml文件中配置动态渠道变量
2 :接着在app目录下的build.gradle中配置productFlavors,也就是配置打包的渠道
3: 根据配置的打包渠道,通过gradle命令,输出不同渠道的app
执行./gradlew assembleRelease ,将会打出所有渠道的release包
执行./gradlew assembleVIVO,将会打出VIVO渠道的release和debug版的包
执行./gradlew assembleVIVORelease将生成VIVO的release包