App 瘦身方案

  1. 图片裁剪 将原有图片裁剪为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"
          }
      }
  }
image.png

通过图片上的操作,通过build 下面的makeProject 就能打出想要的包了

image.png
  1. 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 系统方面,系统代码 外部类提供给非静态内部类的使用的属性都是包级别的共享,原因是

image.png

从这张图片里面能给出的信息是两个的字节码竟然不一致,私有的比较长,并且是通过方法调用获取的

7.模仿微信使用资源混淆 AndResGuard

8.矢量图使用 ,android 官方建议我们使用将小的图片替换为矢量图,原因是矢量图比较浪费性能,特别大的矢量图会导致性能损耗比较严重

9.剩下的优化方面都是从项目级别才能看到不同之处,所以不同的app 会有很多不同之处,就比如说三方库排除等等

10.看到现在很多app对部分功能做了dex拆分,一些不常用的功能是将dex文件放到服务器上,用户使用时下载dex文件,但这里会伴随着其他问题,而且需要对dex做一些比较深入的操作,技术难度比较大

  1. 我在android 的官方文档中还看到这样一段话,我贴一下

APK 可能包含用户下载但从不使用的内容,例如其他语言或针对特定屏幕密度的资源。如需确保为用户提供最小的下载文件,您应该使用 Android App Bundle 将应用上传到 Google Play。通过上传 App Bundle,Google Play 能够针对每位用户的设备配置生成并提供经过优化的 APK,因此用户只需下载运行您的应用所需的代码和资源。您无需再构建、签署和管理多个 APK 以支持不同的设备,而用户也可以获得更小、更优化的下载文件包。

如果您不打算将应用发布到 Google Play,则可以将应用细分为多个 APK,并按屏幕尺寸或 GPU 纹理支持等因素进行区分。

当用户下载您的应用时,他们的设备会根据设备的功能和设置接收正确的 APK。这样,设备不会接收设备所不具备的功能的资源。例如,如果用户具有 hdpi 设备,则不需要您可能会为具有更高密度显示器的设备提供的 xxxhdpi 资源。

如需了解详情,请参阅配置 APK 拆分维护多个 APK

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容