繁体   English   中英

将Gradle和AspectJ与具有自己的源代码的Android产品风格一起使用

[英]Using Gradle and AspectJ with Android product flavors that have their own source

我搜索了很多,但没有看到答案。 我的来源有不同的风格。 就像是:

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任务运行时,它可以找到它正在构建的特定变体所需的源? 如果我assembleFlavorARelease,我的变体名称将类似于flavorARelease,我可以通过执行variant.buildType.name来获取“release”的构建类型,但这对我没有帮助。 我需要将它指向我正在构建的味道的来源。

我接受了variant.name并从中删除了构建类型名称,留下了“flavorA”部分:

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

仍然看起来很不稳定。 如果我想组装发布并构建所有口味怎么办? 必须有一个更好的方法来接近这个,我没有看到。

您可以使用以下命令迭代特定变体的可用flavor: def currentFlavor; variant.productFlavors.each { flavor -> flavorToChoose = flavor } def currentFlavor; variant.productFlavors.each { flavor -> flavorToChoose = flavor }

从这里你可以从列表中获取你想要的味道,然后添加一个类似于“主”源集的路径元素,如:

android.sourceSets."${flavorToChoose}".java.srcDirs.each { pathelement(location: it.absolutePath) }

确保在源根部分中粘贴此块。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM