11package com.tencent.shadow.core.gradle
22
3+ import com.android.SdkConstants
34import com.android.build.gradle.BaseExtension
45import com.android.build.gradle.api.ApplicationVariant
56import com.android.build.gradle.api.BaseVariantOutput
67import com.android.build.gradle.internal.dsl.ProductFlavor
78import com.android.build.gradle.internal.res.LinkApplicationAndroidResourcesTask
9+ import com.android.build.gradle.internal.scope.InternalArtifactType
810import com.android.sdklib.AndroidVersion.VersionCodes
911import org.gradle.api.Task
12+ import org.gradle.api.file.Directory
13+ import org.gradle.api.file.DirectoryProperty
1014import org.gradle.api.provider.Property
15+ import java.io.File
16+ import kotlin.reflect.full.declaredMemberProperties
17+ import kotlin.reflect.jvm.isAccessible
1118
1219internal 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 {
0 commit comments