将 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 任务运行时,它可以找到它正在构建的特定变体所需的源?如果我组装 FlavorARelease,我的变体名称将类似于 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")
看起来仍然很不稳定。如果我想组装发布并构建所有口味怎么办?必须有更好的方法来解决这个我没有看到的问题。
您可以使用以下方法迭代特定变体的可用口味:
def currentFlavor;
variant.productFlavors.each { flavor ->
flavorToChoose = flavor
}
从这里您可以从列表中找到您想要的风格,然后添加类似于 "main" 源集的路径元素,例如:
android.sourceSets."${flavorToChoose}".java.srcDirs.each {
pathelement(location: it.absolutePath)
}
确保将此块粘贴到您的 sourceroots 部分。
我已经搜索了很多,但还没有看到这个问题的答案。我有不同口味的来源。类似于:
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" 的构建类型,但这对我没有帮助。我需要将其指向我正在构建的风味的来源。
我从 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 ->
flavorToChoose = flavor
}
从这里您可以从列表中找到您想要的风格,然后添加类似于 "main" 源集的路径元素,例如:
android.sourceSets."${flavorToChoose}".java.srcDirs.each {
pathelement(location: it.absolutePath)
}
确保将此块粘贴到您的 sourceroots 部分。