Skip to content

Commit f9dc394

Browse files
4327b9fbshifujun
authored andcommitted
fix(core.gradle-plugin): 兼容AGP 8.9.0
1 parent 09e7e0a commit f9dc394

4 files changed

Lines changed: 64 additions & 4 deletions

File tree

projects/sdk/core/gradle-plugin/src/main/kotlin/com/tencent/shadow/core/gradle/AGPCompat.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import com.android.build.gradle.api.ApplicationVariant
2323
import com.android.build.gradle.api.BaseVariantOutput
2424
import com.android.build.gradle.internal.dsl.ProductFlavor
2525
import org.gradle.api.Task
26+
import java.io.File
2627

2728
/**
2829
* 不同版本AGP的兼容层
@@ -31,6 +32,7 @@ internal interface AGPCompat {
3132
fun addFlavorDimension(baseExtension: BaseExtension, dimensionName: String)
3233
fun setProductFlavorDefault(productFlavor: ProductFlavor, isDefault: Boolean)
3334
fun getProcessResourcesTask(output: BaseVariantOutput): Task
35+
fun getProcessResourcesFile(processResourcesTask: Task, variantName: String): File
3436
fun getAaptAdditionalParameters(processResourcesTask: Task): List<String>
3537
fun getMinSdkVersion(pluginVariant: ApplicationVariant): Int
3638
fun hasDeprecatedTransformApi(): Boolean

projects/sdk/core/gradle-plugin/src/main/kotlin/com/tencent/shadow/core/gradle/AGPCompatImpl.kt

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,20 @@
11
package com.tencent.shadow.core.gradle
22

3+
import com.android.SdkConstants
34
import com.android.build.gradle.BaseExtension
45
import com.android.build.gradle.api.ApplicationVariant
56
import com.android.build.gradle.api.BaseVariantOutput
67
import com.android.build.gradle.internal.dsl.ProductFlavor
78
import com.android.build.gradle.internal.res.LinkApplicationAndroidResourcesTask
9+
import com.android.build.gradle.internal.scope.InternalArtifactType
810
import com.android.sdklib.AndroidVersion.VersionCodes
911
import org.gradle.api.Task
12+
import org.gradle.api.file.Directory
13+
import org.gradle.api.file.DirectoryProperty
1014
import org.gradle.api.provider.Property
15+
import java.io.File
16+
import kotlin.reflect.full.declaredMemberProperties
17+
import kotlin.reflect.jvm.isAccessible
1118

1219
internal class AGPCompatImpl : AGPCompat {
1320

@@ -18,6 +25,58 @@ internal class AGPCompatImpl : AGPCompat {
1825
output.processResources
1926
}
2027

28+
override fun getProcessResourcesFile(processResourcesTask: Task, variantName: String): File {
29+
val capitalizeVariantName = variantName.capitalize()
30+
31+
return try {
32+
File(
33+
processResourcesTask.outputs.files.files.first { it.name.equals("out") },
34+
"resources-$variantName.ap_"
35+
)
36+
37+
// 使用 resPackageOutputFolder
38+
// 获取的路径和上方路径一致
39+
// 备选(不推荐)
40+
/*File(
41+
(processResourcesTask as LinkApplicationAndroidResourcesTask).resPackageOutputFolder.asFile.get(),
42+
"resources-$variantName.ap_"
43+
)*/
44+
} catch (ignored: Exception) {
45+
// 高版本 AGP
46+
try {
47+
// 通过反射获取 KProperty: linkedResourcesOutputDir、linkedResourcesArtifactType
48+
val linkedResourcesOutputDir =
49+
LinkApplicationAndroidResourcesTask::class.declaredMemberProperties.first {
50+
it.name == "linkedResourcesOutputDir"
51+
}.let {
52+
it.isAccessible = true
53+
it.getter.call(processResourcesTask) as DirectoryProperty
54+
}
55+
56+
@Suppress("UNCHECKED_CAST")
57+
val linkedResourcesArtifactType =
58+
LinkApplicationAndroidResourcesTask::class.declaredMemberProperties.first {
59+
it.name == "linkedResourcesArtifactType"
60+
}.let {
61+
it.isAccessible = true
62+
it.getter.call(processResourcesTask) as Property<InternalArtifactType<Directory>>
63+
}
64+
65+
File(
66+
linkedResourcesOutputDir.asFile.get(),
67+
linkedResourcesArtifactType.get().name().lowercase()
68+
.replace("_", "-") + "-" + variantName + SdkConstants.DOT_RES
69+
)
70+
} catch (ignored: Exception) {
71+
// 反射获取出错,备用
72+
File(
73+
processResourcesTask.outputs.files.files.first { it.name.equals("process${capitalizeVariantName}Resources") },
74+
"linked-resources-binary-format-$variantName.ap_"
75+
)
76+
}
77+
}
78+
}
79+
2180
@Suppress("PrivateApi")
2281
override fun getAaptAdditionalParameters(processResourcesTask: Task): List<String> =
2382
try {

projects/sdk/core/gradle-plugin/src/main/kotlin/com/tencent/shadow/core/gradle/ShadowPlugin.kt

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -221,10 +221,7 @@ class ShadowPlugin : Plugin<Project> {
221221

222222
// 找出ap_文件
223223
val processResourcesTask = agpCompat.getProcessResourcesTask(output)
224-
val processedResFile = File(
225-
processResourcesTask.outputs.files.files.first { it.name.equals("out") },
226-
"resources-$variantName.ap_"
227-
)
224+
val processedResFile = agpCompat.getProcessResourcesFile(processResourcesTask, variantName)
228225

229226
// decodeBinaryManifestTask输出的apkanalyzer manifest print结果文件
230227
val decodeXml = File(

projects/test/gradle-plugin-agp-compat-test/test_JDK17.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ source ./test_prepare.sh
1414
# AGP release页面:https://developer.android.com/studio/releases/gradle-plugin
1515
# AGP Maven仓库:https://mvnrepository.com/artifact/com.android.tools.build/gradle
1616
# Gradle下载:https://services.gradle.org/distributions/
17+
setGradleVersion 8.11.1
18+
testUnderAGPVersion 8.9.0
1719
setGradleVersion 8.6
1820
testUnderAGPVersion 8.4.0-rc02
1921
setGradleVersion 8.4

0 commit comments

Comments
 (0)