APK瘦身方向:
-
代码方面
除必要的封装外,还可以通过混淆压缩release { minifyEnabled true // 是否混淆 //去除无效的文件,但目前还不支持移除app和libray中的values目录下的资源文件(strings,dimensions,styles,colors),这些我//们可以使用Splits解决 shrinkResources true // 混淆的配置文件 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' }
-
lib
轻量级lib是首选; -
so本地库
主流的架构都是arm的; -
资源文件(图片,音频,字体等)
a. 通过Lint工具扫描代码中没有使用到的静态资源,但不包括assets中的文件,方法:在As的 Analyze –>Inspect Code,并合理删除无用代码;b. 图片处理及优化方面
- 必要时可采用图片旋转方式代替添加新的图片:
<rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/blue_btn_icon" android:fromDegrees="180" android:pivotX="50%" android:pivotY="50%" android:toDegrees="180" />
- 在某些时候jpeg可以减少图片的体积(无alpha属性);
- 9.png的图片,特点是可拉伸;
- 在不降低图片效果、保证APK显示效果的前提下缩小图片-如使用tinypng优化大部分图片资源(缺点:对有过渡效果(带alpha值)的图片不能使用,会造成图片失真,这种图片可以将png图片转换为webP格式(软件:iSparta));
- 用svg替换原来图片能立刻将图片减少,而且不用考虑分辨率适配的问题。但在As中需要vectorDrawable配合。
d. 清除你的无用的代码以及资源
-
查询到的都是对当前项目无贡献的资源: Analyze –>Run Inspection by name –> unused resources
-
分析得到没有用的类及方法: Analyze –>Run Inspection by name –> unused declaration
注意:上述两个方法,查询到的文件中也包括了一些需要保留的资源,手动删除前还是需要分析下的(资源使用查询:alt+F7,删除文件:alt+Del)
-
指定资源配置
android { ...... productFlavors { cs { resConfigs "zh","xxhdpi" //指定资源配置 ext.dexOptions = false //调试构建停用 Crashlytics ext.alwaysUpdateBuildId = false //阻止 Crashlytics 不断更新其构建 ID } } }
注意:
无论时尺寸适配还是语言适配,都需要有values这个文件夹,并且values-zh或values-400x320中的所有文件,在values中也"必须也要有",否则会报错
e. 混淆配置参考:https://www.jianshu.com/writer#/notebooks/9538856/notes/28822848
- 必要时可采用图片旋转方式代替添加新的图片:
apk打包
-
配置产品风味实现多个变体:
变体可以理解为apk变体,多少种变体就是多少种apk类型;公式:
变体数 = 被标记为不同种维度的产品风味个数的乘积 * 构建类型个数 - 过滤变体构建类型个数
(如下边例子的 变体数 = 232 - 12 = 10)flavorDimensions "mode","suffix" //产品风味组(也称风味维度,其中有两种维度,优先级前高后低,不同维度的产品风味会自由组合) productFlavors { //产品风味配置标志 cancell{ //产品风味名 dimension "suffix" versionNameSuffix "-csss" } dess{ //产品风味名 dimension "suffix" versionNameSuffix "-devss" } cs { //产品风味名 dimension "mode" resConfigs "zh","en","xxhdpi" ext.dexOptions = false //调试构建停用 Crashlytics ext.alwaysUpdateBuildId = false //阻止 Crashlytics 不断更新其构建 ID buildConfigField 'String', 'API_URL', "\"https://cs.XXX\"" buildConfigField 'String', 'WETCHAT_ID', "\"XXX\"" buildConfigField 'String', 'PAY_URL', "\"https://XXX\"" manifestPlaceholders = [JPUSH_APPKEY: "XXX", JPUSH_PKGNAME: "com.XXX.app", JPUSH_CHANNEL: "developer-default",UMENG_CHANNEL_VALUE: "cs"] } dev { //产品风味名 dimension "mode" buildConfigField 'String', 'API_URL', "\"https://cs.XXX\"" buildConfigField 'String', 'WETCHAT_ID', "\"XXX\"" buildConfigField 'String', 'PAY_URL', "\"https://XXX\"" manifestPlaceholders = [JPUSH_APPKEY: "XXX", JPUSH_PKGNAME: "com.XXX.app", JPUSH_CHANNEL: "developer-default",UMENG_CHANNEL_VALUE: "dev"] } prod { //产品风味名 dimension "mode" buildConfigField 'String', 'API_URL', "\"https://cs.XXX\"" buildConfigField 'String', 'WETCHAT_ID', "\"XXX\"" buildConfigField 'String', 'PAY_URL', "\"https://XXX\"" manifestPlaceholders = [JPUSH_APPKEY: "XXX", JPUSH_PKGNAME: "com.XXX.app", JPUSH_CHANNEL: "developer-default",UMENG_CHANNEL_VALUE: "prod"] } } //变体过滤器,可以过滤掉种变体,配置后在Build > Select Build Variant(或工具窗口栏中的 Build Variants)中,这些构建变体将不会再显示在下拉菜单中。 variantFilter { variant -> def names = variant.flavors*.name if (names.contains("cancell") && names.contains("cs")) { setIgnore(true) } } buildTypes { //构建类型 debug { //构建类型名 signingConfig signingConfigs.debug minifyEnabled false //混淆 zipAlignEnabled true //zipalign优化 shrinkResources false //移除无用resources } release { //构建类型名 signingConfig signingConfigs.release zipAlignEnabled true //zipalign优化 minifyEnabled false shrinkResources false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }
-
Splits构建不同density和ABI 的APK:
android { ... splits { density { enable true exclude "ldpi", "tvdpi", "xxxhdpi" //不能与reset()一起使用 compatibleScreens 'small', 'normal', 'large', 'xlarge' } } android { ... splits { abi { enable true reset() include 'x86', 'armeabi-v7a', 'mips' //必须与reset()一起使用 universalApk true } } } 参数解析: enable: 启用屏幕密度拆分机制 exclude: 默认情况下所有屏幕密度都包括在内,你可以移除一些密度。 include: 表示要包括哪些屏幕密度 reset(): 重置屏幕密度列表为只包含一个空字符串 (这能够实现,在与include一起使用时可以表示使用哪一个屏幕密度,而不是要忽略哪一些屏幕密度) compatibleScreens:表示兼容屏幕的列表。这将会注入到manifest中匹配的 节点。这个设置是可选的。 universalApk:指示是否打包一个通用版本(包含所有的ABI)。默认值为 false。
-
其他
-
查看生产的apk各个资源占用情况:
a. 先要用As生产一个apk;
b. build-Analyze Apk(或者在生产apk时会有analyze提示); -
当apk安装不上问题解决:
如错误信息:It is possible that this issue is resolved by uninstalling an existing version of the apk if it is present, and then re-installing.时,在手机上有没有找到此应用的应用图标,这也有可能是该应用的某个模块在手机上隐式安装了,我们可以先查看工程中都有那些模块(android库模块),记下这些模块名称,再到手机的程序管理中去找,若是有则卸载即可;
-
网友评论