Flutter 资源压缩导致的问题

Scroll Down

背景/问题

  • 背景
    在开发导购或返利类APP时,我们不可避免会使用到淘宝联盟开放平台客户端的SDK。并且SDK需要依赖一个"1像素"大小的安全图片。
  • 问题
    在开发中,使用flutter run进行开发跑项目,都是一切正常的。不管是Debug模式,还是Release模式,亦或者Profile模式,都是正常运行的。但是只要使用flutter build apk一进行打包,打包完成的Apk拿出去测试时,SDK的初始化必定失败。

思考

这就很让人疑惑了,明明在开发调试阶段都是好好的,但是为啥打包后就无法初始化成功了呢?我在怀疑是不是Android在打包的时把安全图片当成普通图片压缩为一像素的纯图了。
我检查其打包时的输出日志文件。发现由于安全图片没有在代码中使用到,所以在打包时被压缩成了0KB虚拟文件。
1633920407321

解决方案

既然找了问题,那就开始对症下药吧。

首先我尝试将build.gradle中有关混淆代码和压缩资源的配置都去掉,重新打包。但是安全图片依旧被压缩了。
既然改变Android配置无法改变,那我就严重怀疑是flutter本身打包的问题了。查看官方文档后,了解到flutter默认使用了R8压缩:官方文档

flutter R8.jpg

方案一

首先最简单的就是按照官方文档的,将R8压缩功能关闭。


flutter build apk --no-shrink

// 或

flutter build appbundle

方案二

但是由于在App的开发中,资源的压缩必不可少的,Apk的大小越小越好。
所以我使用的是官方的保留的资源方式

创建文件res/raw/keep.xml,并写入下列代码:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
    tools:keep="@layout/l_used*_c,@layout/l_used_a,@layout/l_used_b*"
    tools:discard="@layout/unused2" />

tools:keep 属性表明为保留指定资源
tools:discard 属性中指定每个要舍弃的资源

这样就可以使项目在打包压缩时,忽略安全图片不对其进行压缩。

小结

  • flutter中打包时默认开启R8压缩,可在命令后加--no-shrink关闭该功能。
  • 在Android中,未使用的资源会被压缩为虚拟文件,可以在<resources>标签中使用tools:keep属性保留该文件不被压缩。
  • 在Flutter项目中,Flutter本身的命令优先于Android的build.gradle配置。

上述为本人的个人观点。由于并不是专业的App开发人员。如有错误的地方,请指出,我会及时修正!!!
感谢阅览!!!