diff --git a/projects/sdk/core/gradle-plugin/src/main/kotlin/com/tencent/shadow/core/gradle/AGPCompat.kt b/projects/sdk/core/gradle-plugin/src/main/kotlin/com/tencent/shadow/core/gradle/AGPCompat.kt index 0088123a0..e527b5e58 100644 --- a/projects/sdk/core/gradle-plugin/src/main/kotlin/com/tencent/shadow/core/gradle/AGPCompat.kt +++ b/projects/sdk/core/gradle-plugin/src/main/kotlin/com/tencent/shadow/core/gradle/AGPCompat.kt @@ -23,6 +23,7 @@ import com.android.build.gradle.api.ApplicationVariant import com.android.build.gradle.api.BaseVariantOutput import com.android.build.gradle.internal.dsl.ProductFlavor import org.gradle.api.Task +import java.io.File /** * 不同版本AGP的兼容层 @@ -31,6 +32,7 @@ internal interface AGPCompat { fun addFlavorDimension(baseExtension: BaseExtension, dimensionName: String) fun setProductFlavorDefault(productFlavor: ProductFlavor, isDefault: Boolean) fun getProcessResourcesTask(output: BaseVariantOutput): Task + fun getProcessResourcesFile(processResourcesTask: Task, variantName: String): File fun getAaptAdditionalParameters(processResourcesTask: Task): List fun getMinSdkVersion(pluginVariant: ApplicationVariant): Int fun hasDeprecatedTransformApi(): Boolean diff --git a/projects/sdk/core/gradle-plugin/src/main/kotlin/com/tencent/shadow/core/gradle/AGPCompatImpl.kt b/projects/sdk/core/gradle-plugin/src/main/kotlin/com/tencent/shadow/core/gradle/AGPCompatImpl.kt index e9c6f0621..a12f8846c 100644 --- a/projects/sdk/core/gradle-plugin/src/main/kotlin/com/tencent/shadow/core/gradle/AGPCompatImpl.kt +++ b/projects/sdk/core/gradle-plugin/src/main/kotlin/com/tencent/shadow/core/gradle/AGPCompatImpl.kt @@ -1,13 +1,20 @@ package com.tencent.shadow.core.gradle +import com.android.SdkConstants import com.android.build.gradle.BaseExtension import com.android.build.gradle.api.ApplicationVariant import com.android.build.gradle.api.BaseVariantOutput import com.android.build.gradle.internal.dsl.ProductFlavor import com.android.build.gradle.internal.res.LinkApplicationAndroidResourcesTask +import com.android.build.gradle.internal.scope.InternalArtifactType import com.android.sdklib.AndroidVersion.VersionCodes import org.gradle.api.Task +import org.gradle.api.file.Directory +import org.gradle.api.file.DirectoryProperty import org.gradle.api.provider.Property +import java.io.File +import kotlin.reflect.full.declaredMemberProperties +import kotlin.reflect.jvm.isAccessible internal class AGPCompatImpl : AGPCompat { @@ -18,6 +25,58 @@ internal class AGPCompatImpl : AGPCompat { output.processResources } + override fun getProcessResourcesFile(processResourcesTask: Task, variantName: String): File { + val capitalizeVariantName = variantName.capitalize() + + return try { + File( + processResourcesTask.outputs.files.files.first { it.name.equals("out") }, + "resources-$variantName.ap_" + ) + + // 使用 resPackageOutputFolder + // 获取的路径和上方路径一致 + // 备选(不推荐) + /*File( + (processResourcesTask as LinkApplicationAndroidResourcesTask).resPackageOutputFolder.asFile.get(), + "resources-$variantName.ap_" + )*/ + } catch (ignored: Exception) { + // 高版本 AGP + try { + // 通过反射获取 KProperty: linkedResourcesOutputDir、linkedResourcesArtifactType + val linkedResourcesOutputDir = + LinkApplicationAndroidResourcesTask::class.declaredMemberProperties.first { + it.name == "linkedResourcesOutputDir" + }.let { + it.isAccessible = true + it.getter.call(processResourcesTask) as DirectoryProperty + } + + @Suppress("UNCHECKED_CAST") + val linkedResourcesArtifactType = + LinkApplicationAndroidResourcesTask::class.declaredMemberProperties.first { + it.name == "linkedResourcesArtifactType" + }.let { + it.isAccessible = true + it.getter.call(processResourcesTask) as Property> + } + + File( + linkedResourcesOutputDir.asFile.get(), + linkedResourcesArtifactType.get().name().lowercase() + .replace("_", "-") + "-" + variantName + SdkConstants.DOT_RES + ) + } catch (ignored: Exception) { + // 反射获取出错,备用 + File( + processResourcesTask.outputs.files.files.first { it.name.equals("process${capitalizeVariantName}Resources") }, + "linked-resources-binary-format-$variantName.ap_" + ) + } + } + } + @Suppress("PrivateApi") override fun getAaptAdditionalParameters(processResourcesTask: Task): List = try { diff --git a/projects/sdk/core/gradle-plugin/src/main/kotlin/com/tencent/shadow/core/gradle/ShadowPlugin.kt b/projects/sdk/core/gradle-plugin/src/main/kotlin/com/tencent/shadow/core/gradle/ShadowPlugin.kt index ff64fe2d5..1f54a2685 100644 --- a/projects/sdk/core/gradle-plugin/src/main/kotlin/com/tencent/shadow/core/gradle/ShadowPlugin.kt +++ b/projects/sdk/core/gradle-plugin/src/main/kotlin/com/tencent/shadow/core/gradle/ShadowPlugin.kt @@ -221,10 +221,7 @@ class ShadowPlugin : Plugin { // 找出ap_文件 val processResourcesTask = agpCompat.getProcessResourcesTask(output) - val processedResFile = File( - processResourcesTask.outputs.files.files.first { it.name.equals("out") }, - "resources-$variantName.ap_" - ) + val processedResFile = agpCompat.getProcessResourcesFile(processResourcesTask, variantName) // decodeBinaryManifestTask输出的apkanalyzer manifest print结果文件 val decodeXml = File( diff --git a/projects/test/gradle-plugin-agp-compat-test/test_JDK17.sh b/projects/test/gradle-plugin-agp-compat-test/test_JDK17.sh index 1fd39bb9d..82965c8b5 100755 --- a/projects/test/gradle-plugin-agp-compat-test/test_JDK17.sh +++ b/projects/test/gradle-plugin-agp-compat-test/test_JDK17.sh @@ -14,6 +14,8 @@ source ./test_prepare.sh # AGP release页面:https://developer.android.com/studio/releases/gradle-plugin # AGP Maven仓库:https://mvnrepository.com/artifact/com.android.tools.build/gradle # Gradle下载:https://services.gradle.org/distributions/ +setGradleVersion 8.11.1 +testUnderAGPVersion 8.9.0 setGradleVersion 8.6 testUnderAGPVersion 8.4.0-rc02 setGradleVersion 8.4