18
18
19
19
package com.tencent.shadow.core.gradle
20
20
21
+ import com.android.SdkConstants.ANDROID_MANIFEST_XML
21
22
import com.android.build.gradle.AppExtension
22
23
import com.android.build.gradle.AppPlugin
23
24
import com.android.build.gradle.BaseExtension
25
+ import com.android.build.gradle.tasks.ManifestProcessorTask
26
+ import com.android.build.gradle.tasks.ProcessApplicationManifest
24
27
import com.android.build.gradle.tasks.ProcessMultiApkApplicationManifest
25
28
import com.tencent.shadow.core.gradle.extensions.PackagePluginExtension
26
29
import com.tencent.shadow.core.manifest_parser.generatePluginManifest
@@ -99,7 +102,7 @@ class ShadowPlugin : Plugin<Project> {
99
102
}.forEach { pluginVariant ->
100
103
val output = pluginVariant.outputs.first()
101
104
val processManifestTask = output.processManifestProvider.get()
102
- val manifestFile = (processManifestTask as ProcessMultiApkApplicationManifest ).mainMergedManifest.get().asFile
105
+ val manifestFile = getManifestFile (processManifestTask)
103
106
val variantName = manifestFile.parentFile.name
104
107
val outputDir = File (project.buildDir, " generated/source/pluginManifest/$variantName " )
105
108
@@ -108,20 +111,22 @@ class ShadowPlugin : Plugin<Project> {
108
111
it.dependsOn(processManifestTask)
109
112
it.inputs.file(manifestFile)
110
113
it.outputs.dir(outputDir).withPropertyName(" outputDir" )
111
- val packageForR = (project.tasks.getByName(" processPluginDebugResources" ).property(" namespace" ) as Property <String >).get()
114
+
115
+ val packageForR = getPackageForR(project, variantName)
116
+
112
117
it.doLast {
113
- generatePluginManifest(manifestFile,
114
- outputDir,
115
- " com.tencent.shadow.core.manifest_parser" ,
116
- packageForR)
118
+ generatePluginManifest(
119
+ manifestFile,
120
+ outputDir,
121
+ " com.tencent.shadow.core.manifest_parser" ,
122
+ packageForR
123
+ )
117
124
}
118
125
}
119
126
project.tasks.getByName(" compile${variantName.capitalize()} JavaWithJavac" ).dependsOn(task)
120
127
121
128
// 把PluginManifest.java添加为源码
122
- appExtension.sourceSets.getByName(variantName).java {
123
- srcDir(outputDir)
124
- }
129
+ appExtension.sourceSets.getByName(variantName).java.srcDir(outputDir)
125
130
}
126
131
}
127
132
@@ -176,4 +181,40 @@ class ShadowPlugin : Plugin<Project> {
176
181
}
177
182
}
178
183
184
+ companion object {
185
+ private fun getManifestFile (processManifestTask : ManifestProcessorTask ) =
186
+ when (processManifestTask) {
187
+ is ProcessMultiApkApplicationManifest -> {
188
+ processManifestTask.mainMergedManifest.get().asFile
189
+ }
190
+ is ProcessApplicationManifest -> {
191
+ try {
192
+ processManifestTask.mergedManifest.get().asFile
193
+ } catch (e: NoSuchMethodError ) {
194
+ // AGP小于4.1.0
195
+ val dir =
196
+ processManifestTask.outputs.files.files
197
+ .first { it.path.contains(" merged_manifests" ) }
198
+ File (dir, ANDROID_MANIFEST_XML )
199
+ }
200
+ }
201
+ else -> throw IllegalStateException (" 不支持的Task类型:${processManifestTask.javaClass} " )
202
+ }
203
+
204
+ private fun getPackageForR (project : Project , variantName : String ): String {
205
+ val linkApplicationAndroidResourcesTask =
206
+ project.tasks.getByName(" process${variantName.capitalize()} Resources" )
207
+ return (when {
208
+
209
+ linkApplicationAndroidResourcesTask.hasProperty(" namespace" ) -> {
210
+ linkApplicationAndroidResourcesTask.property(" namespace" )
211
+ }
212
+ linkApplicationAndroidResourcesTask.hasProperty(" originalApplicationId" ) -> {
213
+ linkApplicationAndroidResourcesTask.property(" originalApplicationId" )
214
+ }
215
+ else -> throw IllegalStateException (" 不支持的AGP版本" )
216
+ } as Property <String >).get()
217
+ }
218
+ }
219
+
179
220
}
0 commit comments