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

标签 android gradle aop aspectj

我已经搜索了很多,但还没有看到这个问题的答案。我有不同口味的来源。像这样的东西:

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")

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

最佳答案

您可以使用以下方法迭代特定变体的可用口味: def currentFlavor; variant.productFlavors.each { flavor -> flavor 选择 = flavor }

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

android.sourceSets."${flavorToChoose}".java.srcDirs.each { 路径元素(位置:it.absolutePath) }

确保将此 block 粘贴到您的 sourceroots 部分。

关于android - 将 Gradle 和 AspectJ 与具有自己源代码的 Android 产品风格一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27824953/

相关文章:

Java .xml 创建可绘制按钮背景

android - 左下角的 float 操作按钮。安卓

java - 将 Android 平板电脑与蓝牙设备配对后使用 logcat

java - Google Cloud KMS java.lang.NoSuchMethodError:com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String; CLjava/lang/Object;)V

postsharp - 如何广泛应用 Postsharp 方面解决方案(命名空间中的所有类)

java - 如何使用spring AOP切入点表达式拦截返回类型List

android - 类型不匹配。必需 : Color Found: Any. 如何解决此问题?

java - 一种禁用动态加载的 JAR 之间共享 Gradle 依赖关系的方法

android - TransformException : java. util.zip.ZipException : duplicate entry: android/support/annotation/StyleRes. 类

java - 使用gradle生成方法aspectOf()