alibaba / freeline

A super fast build tool for Android, an alternative to Instant Run
https://www.freelinebuild.com/
BSD 3-Clause "New" or "Revised" License
5.48k stars 623 forks source link

FreelinePlugin获取jar-deps的问题 #134

Closed muyiou closed 8 years ago

muyiou commented 8 years ago
  classesProcessTask.inputs.files.files.each { f ->
                    if (f.isDirectory()) {
                        f.eachFileRecurse(FileType.FILES) { file ->
                            backUpClass(file, backUpDirPath)
                            FreelineInjector.inject(excludeHackClasses, file, modules)
                        }
                        if (f.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)
                        }
                    }
                }

如果一个classesProcessTask对应的transform得到的input是多级目录,这里就获取不到jar了吧,为什么不把 jarDependencies.add(f.path)放到递归操作里?

lomanyong commented 8 years ago

@muyiou 这个函数是groovy下的递归遍历文件的函数哈~效果是一样的

f.eachFileRecurse(FileType.FILES) { file ->
    backUpClass(file, backUpDirPath)
    FreelineInjector.inject(excludeHackClasses, file, modules)
}
muyiou commented 8 years ago

@lomanyong 递归的以后会把file加到jarDependencies里吗?

lomanyong commented 8 years ago

@muyiou 恩,只有.jar结尾的会加入

muyiou commented 8 years ago

@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里

lomanyong commented 8 years ago

@muyiou 恩,这里确实是遗漏了的,下个版本修复,多谢指正。

muyiou commented 8 years ago

OK 我们其实不确定transform 拿到的input到底是个dir还是file

lomanyong commented 8 years ago

@muyiou 就目前的各种日志来看,基本都是一级目录,暂时还没有发现二级目录的情况,在这个循环里。

muyiou commented 8 years ago

@lomanyong 你试一下执行这个逻辑的时候: classesProcessTask = project.tasks.findByName("transformClassesWithDexFor${variant.name.capitalize()}")

transform的input?

lomanyong commented 8 years ago

@muyiou 什么意思呢?

muyiou commented 8 years ago

比如修改成下面这样

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()}")
}
muyiou commented 8 years ago

得到的应该是jarMergingTransform的结果

lomanyong commented 8 years ago

@muyiou 有点忘了,这段逻辑的input/output之前应该都有测试过。印象中是还有一些问题。后面可以再来验证看看。

lomanyong commented 8 years ago

@muyiou 也欢迎加入我们的交流群一起来讨论哈

muyiou commented 8 years ago

恩,我感觉的实现兼容性不太强,比如开启proguard的时候都没有jarMerging这个transform(虽然freeline不允许开启proguard)

lomanyong commented 8 years ago

@muyiou 是的,默认debug状态下认为不开启proguard,proguard本身也影响编译速度..

muyiou commented 8 years ago

@lomanyong 感觉这里改成transform的实现要好一些,本来transform的作用就是在dex之前修改class的,这样就不会有一系列transform的判断了

lomanyong commented 8 years ago

@muyiou 现在的实现其实就是类似hook的机制,jar-dep是去hook到dex task的入口,res-dep是去hook到res merge的入口。要修改为transform其实也类似,instant-run就是通过transform来实现的,机制变更了,但是本质上还是没有区别的。

muyiou commented 8 years ago

lomanyong commented 8 years ago

@muyiou 你们的应用可以正常接入freeline吗?

muyiou commented 8 years ago

@lomanyong 除了jar-dep那个问题,还没有深入使用