- 图片裁剪 将原有图片裁剪为webp 格式 ,兼容性问题 android 18以上透明度通道才能用
2.移除无用资源 与代码 minifyEnabled =true 开启混淆 ,但是这里 google 在移除无用资源的使用的手段也是非常温和的,并不是将无用资源排除,而是清空drawable 与图片的内容,这样即使排除出错的情况下,也不会让app崩溃
3.当前应用市场针对 cpu架构也会有限制,要求上传2份apk 一份是64位的,一份是32的,那么就可以针对这种情况使用变体来进行瘦身,在编译64位包的时候排除32 位 so文件,反之亦然
我们可以通过变体来实现这个功能
flavorDimensions "default"
productFlavors{
arm32{
dimension "default"
ndk{
abiFilters "armeabi-v7a"
}
}
arm64{
dimension "default"
ndk{
abiFilters "armeabi-v8a"
}
}
}
通过图片上的操作,通过build 下面的makeProject 就能打出想要的包了
- colorFilter 与 tint 这两个都会让我们使用的资源数量大大减少,
5.使用 @IntDef 代替枚举
@Target({ElementType.PARAMETER,ElementType.FIELD})
@Retention(RetentionPolicy.SOURCE)
@IntDef({default_type,select_type})
public @interface TsmTarget {
int default_type=0;
int select_type=1;
}
上面是书写的例子
fun setTag(@TsmTarget type: Int ){
}
@TsmTarget
private var mtype: Int= TsmTarget.default_type
这里是使用的例子
6.从android 系统方面,系统代码 外部类提供给非静态内部类的使用的属性都是包级别的共享,原因是
从这张图片里面能给出的信息是两个的字节码竟然不一致,私有的比较长,并且是通过方法调用获取的
7.模仿微信使用资源混淆 AndResGuard
8.矢量图使用 ,android 官方建议我们使用将小的图片替换为矢量图,原因是矢量图比较浪费性能,特别大的矢量图会导致性能损耗比较严重
9.剩下的优化方面都是从项目级别才能看到不同之处,所以不同的app 会有很多不同之处,就比如说三方库排除等等
10.看到现在很多app对部分功能做了dex拆分,一些不常用的功能是将dex文件放到服务器上,用户使用时下载dex文件,但这里会伴随着其他问题,而且需要对dex做一些比较深入的操作,技术难度比较大
- 我在android 的官方文档中还看到这样一段话,我贴一下
APK 可能包含用户下载但从不使用的内容,例如其他语言或针对特定屏幕密度的资源。如需确保为用户提供最小的下载文件,您应该使用 Android App Bundle 将应用上传到 Google Play。通过上传 App Bundle,Google Play 能够针对每位用户的设备配置生成并提供经过优化的 APK,因此用户只需下载运行您的应用所需的代码和资源。您无需再构建、签署和管理多个 APK 以支持不同的设备,而用户也可以获得更小、更优化的下载文件包。
如果您不打算将应用发布到 Google Play,则可以将应用细分为多个 APK,并按屏幕尺寸或 GPU 纹理支持等因素进行区分。
当用户下载您的应用时,他们的设备会根据设备的功能和设置接收正确的 APK。这样,设备不会接收设备所不具备的功能的资源。例如,如果用户具有 hdpi
设备,则不需要您可能会为具有更高密度显示器的设备提供的 xxxhdpi
资源。