Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

AGP 3.4.2适配 #757

Closed
gb18030 opened this issue Jan 6, 2022 · 1 comment · Fixed by #765
Closed

AGP 3.4.2适配 #757

gb18030 opened this issue Jan 6, 2022 · 1 comment · Fixed by #765

Comments

@gb18030
Copy link

gb18030 commented Jan 6, 2022

做如下修改:
`private fun addFlavorForTransform(baseExtension: BaseExtension) {

    if(baseExtension.flavorDimensionList == null){//AGP3.4.2的这里为空
        baseExtension.flavorDimensions(ShadowTransform.DimensionName)
    }else{
        baseExtension.flavorDimensionList.add(ShadowTransform.DimensionName)
    }
   
    try {
        baseExtension.productFlavors.create(ShadowTransform.NoShadowTransformFlavorName) {
            it.dimension = ShadowTransform.DimensionName
            if(isFlavorHasDefaultParam()) it.isDefault = true//AGP3.4.2 没这个属性
            
        }
        baseExtension.productFlavors.create(ShadowTransform.ApplyShadowTransformFlavorName) {
            it.dimension = ShadowTransform.DimensionName
            if(isFlavorHasDefaultParam()) it.isDefault = false
            
        }
    } catch (e: InvalidUserDataException) {
        throw Error("请在android{} DSL之前apply plugin: 'com.tencent.shadow.plugin'", e)
    }
}

fun isFlavorHasDefaultParam() : Boolean{

    val declaredFunctions = ProductFlavor::class.declaredFunctions
    for (declaredFunction in declaredFunctions) {
        if(declaredFunction.name == "setDefault") return true
    }
    return false;
}

`

`companion object {

    private fun getManifestFile(processManifestTask: ManifestProcessorTask) =
        when (processManifestTask) {
            is ProcessMultiApkApplicationManifest -> {
                processManifestTask.mainMergedManifest.get().asFile
            }
            is ProcessApplicationManifest -> {
                try {
                    processManifestTask.mergedManifest.get().asFile
                } catch (e: NoSuchMethodError) {
                    //AGP小于4.1.0
                    val dir =
                        processManifestTask.outputs.files.files
                            .first { it.path.contains("[/\\\\]merged_manifests".toRegex())}//3.4.2AGP有intent_merged_manifests文件夹 但里面没清单文件
                    File(dir, ANDROID_MANIFEST_XML)
                }
            }
            else -> throw IllegalStateException("不支持的Task类型:${processManifestTask.javaClass}")
        }

    private fun getPackageForR(project: Project, variantName: String): String {
        val linkApplicationAndroidResourcesTask =
            project.tasks.getByName("process${variantName.capitalize()}Resources")
        val property = when {

            linkApplicationAndroidResourcesTask.hasProperty("namespace") -> {
                linkApplicationAndroidResourcesTask.property("namespace")
            }
            linkApplicationAndroidResourcesTask.hasProperty("originalApplicationId") -> {
                linkApplicationAndroidResourcesTask.property("originalApplicationId")
            }
            else -> throw IllegalStateException("不支持的AGP版本")
        }
        
        return when (property) {
            is String -> { //AGP3.4.2 这个值类型是String
                property
            }
            is Property<*> -> {
                (property as Property<String>).get()
            }
            else -> throw IllegalStateException("不支持的AGP版本")
        }
    }
}

`
望验证后做好兼容

@shifujun
Copy link
Collaborator

shifujun commented Jan 6, 2022

感谢反馈。可能需要做一点重构再兼容比较好了。这些不同版本的逻辑写在同一个文件里,未来维护成本太高了。

虽然不能无限制兼容低版本,但如果确实可行,可以尽量兼容。

shifujun added a commit to shifujun/Shadow that referenced this issue Jan 10, 2022
主要以黑盒自动化测试驱动本次代码修复。详见:
projects/test/gradle-plugin-agp-compat-test/README.md

AGPCompatImpl更理想的方式是按AGP版本拆分成多个文件,
但考虑到AGP版本号获取的是一个字符串,而且业务有可能使用一些beta等版本的AGP,
版本号匹配风险比较大。所以目前实现方式是try-catch的方式。

移除pom中对com.android.tools.build依赖的声明。
这个声明会把AGP依赖带入构建项目中,可能会导致项目声明的AGP版本不生效。

fix Tencent#757
shifujun added a commit to shifujun/Shadow that referenced this issue Jan 10, 2022
主要以黑盒自动化测试驱动本次代码修复。详见:
projects/test/gradle-plugin-agp-compat-test/README.md

AGPCompatImpl更理想的方式是按AGP版本拆分成多个文件,
但考虑到AGP版本号获取的是一个字符串,而且业务有可能使用一些beta等版本的AGP,
版本号匹配风险比较大。所以目前实现方式是try-catch的方式。

移除pom中对com.android.tools.build依赖的声明。
这个声明会把AGP依赖带入构建项目中,可能会导致项目声明的AGP版本不生效。

fix Tencent#757
shifujun added a commit to shifujun/Shadow that referenced this issue Jan 10, 2022
主要以黑盒自动化测试驱动本次代码修复。详见:
projects/test/gradle-plugin-agp-compat-test/README.md

AGPCompatImpl更理想的方式是按AGP版本拆分成多个文件,
但考虑到AGP版本号获取的是一个字符串,而且业务有可能使用一些beta等版本的AGP,
版本号匹配风险比较大。所以目前实现方式是try-catch的方式。

移除pom中对com.android.tools.build依赖的声明。
这个声明会把AGP依赖带入构建项目中,可能会导致项目声明的AGP版本不生效。

fix Tencent#757
shifujun added a commit to shifujun/Shadow that referenced this issue Jan 11, 2022
主要以黑盒自动化测试驱动本次代码修复。详见:
projects/test/gradle-plugin-agp-compat-test/README.md

AGPCompatImpl更理想的方式是按AGP版本拆分成多个文件,
但考虑到AGP版本号获取的是一个字符串,而且业务有可能使用一些beta等版本的AGP,
版本号匹配风险比较大。所以目前实现方式是try-catch的方式。

移除pom中对com.android.tools.build依赖的声明。
这个声明会把AGP依赖带入构建项目中,可能会导致项目声明的AGP版本不生效。

fix Tencent#757
shifujun added a commit that referenced this issue Jan 11, 2022
主要以黑盒自动化测试驱动本次代码修复。详见:
projects/test/gradle-plugin-agp-compat-test/README.md

AGPCompatImpl更理想的方式是按AGP版本拆分成多个文件,
但考虑到AGP版本号获取的是一个字符串,而且业务有可能使用一些beta等版本的AGP,
版本号匹配风险比较大。所以目前实现方式是try-catch的方式。

移除pom中对com.android.tools.build依赖的声明。
这个声明会把AGP依赖带入构建项目中,可能会导致项目声明的AGP版本不生效。

fix #757
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants