@@ -3,82 +3,71 @@ package cn.hx.plugin.junkcode.plugin
33import cn.hx.plugin.junkcode.ext.AndroidJunkCodeExt
44import cn.hx.plugin.junkcode.ext.JunkCodeConfig
55import cn.hx.plugin.junkcode.task.AndroidJunkCodeTask
6- import com.android.build.gradle.AppExtension
76import org.gradle.api.Plugin
87import org.gradle.api.Project
98
109class AndroidJunkCodePlugin implements Plugin<Project > {
1110
1211 @Override
1312 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 " ) ) {
1615 throw IllegalArgumentException (" must apply this plugin after 'com.android.application'" )
1716 }
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 ))
2118 android. applicationVariants. all { variant ->
2219 def variantName = variant. name
2320 def junkCodeConfig = generateJunkCodeExt. variantConfig. findByName(variantName)
2421 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
4327 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)
4752 break
4853 }
4954 }
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+ }
5070 }
5171 }
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)
8372 }
8473}
0 commit comments