JailedBird / ArouterGradlePlugin

Arouter auto register plugin for AGP7.4+ & AGP8
Apache License 2.0
46 stars 7 forks source link

多个plugin导致classes.jar被覆盖问题 #5

Open tribelei opened 9 months ago

tribelei commented 9 months ago

你好,我们app不仅使用arouter,而且原来还有一个plugin使用transform,在更换了你的ArouterPlugin后,将我们原来的transform也按照一样的写法进行了重构(我看官网也推荐这个方法),但问题出在:

toTransform方法的output路径是agp注入的:

image image

经我调试这个注入的路径是:/build/intermediates/classes/xxx/ALL/claases.jar

当第一个plugin将所有的class,jar处理后,都输出到/build/intermediates/classes/xxx/ALL/class.jar,而这个jar,将作为第二个plugin执行时的唯一的allJars输入,问题就出在这里,而此时output依然是.../ALL/claases.jar,这就导致对第二个(理论上是后续所有)的plugin来说,存在一个jar既是输入,也是输出,当遍历进行class复制时,output会覆盖input,导致input为空,进而后续操作都失败,最终得到一个空的classes.jar。

之前很少写插件,不太熟悉这块,我找了很久没有找到解决方案,所以临时将我的插件中插入了如下逻辑:

fun backupInputJars(inputJars: List<File>, outputFile: File, backupName: String): List<File> {
        return mutableListOf<File>().apply {
            addAll(inputJars)
            forEachIndexed { i, jarFile ->
                if (jarFile.absolutePath == outputFile.absolutePath) {
                    val backupDir = File(jarFile.parent, backupName.ifEmpty { "backup" })
                    if (!backupDir.exists()) {
                        backupDir.mkdirs()
                    }
                    val backupFile = File(backupDir, jarFile.name)
                    if (backupFile.exists()) {
                        backupFile.delete()
                    }
                    jarFile.copyTo(backupFile)
                    set(i, backupFile)
                }
            }
        }
    }

但总感觉不是对的方案,所以想请教应该如何解决,感谢~

JailedBird commented 9 months ago

这么看的话,按照官方写法2个以上插件都会出问题,每次输入和下一次输入都是这个classes.jar,这个肯定是不合理的;

目前春运ing没电脑,或许可以将每个插件输出加一个限定名称,比如arouter插件限定输出为 classes_arouter.jar 下次transform应该可以识别到这个输入; 待验证 哈哈

tribelei commented 9 months ago

这么看的话,按照官方写法2个以上插件都会出问题

是的,这是问题的核心,我可以用这种方式避开,但任何两个及以上采用这种方案的三方插件都会导致问题 我尝试将output设定目录:output.set(file),会在运行时抛出异常property 'output' is final and cannot be changed any further,不能被二次修改...局面一时很难破解...

节前这个逼码就先写到这了,有验证或结论及时分享呀,春运路上注意安全~

JailedBird commented 9 months ago

节前这个逼码就先写到这了,有验证或结论及时分享呀,春运路上注意安全~

好的, 这个issue先不关闭、后续跟进; 节前这个逼代码就先写到这吧 哈哈🤣

JailedBird commented 9 months ago

xd, 还在么, 方便加个微信JailedBird,看下这个问题;我这不是很好复现; 你看下是不是task任务名称相同导致的? image

下图是我同事,使用2个组合在一起的情况:用起来是没问题的; 企业微信截图_b5726854-05a9-48f2-86f9-452efb4e9db1

ZMCurry commented 1 month ago

xd, 还在么, 方便加个微信JailedBird,看下这个问题;我这不是很好复现; 你看下是不是task任务名称相同导致的? image

下图是我同事,使用2个组合在一起的情况:用起来是没问题的; 企业微信截图_b5726854-05a9-48f2-86f9-452efb4e9db1

我这边路径也是固定:/build/intermediates/classes/xxx/ALL/claases.jar ,请问下你这个ALL文件夹里怎么出现两个子文件夹的