我有以下形式的项目结构:
Root Project
+------ Module A
+------ Module B
现在模块B是一个庞大的项目,但我使用API来访问它,所以我想在运行时加载模块B的类。因此我想编译它,但在一个单独的DEX文件中。我可以通过以下要点编译一个单独的DEX文件:
https://gist.github.com/nickcaballero/7045993
在调试编译模式下,这可以正常工作,因为可以通过此表单中的buildscript更改DEXed库
def libraryFiles = new ArrayList<?>()
variant.dex.libraries.each {
File file ->
// Exclude Module B from Dex library list
if (!file.absolutePath.contains("ModuleB/unspecified/classes.jar")) {
libraryFiles.add(file);
}
}
variant.dex.libraries = libraryFiles
现在这很有效,因为AndroidBuilder
没有做proguard时,只是使用variant.dex.libraries
来创建DEX文件,排除它很容易。当需要做中级班的进步时,痛苦就来了。由于ModuleB
是编译时依赖项(出于资源集成/布局等目的),因此其类被编译到构建目录中。
然而,当它获得进展时,Android Builder中定义的默认proguard任务会将classes.jar
文件作为libraryJars
投入。
最后,任务创建classes-proguard
,其中包含上述库Jars中的所有类。然后得到DEXed,并且通过Runtime加载的类存在于其中。有没有办法排除某些罐子没有被送入默认的proguard任务?