Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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的兼容层
Expand All @@ -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<String>
fun getMinSdkVersion(pluginVariant: ApplicationVariant): Int
fun hasDeprecatedTransformApi(): Boolean
Expand Down
Original file line number Diff line number Diff line change
@@ -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 {

Expand All @@ -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<InternalArtifactType<Directory>>
}

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<String> =
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -221,10 +221,7 @@ class ShadowPlugin : Plugin<Project> {

// 找出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(
Expand Down
2 changes: 2 additions & 0 deletions projects/test/gradle-plugin-agp-compat-test/test_JDK17.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Loading