背景/问题
- 背景
在开发导购或返利类APP时,我们不可避免会使用到淘宝联盟开放平台客户端的SDK。并且SDK需要依赖一个"1像素"大小的安全图片。 - 问题
在开发中,使用flutter run
进行开发跑项目,都是一切正常的。不管是Debug
模式,还是Release
模式,亦或者Profile
模式,都是正常运行的。但是只要使用flutter build apk
一进行打包,打包完成的Apk
拿出去测试时,SDK的初始化必定失败。
思考
这就很让人疑惑了,明明在开发调试阶段都是好好的,但是为啥打包后就无法初始化成功了呢?我在怀疑是不是Android在打包的时把安全图片当成普通图片压缩为一像素的纯图了。
我检查其打包时的输出日志文件。发现由于安全图片没有在代码中使用到,所以在打包时被压缩成了0KB虚拟文件。
解决方案
既然找了问题,那就开始对症下药吧。
首先我尝试将build.gradle
中有关混淆代码和压缩资源的配置都去掉,重新打包。但是安全图片依旧被压缩了。
既然改变Android配置无法改变,那我就严重怀疑是flutter
本身打包的问题了。查看官方文档后,了解到flutter默认使用了R8
压缩:官方文档
方案一
首先最简单的就是按照官方文档的,将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开发人员。如有错误的地方,请指出,我会及时修正!!!
感谢阅览!!!