APK结构:
AndroidManifest.xml:包含核心Android清单文件。该文件列出应用程序的名称,版本,访问权限和引用的库文件。
classes.dex:包含以Dalvik / ART虚拟机可理解的DEX文件格式编译的类
resources.arsc :包含已编译的资源,包含res/values/文件夹所有配置中的XML内容
assets:包含应用可以使用AssetManager对象检索的应用资源,里面的资源不生成id,通过文件名的方式打开
res:已编译过的资源文件,包括drawable,layout,color,xml,anim,mipmap
lib:存放so文件,如armeabi,armeabi-v7a, arm64-v8a,x86,x86_64等。
META-INF:包含CERT.SF和 CERT.RSA签名文件以及MANIFEST.MF 清单文件
图片资源压缩:
尽量使用WebP格式的图片:Android4.0以上支持有损WebP格式的图片,Android4.3以上支持含透明度的WebP
JPG:不支持透明色,使用的一种失真压缩 标准方法,多次上传下载后,图片逐渐会失真
PNG:无损数据压缩,支持透明度
另外可以用矢量图或.9图片代替小图片
assets文件删除和压缩
一般在assets会存放html、xml 或者json,或者javascript文件,对于这些文件的压缩遵循一条原则,精炼、不考虑可读性。
使用ProGuard:
proguard的四个功能:
压缩:移除未使用的类、方法、字段等;
优化:优化字节码、简化代码等操作;
混淆:使用简短的、无意义的名称重全名类名、方法名、字段等;
预校验:为class添加预校验信息;
使用如下gradle配置为发布构建启用代码压缩:
android {buildTypes {release {shrinkResources true //资源压缩去除无用资源minifyEnabled trueproguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'}}
}
通过资源混淆可以把资源的长路径名用无意义的短路径名替换,从而达到节省空间的目的;
AndResGuard
AndResGuard通过修改resources.arsc文件,从而可以混淆安卓的资源文件路径,比如:
res/drawable/activity_advanced_setting_for_test=>r/d/a
andresGuard在原生的buildApk步骤之后,使用产生的apk作为输入文件,对其进行混淆压缩,产出一个新的apk
AndResGuard依赖:
apply plugin: 'AndResGuard'buildscript {repositories {jcenter()google()}dependencies {classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.17'}
}andResGuard {mappingFile = nulluse7zip = trueuseSign = truekeepRoot = falsefixedResName = "arg"mergeDuplicatedRes = truewhiteList = [// your icon"R.drawable.icon",// for fabric"R.string.com.crashlytics.*",// for google-services"R.string.google_app_id","R.string.gcm_defaultSenderId","R.string.default_web_client_id","R.string.ga_trackingId","R.string.firebase_database_url","R.string.google_api_key","R.string.google_crash_reporting_api_key"]compressFilePattern = ["*.png","*.jpg","*.jpeg","*.gif",]sevenzip {artifact = 'com.tencent.mm:SevenZip:1.2.17'}
}
AndResGuard
字体提取
如果只使用了一个字体的少量的字符,那么可以使用fonttools把这些字符提取出来
移除x86
ndk {abiFilters "armeabi"}
https://www.jianshu.com/p/99f3c09982d4
https://www.jianshu.com/p/97476e095e1a