Skip to content

Commit 50bc0cc

Browse files
committed
added aar plugin
1 parent de881bd commit 50bc0cc

File tree

3 files changed

+138
-0
lines changed

3 files changed

+138
-0
lines changed

buildSrc/build.gradle

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
apply plugin: 'groovy'
2+
3+
repositories {
4+
google()
5+
jcenter()
6+
}
7+
8+
dependencies {
9+
implementation gradleApi()
10+
implementation localGroovy()
11+
implementation 'com.android.tools.build:gradle:3.5.1'
12+
}
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
package processing.android
2+
3+
import org.gradle.api.Plugin
4+
import org.gradle.api.Project
5+
import org.gradle.api.plugins.PluginManager
6+
import org.gradle.api.plugins.ExtensionContainer
7+
import org.gradle.plugins.ide.idea.IdeaPlugin
8+
import org.gradle.plugins.ide.idea.model.IdeaModel
9+
import org.gradle.plugins.ide.idea.model.IdeaModule
10+
import org.gradle.api.artifacts.Configuration
11+
import org.gradle.api.artifacts.transform.ArtifactTransform
12+
13+
import static org.gradle.api.internal.artifacts.ArtifactAttributes.ARTIFACT_FORMAT
14+
import com.android.build.gradle.internal.dependency.AarTransform
15+
import com.android.build.gradle.internal.dependency.ExtractAarTransform
16+
import com.android.build.gradle.internal.publishing.AndroidArtifacts
17+
import com.android.builder.aar.AarExtractor
18+
import com.google.common.collect.ImmutableList
19+
import java.util.regex.Pattern
20+
import static com.android.SdkConstants.FD_JARS
21+
import static com.android.SdkConstants.FN_CLASSES_JAR
22+
23+
import java.io.File
24+
import java.nio.file.Files
25+
import static java.nio.file.StandardCopyOption.REPLACE_EXISTING
26+
27+
/**
28+
* Build Gradle plgin needed to use aar files as dependencies in a pure java library project.
29+
* Adapted from the following plugin by nekocode
30+
* https://github.com/nekocode/Gradle-Import-Aar
31+
* Ported to Groovy, and made specific to the needs of the Android mode build process (i.e.: this plugin
32+
* is not meant to be used with other projects).
33+
*/
34+
class ImportAar implements Plugin<Project> {
35+
36+
final String CONFIG_NAME_POSTFIX = "Aar"
37+
38+
void apply(Project project) {
39+
def aar = AndroidArtifacts.TYPE_AAR
40+
def jar = AndroidArtifacts.TYPE_JAR
41+
def exp = AndroidArtifacts.TYPE_EXPLODED_AAR
42+
43+
// // Create aar configurations
44+
Collection<Configuration> allConfigs = project.getConfigurations().toList()
45+
for (Configuration config: allConfigs) {
46+
Configuration aarConfig = project.configurations.maybeCreate(config.name + CONFIG_NAME_POSTFIX)
47+
48+
// Add extracted jars to original configuration after project evaluating
49+
aarConfig.getAttributes().attribute(ARTIFACT_FORMAT, jar)
50+
project.afterEvaluate {
51+
for (File jarFile: aarConfig) {
52+
// print "================================================> FILE "
53+
// println jarFile
54+
// println jarFile.getName()
55+
// for (String s: project.sourceSets.main.compileClasspath) {
56+
// println s
57+
// }
58+
// project.getDependencies().add(config.name, project.files(jarFile))
59+
60+
// Add jar file to classpath
61+
project.sourceSets.main.compileClasspath += project.files(jarFile)
62+
63+
File libraryFolder = new File(System.getProperty("user.dir"), "build/libs")
64+
libraryFolder.mkdirs()
65+
66+
// Strip version number when copying
67+
String name = jarFile.getName()
68+
int p = name.lastIndexOf("-")
69+
String libName = name.substring(0, p) + ".jar"
70+
File libraryJar = new File(libraryFolder, libName)
71+
Files.copy(jarFile.toPath(), libraryJar.toPath(), REPLACE_EXISTING)
72+
}
73+
74+
}
75+
76+
// Tell Idea about our aar configuration
77+
PluginManager pluginManager = project.getPluginManager()
78+
pluginManager.apply(IdeaPlugin.class)
79+
ExtensionContainer extensions = project.getExtensions()
80+
// IdeaModel model = extensions.getByType​(IdeaModel.class)
81+
IdeaModel model = extensions.getByName("idea")
82+
IdeaModule module = model.getModule()
83+
module.scopes.PROVIDED.plus += [aarConfig]
84+
}
85+
86+
// Register aar transform
87+
project.dependencies {
88+
registerTransform {
89+
from.attribute(ARTIFACT_FORMAT, aar)
90+
to.attribute(ARTIFACT_FORMAT, jar)
91+
artifactTransform(AarJarArtifactTransform.class)
92+
}
93+
}
94+
}
95+
96+
static class AarJarArtifactTransform extends ArtifactTransform {
97+
@Override
98+
List<File> transform(File file) {
99+
// println "Transforming---------------------------------"
100+
// println outputDirectory
101+
// println file
102+
File explodedDir = new File(getOutputDirectory(), "exploded")
103+
// println explodedDir
104+
105+
AarExtractor aarExtractor = new AarExtractor()
106+
aarExtractor.extract(file, explodedDir)
107+
File classesJar = new File(new File(explodedDir, FD_JARS), FN_CLASSES_JAR)
108+
// println classesJar
109+
110+
// String[] names = file.getPath().split(Pattern.quote(File.separator))
111+
// print "NAMES "
112+
// println names
113+
// print "NAME "
114+
// println file.getName()
115+
// String aarName = names[names.length - 4].replace(".aar", "")
116+
String aarName = file.getName().replace(".aar", "")
117+
// print "AAR NAME "
118+
// println aarName
119+
File renamedJar = new File(getOutputDirectory(), aarName + ".jar")
120+
renamedJar << classesJar.bytes
121+
122+
return ImmutableList.of(renamedJar)
123+
}
124+
}
125+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
implementation-class=processing.android.ImportAar

0 commit comments

Comments
 (0)