@@ -4,7 +4,6 @@ import cn.hx.plugin.junkcode.ext.AndroidJunkCodeExt
44import cn.hx.plugin.junkcode.ext.JunkCodeConfig
55import cn.hx.plugin.junkcode.task.AndroidJunkCodeTask
66import com.android.build.gradle.AppExtension
7- import com.android.build.gradle.api.ApplicationVariant
87import org.gradle.api.Plugin
98import org.gradle.api.Project
109
@@ -17,71 +16,82 @@ class AndroidJunkCodePlugin implements Plugin<Project> {
1716 throw IllegalArgumentException (" must apply this plugin after 'com.android.application'" )
1817 }
1918 def generateJunkCodeExt = project. extensions. create(" androidJunkCode" , AndroidJunkCodeExt )
19+ generateJunkCodeExt. variantConfig = project. container(JunkCodeConfig . class, new JunkCodeConfigFactory ())
20+
21+ android. applicationVariants. all { variant ->
22+ def variantName = variant. name
23+ def junkCodeConfig = generateJunkCodeExt. variantConfig. findByName(variantName)
24+ if (junkCodeConfig) {
25+ createGenerateJunkCodeTask(project, android, variant, junkCodeConfig)
26+ }
27+ }
28+
2029 project. afterEvaluate {
2130 android. applicationVariants. all { variant ->
2231 def variantName = variant. name
23- Closure<JunkCodeConfig > junkCodeConfig = generateJunkCodeExt. configMap[variantName]
24- if (junkCodeConfig) {
25- def dir = new File (project. buildDir, " generated/source/junk/$variantName " )
26- def resDir = new File (dir, " res" )
27- def javaDir = new File (dir, " java" )
28- def manifestFile = new File (dir, " AndroidManifest.xml" )
29- String packageName = findPackageName(variant)
30- def generateJunkCodeTask = project. task(" generate${ variantName.capitalize()} JunkCode" , type : AndroidJunkCodeTask ) {
31- junkCodeConfig. delegate = config
32- junkCodeConfig. resolveStrategy = DELEGATE_FIRST
33- junkCodeConfig. call()
34- manifestPackageName = packageName
35- outDir = dir
36- }
37- // 将自动生成的AndroidManifest.xml加入到一个未被占用的manifest位置(如果都占用了就不合并了,通常较少出现全被占用情况)
38- for (int i = variant. sourceSets. size() - 1 ; i >= 0 ; i-- ) {
39- def sourceSet = variant. sourceSets[i]
40- if (! sourceSet. manifestFile. exists()) {
41- android. sourceSets. " ${ sourceSet.name} " . manifest. srcFile(manifestFile. absolutePath)
42- break
43- }
44- }
45- if (variant. respondsTo(" registerGeneratedResFolders" )) {
46- generateJunkCodeTask. ext. generatedResFolders = project
47- .files(resDir)
48- .builtBy(generateJunkCodeTask)
49- variant. registerGeneratedResFolders(generateJunkCodeTask. generatedResFolders)
50- if (variant. hasProperty(" mergeResourcesProvider" )) {
51- variant. mergeResourcesProvider. configure { dependsOn(generateJunkCodeTask) }
52- } else {
53- // noinspection GrDeprecatedAPIUsage
54- variant. mergeResources. dependsOn(generateJunkCodeTask)
55- }
56- } else {
57- // noinspection GrDeprecatedAPIUsage
58- variant. registerResGeneratingTask(generateJunkCodeTask, resDir)
59- }
60- variant. registerJavaGeneratingTask(generateJunkCodeTask, javaDir)
32+ def generateJunkCodeTaskName = " generate${ variantName.capitalize()} JunkCode"
33+ def generateJunkCodeTask = project. tasks. findByName(generateJunkCodeTaskName)
34+ if (generateJunkCodeTask) {
35+ // 已经用variantConfig方式配置过了
36+ return
37+ }
38+ def closure = generateJunkCodeExt. configMap[variantName]
39+ if (closure) {
40+ def junkCodeConfig = new JunkCodeConfig ()
41+ closure. delegate = junkCodeConfig
42+ closure. resolveStrategy = Closure . DELEGATE_FIRST
43+ closure. call()
44+ println (" AndroidJunkCode: configMap配置方式已过时,请使用variantConfig配置方式" )
45+ createGenerateJunkCodeTask(project, android, variant, junkCodeConfig)
6146 }
6247 }
6348 }
6449 }
6550
66-
67- /**
68- * 从AndroidManifest.xml找到package name
69- * @param variant
70- * @return
71- */
72- static String findPackageName (ApplicationVariant variant ) {
73- String packageName = null
74- for (int i = 0 ; i < variant. sourceSets. size(); i++ ) {
51+ private def createGenerateJunkCodeTask = { project , android , variant , junkCodeConfig ->
52+ def variantName = variant. name
53+ def generateJunkCodeTaskName = " generate${ variantName.capitalize()} JunkCode"
54+ def dir = new File (project. buildDir, " generated/source/junk/$variantName " )
55+ def resDir = new File (dir, " res" )
56+ def javaDir = new File (dir, " java" )
57+ def manifestFile = new File (dir, " AndroidManifest.xml" )
58+ // 从main/AndroidManifest.xml找到package name
59+ def mainManifestFile = android. sourceSets. findByName(" main" ). manifest. srcFile
60+ def parser = new XmlParser ()
61+ def node = parser. parse(mainManifestFile)
62+ def packageName = node. attribute(" package" )
63+ def generateJunkCodeTask = project. task(generateJunkCodeTaskName, type : AndroidJunkCodeTask ) {
64+ config = junkCodeConfig
65+ manifestPackageName = packageName
66+ outDir = dir
67+ }
68+ // 将自动生成的AndroidManifest.xml加入到一个未被占用的manifest位置(如果都占用了就不合并了,通常较少出现全被占用情况)
69+ for (int i = variant. sourceSets. size() - 1 ; i >= 0 ; i-- ) {
7570 def sourceSet = variant. sourceSets[i]
76- if (sourceSet. manifestFile. exists()) {
77- def parser = new XmlParser ()
78- Node node = parser. parse(sourceSet. manifestFile)
79- packageName = node. attribute(" package" )
80- if (packageName != null ) {
81- break
71+ if (! sourceSet. manifestFile. exists()) {
72+ android. sourceSets. " ${ sourceSet.name} " . manifest. srcFile(manifestFile. absolutePath)
73+ def processMainManifestTask = project. tasks. findByName(" process${ variantName.capitalize()} MainManifest" )
74+ if (processMainManifestTask) {
75+ processMainManifestTask. dependsOn(generateJunkCodeTask)
8276 }
77+ break
78+ }
79+ }
80+ if (variant. respondsTo(" registerGeneratedResFolders" )) {
81+ generateJunkCodeTask. ext. generatedResFolders = project
82+ .files(resDir)
83+ .builtBy(generateJunkCodeTask)
84+ variant. registerGeneratedResFolders(generateJunkCodeTask. generatedResFolders)
85+ if (variant. hasProperty(" mergeResourcesProvider" )) {
86+ variant. mergeResourcesProvider. configure { dependsOn(generateJunkCodeTask) }
87+ } else {
88+ // noinspection GrDeprecatedAPIUsage
89+ variant. mergeResources. dependsOn(generateJunkCodeTask)
8390 }
91+ } else {
92+ // noinspection GrDeprecatedAPIUsage
93+ variant. registerResGeneratingTask(generateJunkCodeTask, resDir)
8494 }
85- return packageName
95+ variant . registerJavaGeneratingTask(generateJunkCodeTask, javaDir)
8696 }
8797}
0 commit comments