Closed muyiou closed 8 years ago
@muyiou 这个函数是groovy下的递归遍历文件的函数哈~效果是一样的
f.eachFileRecurse(FileType.FILES) { file ->
backUpClass(file, backUpDirPath)
FreelineInjector.inject(excludeHackClasses, file, modules)
}
@lomanyong 递归的以后会把file加到jarDependencies里吗?
@muyiou 恩,只有.jar
结尾的会加入
@lomanyong 这段逻辑不应该是: classesProcessTask.inputs.files.files.each { f -> if (f.isDirectory()) { f.eachFileRecurse(FileType.FILES) { file -> backUpClass(file, backUpDirPath) FreelineInjector.inject(excludeHackClasses, file, modules) if (file.path.endsWith(".jar")) { jarDependencies.add(f.path) } }
} else {
backUpClass(f, backUpDirPath)
FreelineInjector.inject(excludeHackClasses, f, modules)
if (f.path.endsWith(".jar")) {
jarDependencies.add(f.path)
}
}
}
?之前只把input里一级jar文件到到了jar-dep里
@muyiou 恩,这里确实是遗漏了的,下个版本修复,多谢指正。
OK 我们其实不确定transform 拿到的input到底是个dir还是file
@muyiou 就目前的各种日志来看,基本都是一级目录,暂时还没有发现二级目录的情况,在这个循环里。
@lomanyong 你试一下执行这个逻辑的时候: classesProcessTask = project.tasks.findByName("transformClassesWithDexFor${variant.name.capitalize()}")
transform的input?
@muyiou 什么意思呢?
比如修改成下面这样
if (getMinSdkVersion(variant.mergedFlavor, manifest_path) < 21 && variant.mergedFlavor.multiDexEnabled) {
classesProcessTask = project.tasks.findByName("transformClassesWithDexFor${variant.name.capitalize()}")
} else {
classesProcessTask = project.tasks.findByName("transformClassesWithDexFor${variant.name.capitalize()}")
}
得到的应该是jarMergingTransform的结果
@muyiou 有点忘了,这段逻辑的input/output之前应该都有测试过。印象中是还有一些问题。后面可以再来验证看看。
@muyiou 也欢迎加入我们的交流群一起来讨论哈
恩,我感觉的实现兼容性不太强,比如开启proguard的时候都没有jarMerging这个transform(虽然freeline不允许开启proguard)
@muyiou 是的,默认debug状态下认为不开启proguard,proguard本身也影响编译速度..
@lomanyong 感觉这里改成transform的实现要好一些,本来transform的作用就是在dex之前修改class的,这样就不会有一系列transform的判断了
@muyiou 现在的实现其实就是类似hook的机制,jar-dep是去hook到dex task的入口,res-dep是去hook到res merge的入口。要修改为transform其实也类似,instant-run就是通过transform来实现的,机制变更了,但是本质上还是没有区别的。
恩
@muyiou 你们的应用可以正常接入freeline吗?
@lomanyong 除了jar-dep那个问题,还没有深入使用
如果一个classesProcessTask对应的transform得到的input是多级目录,这里就获取不到jar了吧,为什么不把 jarDependencies.add(f.path)放到递归操作里?