使用Gradle和AspectJ处理具有自己源代码的Android产品风味

3

我做了很多搜索,但没有找到答案。我的源代码有不同的版本,就像这样:

App/src/flavorA/MyFlavor.java
App/src/flavorB/MyFlavor.java
App/src/flavorC/MyFlavor.java

它非常好用,直到我需要运行我的AOP步骤。 我发现它无法完成,因为它无法找到这个类,该类在App / src / main /中引用源代码。

这个不能找到MyFlavor类:

android.applicationVariants.all { variant ->

    variant.javaCompile.doLast {
        def androidSdk = android.adbExe.parent + "/../platforms/" + project.ext.android_version + "/android.jar"
        def iajcClasspath = configurations.compile.asPath + ";" + androidSdk

        // This add's project jars as well as support jars.
        project.ext.tree = fileTree(dir: "${project.buildDir}/intermediates/exploded-aar", include: '**/*.jar')
        project.ext.tree.each { jarFile ->
            iajcClasspath += ":" + jarFile
        }

        ant.taskdef(resource: "org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties",
                classpath: configurations.ajc.asPath)
        ant.iajc(
                source: "1.6",
                target: "1.6",
                destDir: "${project.buildDir}/intermediates/classes/${variant.dirName}",
                fork: "true",
                maxmem: "512m",
                aspectPath: configurations.aspects.asPath,
                inpath: configurations.ajInpath.asPath,
                sourceRootCopyFilter: "**/.svn/*,**/*.java",
                classpath: iajcClasspath
        ) {
            sourceroots {
                android.sourceSets.main.java.srcDirs.each {
                    pathelement(location: it.absolutePath)
                }

                pathelement(location: "${project.buildDir}/generated/source/r/${variant.dirName}")
                pathelement(location: "${project.buildDir}/generated/source/buildConfig/${variant.dirName}")
            }
        }
    }
}

如果我添加以下内容,就可以使其正常工作:

我可以添加类似以下的内容:

pathelement(location: "$`enter code here`{project.buildDir}/../src/flavorA/java")

但是如果我只想构建FlavorA,那么有没有更好的设置方式,使得当IAJC任务运行时,它可以找到它需要构建特定变体所需的源代码呢?如果我组装FlavorARelease,我的变体名称将是类似于flavorARelease的东西,我可以通过variant.buildType.name获取“release”的构建类型,但这对我没有帮助。我需要指向我正在构建的Flavor的源代码。

我取了variant.name并减去了它的构建类型名称,以留下“flavorA”部分:

pathelement(location: "${project.buildDir}/../src/${variant.name.substring(0, variant.name.length() - variant.buildType.name.length())}/java")

仍然看起来不稳定。如果我想组装发布并构建所有口味,有没有更好的方法来处理这个问题,而我没有看到。


看起来,指定的sourceroots只查看android.sourceSets.main.java.srcDirs.each {...}并将其添加为路径元素。问题是我有代码在android.sourceSets.flavorA中,对吗? - Scott Merritt
1个回答

0
您可以使用以下代码迭代特定变体的可用风味: def currentFlavor; variant.productFlavors.each { flavor -> flavorToChoose = flavor } 从这里,您可以从列表中获取所需的风味,然后添加类似于“main”源集的路径元素: android.sourceSets."${flavorToChoose}".java.srcDirs.each { pathelement(location: it.absolutePath) } 请确保将此块粘贴到您的sourceroots部分。

仍然感觉不太稳定和脆弱。别误会,它可以工作。如果你能编写或使用像这样的插件:GradleAndroidAspectJPlugin,我认为你可以让你的Gradle更简单,但你会依赖于其他东西。 - Scott Merritt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接