@@ -3,82 +3,71 @@ package cn.hx.plugin.junkcode.plugin
3
3
import cn.hx.plugin.junkcode.ext.AndroidJunkCodeExt
4
4
import cn.hx.plugin.junkcode.ext.JunkCodeConfig
5
5
import cn.hx.plugin.junkcode.task.AndroidJunkCodeTask
6
- import com.android.build.gradle.AppExtension
7
6
import org.gradle.api.Plugin
8
7
import org.gradle.api.Project
9
8
10
9
class AndroidJunkCodePlugin implements Plugin<Project > {
11
10
12
11
@Override
13
12
void apply (Project project ) {
14
- def android = project. extensions. findByType( AppExtension )
15
- if (! android) {
13
+ def android = project. extensions. findByName( " android " )
14
+ if (! android || ! android . hasProperty( " applicationVariants " ) ) {
16
15
throw IllegalArgumentException (" must apply this plugin after 'com.android.application'" )
17
16
}
18
- def generateJunkCodeExt = project. extensions. create(" androidJunkCode" , AndroidJunkCodeExt )
19
- generateJunkCodeExt. variantConfig = project. container(JunkCodeConfig . class, new JunkCodeConfigFactory ())
20
-
17
+ def generateJunkCodeExt = project. extensions. create(" androidJunkCode" , AndroidJunkCodeExt , project. container(JunkCodeConfig ))
21
18
android. applicationVariants. all { variant ->
22
19
def variantName = variant. name
23
20
def junkCodeConfig = generateJunkCodeExt. variantConfig. findByName(variantName)
24
21
if (junkCodeConfig) {
25
- createGenerateJunkCodeTask(project, android, variant, junkCodeConfig)
26
- }
27
- }
28
- }
29
-
30
- private def createGenerateJunkCodeTask = { project , android , variant , junkCodeConfig ->
31
- def variantName = variant. name
32
- def generateJunkCodeTaskName = " generate${ variantName.capitalize()} JunkCode"
33
- def dir = new File (project. buildDir, " generated/source/junk/$variantName " )
34
- def resDir = new File (dir, " res" )
35
- def javaDir = new File (dir, " java" )
36
- def manifestFile = new File (dir, " AndroidManifest.xml" )
37
- def packageName = android. namespace// AGP 7.3+
38
- if (! packageName) {// AGP under 7.3
39
- // 从AndroidManifest.xml找到package name
40
- for (int i = 0 ; i < variant. sourceSets. size(); i++ ) {
41
- def sourceSet = variant. sourceSets[i]
42
- if (sourceSet. manifestFile. exists()) {
22
+ def junkCodeNamespace = " "
23
+ if (android. hasProperty(" namespace" )) {// AGP 7.3+
24
+ junkCodeNamespace = android. namespace
25
+ } else {
26
+ // 从AndroidManifest.xml找到package name
43
27
def parser = new XmlParser ()
44
- def node = parser. parse(sourceSet. manifestFile)
45
- packageName = node. attribute(" package" )
46
- if (packageName) {
28
+ for (int i = 0 ; i < sourceSets. size(); i++ ) {
29
+ def sourceSet = sourceSets[i]
30
+ if (sourceSet. manifestFile. exists()) {
31
+ def node = parser. parse(sourceSet. manifestFile)
32
+ if (node. attribute(" package" )) {
33
+ junkCodeNamespace = node. attribute(" package" )
34
+ break
35
+ }
36
+ }
37
+ }
38
+ }
39
+ def junkCodeOutDir = new File (project. buildDir, " generated/source/junk/$variantName " )
40
+ def generateJunkCodeTaskName = " generate${ variantName.capitalize()} JunkCode"
41
+ def generateJunkCodeTask = project. tasks. create(generateJunkCodeTaskName, AndroidJunkCodeTask ){
42
+ config = junkCodeConfig
43
+ namespace = junkCodeNamespace
44
+ outDir = junkCodeOutDir
45
+ }
46
+ def manifestFile = new File (junkCodeOutDir, " AndroidManifest.xml" )
47
+ // 将自动生成的AndroidManifest.xml加入到一个未被占用的manifest位置(如果都占用了就不合并了,通常较少出现全被占用情况)
48
+ for (int i = variant. sourceSets. size() - 1 ; i >= 0 ; i-- ) {
49
+ def sourceSet = variant. sourceSets[i]
50
+ if (! sourceSet. manifestFile. exists()) {
51
+ sourceSet. manifest. srcFile(manifestFile)
47
52
break
48
53
}
49
54
}
55
+ def javaDir = new File (junkCodeOutDir, " java" )
56
+ variant. registerJavaGeneratingTask(generateJunkCodeTask, javaDir)
57
+ def resDir = new File (junkCodeOutDir, " res" )
58
+ if (variant. respondsTo(" registerGeneratedResFolders" )) {// AGP 3.0.0+
59
+ variant. registerGeneratedResFolders(project
60
+ .files(resDir)
61
+ .builtBy(generateJunkCodeTask))
62
+ if (variant. hasProperty(" mergeResourcesProvider" )) {// AGP 3.3.0+
63
+ variant. mergeResourcesProvider. configure { dependsOn(generateJunkCodeTask) }
64
+ } else {
65
+ variant. mergeResources. dependsOn(generateJunkCodeTask)
66
+ }
67
+ } else {
68
+ variant. registerResGeneratingTask(generateJunkCodeTask, resDir)// AGP 1.1.0+
69
+ }
50
70
}
51
71
}
52
- if (! packageName) {
53
- packageName = " "
54
- }
55
- def generateJunkCodeTask = project. task(generateJunkCodeTaskName, type : AndroidJunkCodeTask ) {
56
- config = junkCodeConfig
57
- manifestPackageName = packageName
58
- outDir = dir
59
- }
60
- // 将自动生成的AndroidManifest.xml加入到一个未被占用的manifest位置(如果都占用了就不合并了,通常较少出现全被占用情况)
61
- for (int i = variant. sourceSets. size() - 1 ; i >= 0 ; i-- ) {
62
- def sourceSet = variant. sourceSets[i]
63
- if (! sourceSet. manifestFile. exists()) {
64
- sourceSet. manifest. srcFile(manifestFile)
65
- break
66
- }
67
- }
68
- if (variant. respondsTo(" registerGeneratedResFolders" )) {
69
- variant. registerGeneratedResFolders(project
70
- .files(resDir)
71
- .builtBy(generateJunkCodeTask))
72
- if (variant. hasProperty(" mergeResourcesProvider" )) {
73
- variant. mergeResourcesProvider. configure { dependsOn(generateJunkCodeTask) }
74
- } else {
75
- // noinspection GrDeprecatedAPIUsage
76
- variant. mergeResources. dependsOn(generateJunkCodeTask)
77
- }
78
- } else {
79
- // noinspection GrDeprecatedAPIUsage
80
- variant. registerResGeneratingTask(generateJunkCodeTask, resDir)
81
- }
82
- variant. registerJavaGeneratingTask(generateJunkCodeTask, javaDir)
83
72
}
84
73
}
0 commit comments