booster icon indicating copy to clipboard operation
booster copied to clipboard

修复 当agp版本>=7.2.0 时 图片压缩任务失败的 bug

Open punkisnotdead3 opened this issue 1 year ago • 10 comments

当agp 版本>=7.2.0时,flat 文件中包含的path信息 为一种特殊的相对路径写法,导致从flat提取出来的路径 无法正确读取文件, 经过排查 当7.2.0 新增了一个任务 修改了flat文件中的path,这个任务会生成一个map文件 来标注 相对路径和绝对路径的关系,

所以只要读取这个文件 建立map关系,然后替换掉metadata中的 路径即可 解决该问题,否则 agp>7.2.0是 图片压缩成webp任务 会因为找不到文件而执行失败

punkisnotdead3 avatar Aug 17 '22 03:08 punkisnotdead3

已梳理逻辑重新提交,新增了一个metadata的扩展方法 仅用于 agp7.2

punkisnotdead3 avatar Aug 17 '22 08:08 punkisnotdead3

  • 没必要修改 booster-aapt2
  • 没必要对大部分版本都不兼容的 API 做实现
  • booster-task-compression-pngquant 没有同步修改

johnsonlee avatar Aug 17 '22 11:08 johnsonlee

  • 没必要修改 booster-aapt2

这里有点疑惑,如果metadata的sourcePath不能修改为var的话,那么metadata在构建的时候 就要传 绝对路径进去,但是metadata构建的地方就在aapt2Parser中,这里还有啥别的好一点的修改方法?

punkisnotdead3 avatar Aug 17 '22 14:08 punkisnotdead3

  • 没必要对大部分版本都不兼容的 API 做实现

这个是指v33 v41 等实现中 那些 todo吗? 如果是这样的话,就把对应的task和产物路径 扩展属性 从base中取出来 在用的时候直接取就行了吧?

punkisnotdead3 avatar Aug 17 '22 14:08 punkisnotdead3

Bingo

johnsonlee avatar Aug 20 '22 02:08 johnsonlee

1.新增了png质量压缩 对agp720的适配 2.去除了basevarint中 mapSourceSetPath的task 实现

todo: 1.暂未找到 同时满足 不修改metadata 中path val 变更为var 且 不修改aapt2Parser 实现的情况下 可以修改sourcePath 2. 暂未找到 可以去掉 BaseVariant.sourceSetMap 实现的方法,主要是 InternalArtifactType.SOURCE_SET_PATH_MAP 这个属性只有agp7.2.0 中才有,如果去掉这个实现 那么在task 中 因为task 依赖的gradle api 不是7.2.0 所以 找不到这个依赖

punkisnotdead3 avatar Aug 21 '22 08:08 punkisnotdead3

1.新增了png质量压缩 对agp720的适配 2.去除了basevarint中 mapSourceSetPath的task 实现

todo: 1.暂未找到 同时满足 不修改metadata 中path val 变更为var 且 不修改aapt2Parser 实现的情况下 可以修改sourcePath 2. 暂未找到 可以去掉 BaseVariant.sourceSetMap 实现的方法,主要是 InternalArtifactType.SOURCE_SET_PATH_MAP 这个属性只有agp7.2.0 中才有,如果去掉这个实现 那么在task 中 因为task 依赖的gradle api 不是7.2.0 所以 找不到这个依赖

可以使用 AGPInterface 中提供的 val BaseVariant.allArtifacts: Map<String, FileCollection> API

johnsonlee avatar Aug 21 '22 12:08 johnsonlee

1.新增了png质量压缩 对agp720的适配 2.去除了basevarint中 mapSourceSetPath的task 实现 todo: 1.暂未找到 同时满足 不修改metadata 中path val 变更为var 且 不修改aapt2Parser 实现的情况下 可以修改sourcePath 2. 暂未找到 可以去掉 BaseVariant.sourceSetMap 实现的方法,主要是 InternalArtifactType.SOURCE_SET_PATH_MAP 这个属性只有agp7.2.0 中才有,如果去掉这个实现 那么在task 中 因为task 依赖的gradle api 不是7.2.0 所以 找不到这个依赖

可以使用 AGPInterface 中提供的 val BaseVariant.allArtifacts: Map<String, FileCollection> API

感谢,已用 variant.allArtifacts["SOURCE_SET_PATH_MAP"] 替换实现

punkisnotdead3 avatar Aug 21 '22 14:08 punkisnotdead3

更新: 1、 去除调试信息 2、 去除AAPT parser 的修改,改用METAData的扩展方法 来实现 路径替换 3、by lazy 暂时无法在 internal 注解的变量上使用,故暂时保留initSourceMap方法

punkisnotdead3 avatar Aug 22 '22 17:08 punkisnotdead3

想了想, 既然 @Internal 和 by lazy 有冲突的情况下, 用lateinit var 来定义一个immutable map 不知道是否可行?

但这样val 就变成了var 似乎也没有完全解决问题

punkisnotdead3 avatar Aug 23 '22 12:08 punkisnotdead3