Skip to content

Commit 90979d0

Browse files
authored
Merge pull request #109 from bytedance/yangzhiqian/master
Upgrade asm libs from 6.2.1 to 9.2;Replace booster-gradle-api with gradle-compat-api;Check unexpected bytecode modifications;Fix memory leak caused by gradle;New whiteList feature in access-inline-plugin
2 parents acd9827 + 16fd1d1 commit 90979d0

File tree

42 files changed

+313
-430
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+313
-430
lines changed

CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,13 @@
11
# Change Log
2+
### Version 0.3.0
3+
- Upgrade asm libs from 6.2.1 to 9.2(Notes:ASM_API which is passed to asm visitors has not been changed,ASM6 by default.You could changed it by append 'bytex.ASM_API=\[ASM4、ASM5、ASM6、ASM7、ASM8、ASM9\]' in gradle.properties)
4+
- Replace booster-gradle-api with gradle-compat-api.Both of them are perfect AGP compatible libraries.
5+
`booster-gradle-api` is developed and maintained by [booster](https://github.com/didi/booster),which was used by ByteX for a long time .
6+
`gradle-compat-api` is developed and maintained by bytedance,witch has been running well within the company for several months.
7+
- Check unexpected bytecode modifications by plugins during the traverse phase in release build.(Notes:Plugins should only perceive the inputs in the traverse phase, and there should be no modifications)
8+
- Fix memory leak caused by gradle
9+
- New whiteList feature in access-inline-plugin.
10+
211
### Version 0.2.8
312
- Replace hookTransform with HookInjector;
413
- Add proguard mapping parser&retracer;

GradleToolKit/GradleEnvApi/src/main/java/com/ss/android/ugc/bytex/gradletoolkit/Artifact.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@
44
* Created by tanlehua on 2019-04-29.
55
*/
66
public enum Artifact {
7-
AAR, ALL_CLASSES/*project*/, APK, JAR, PROCESSED_JAR, CLASSES/*from jar classes*/, JAVAC, MERGED_ASSETS, MERGED_RES, MERGED_MANIFESTS, MERGED_MANIFESTS_WITH_FEATURES, PROCESSED_RES, SYMBOL_LIST, SYMBOL_LIST_WITH_PACKAGE_NAME,
7+
AAR, ALL_CLASSES/*project*/, APK, JAR, @Deprecated PROCESSED_JAR, CLASSES/*from jar classes*/, JAVAC, MERGED_ASSETS, MERGED_RES, MERGED_MANIFESTS, MERGED_MANIFESTS_WITH_FEATURES, PROCESSED_RES, SYMBOL_LIST, SYMBOL_LIST_WITH_PACKAGE_NAME,
88
RAW_RESOURCE_SETS, RAW_ASSET_SETS;
99
}

GradleToolKit/build.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,12 @@ dependencies {
1010
compileOnly "com.android.tools.build:gradle:$gradle_version"
1111
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
1212
compile project(':GradleEnvApi')
13+
compile("com.bytedance.android.build:gradle-compat-api:$gradle_compat_version")
14+
runtime("com.bytedance.android.build:gradle-compat-impl:$gradle_compat_version")
1315

1416
compile('com.google.auto.service:auto-service:1.0-rc4') {
1517
exclude module: 'guava'
1618
}
17-
implementation "com.didiglobal.booster:booster-android-gradle-api:3.1.0"
1819
}
1920
sourceCompatibility = "1.8"
2021
targetCompatibility = "1.8"
Lines changed: 4 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -1,81 +1,18 @@
11
package com.ss.android.ugc.bytex.gradletoolkit
22

3-
import com.android.build.api.artifact.ArtifactType
43
import com.android.build.gradle.api.BaseVariant
5-
import com.android.build.gradle.internal.api.BaseVariantImpl
64
import com.android.build.gradle.internal.publishing.AndroidArtifacts
75
import com.android.build.gradle.internal.scope.VariantScope
8-
import com.android.build.gradle.internal.variant.BaseVariantData
9-
import com.android.build.gradle.tasks.MergeResources
6+
import com.bytedance.gradle.compat.extension.compatVariant
107
import org.gradle.api.artifacts.ArtifactCollection
11-
import org.gradle.api.file.Directory
12-
import org.gradle.api.file.DirectoryProperty
138
import java.io.File
149

1510
val BaseVariant.scope: VariantScope
16-
get() = if (ANDROID_GRADLE_PLUGIN_VERSION.major < 4 || (ANDROID_GRADLE_PLUGIN_VERSION.major == 4 && ANDROID_GRADLE_PLUGIN_VERSION.minor == 0)) {
17-
this.scope40
18-
} else {
19-
this.scope41
20-
}
21-
private val BaseVariant.scope40: VariantScope
22-
get() = ReflectionUtils.callMethod<BaseVariantData>(this, javaClass, "getVariantData", arrayOf(), arrayOf()).scope
23-
24-
private val BaseVariant.scope41: VariantScope
25-
get() = ReflectionUtils.getField<Any>(this, BaseVariantImpl::class.java, "componentProperties").let {
26-
ReflectionUtils.callMethod<BaseVariantData>(it, it.javaClass, "getVariantScope", arrayOf(), arrayOf()) as VariantScope
27-
}
11+
get() = compatVariant.variantScope.originScope()
2812

2913
fun BaseVariant.getArtifactCollection(configType: AndroidArtifacts.ConsumedConfigType, artifactScope: AndroidArtifacts.ArtifactScope, artifactType: AndroidArtifacts.ArtifactType): ArtifactCollection {
30-
return if (ANDROID_GRADLE_PLUGIN_VERSION.major < 4 || (ANDROID_GRADLE_PLUGIN_VERSION.major == 4 && ANDROID_GRADLE_PLUGIN_VERSION.minor == 0)) {
31-
this.getArtifactCollection40(configType, artifactScope, artifactType)
32-
} else {
33-
this.getArtifactCollection41(configType, artifactScope, artifactType)
34-
}
35-
}
36-
37-
private fun BaseVariant.getArtifactCollection40(configType: AndroidArtifacts.ConsumedConfigType, artifactScope: AndroidArtifacts.ArtifactScope, artifactType: AndroidArtifacts.ArtifactType): ArtifactCollection {
38-
return scope.getArtifactCollection(configType, artifactScope, artifactType)
39-
}
40-
41-
private fun BaseVariant.getArtifactCollection41(configType: AndroidArtifacts.ConsumedConfigType, artifactScope: AndroidArtifacts.ArtifactScope, artifactType: AndroidArtifacts.ArtifactType): ArtifactCollection {
42-
return ReflectionUtils.getField<Any>(this, BaseVariantImpl::class.java, "componentProperties").let {
43-
ReflectionUtils.callPublicMethod<Any>(it, it.javaClass, "getVariantDependencies", arrayOf(), arrayOf()).let {
44-
ReflectionUtils.callPublicMethod<ArtifactCollection>(it, it.javaClass, "getArtifactCollection", arrayOf(
45-
AndroidArtifacts.ConsumedConfigType::class.java, AndroidArtifacts.ArtifactScope::class.java, AndroidArtifacts.ArtifactType::class.java
46-
), arrayOf(configType, artifactScope, artifactType))
47-
}
48-
}
49-
}
50-
51-
fun BaseVariant.getArtifactFiles(artifactType: ArtifactType): Collection<File> {
52-
return if (ANDROID_GRADLE_PLUGIN_VERSION.major > 3 || (ANDROID_GRADLE_PLUGIN_VERSION.major == 3 && ANDROID_GRADLE_PLUGIN_VERSION.minor >= 5)) {
53-
this.getArtifactFiles35_(artifactType)
54-
} else {
55-
this.getArtifactFiles30_(artifactType)
56-
}
57-
}
58-
59-
private fun BaseVariant.getArtifactFiles35_(artifactType: ArtifactType): Collection<File> {
60-
return scope.artifacts.getFinalProducts<Directory>(artifactType).orNull?.map { it.asFile }?.toSet()
61-
?: emptyList()
62-
}
63-
64-
private fun BaseVariant.getArtifactFiles30_(artifactType: ArtifactType): Collection<File> {
65-
return scope.artifacts.getArtifactFiles(artifactType).files
14+
return compatVariant.rawArtifacts.getArtifactCollection(configType, artifactScope, artifactType)
6615
}
6716

6817
val BaseVariant.blameLogOutputFolder: File
69-
get() = if (ANDROID_GRADLE_PLUGIN_VERSION.major < 4 || (ANDROID_GRADLE_PLUGIN_VERSION.major == 4 && ANDROID_GRADLE_PLUGIN_VERSION.minor == 0)) {
70-
this.blameLogOutputFolder40
71-
} else {
72-
this.blameLogOutputFolder41
73-
}
74-
private val BaseVariant.blameLogOutputFolder40: File
75-
get() = scope.resourceBlameLogDir
76-
77-
78-
private val BaseVariant.blameLogOutputFolder41: File
79-
get() = mergeResources.let {
80-
ReflectionUtils.callMethod<DirectoryProperty>(it, MergeResources::class.java, "getBlameLogOutputFolder", arrayOf(), arrayOf()).asFile.get()
81-
}
18+
get() = compatVariant.blameLogOutputFolder

GradleToolKit/src/main/kotlin/com/ss/android/ugc/bytex/gradletoolkit/BoosterBridge.kt

Lines changed: 0 additions & 35 deletions
This file was deleted.

GradleToolKit/src/main/kotlin/com/ss/android/ugc/bytex/gradletoolkit/MergeResources.kt

Lines changed: 0 additions & 66 deletions
This file was deleted.

GradleToolKit/src/main/kotlin/com/ss/android/ugc/bytex/gradletoolkit/MergeSourceSetFolders.kt

Lines changed: 0 additions & 29 deletions
This file was deleted.
Lines changed: 6 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,17 @@
11
package com.ss.android.ugc.bytex.gradletoolkit
22

3-
import com.android.build.gradle.internal.VariantManager
3+
4+
5+
46
import com.android.build.gradle.internal.scope.VariantScope
57
import com.android.builder.model.Version
68
import com.android.repository.Revision
9+
import com.bytedance.gradle.compat.AGP
10+
711
import org.gradle.api.Project
812

913
//todo:fix me
1014
val revision = Revision.parseRevision(Version.ANDROID_GRADLE_PLUGIN_VERSION)
1115
fun Project.findVariantScope(variantName: String): VariantScope? {
12-
return findVariantManager().findVariantScope(variantName)
13-
}
14-
15-
16-
fun Project.findVariantManager(): VariantManager {
17-
return if (revision.major > 3 || revision.minor >= 6) {
18-
findVariantManager36()
19-
} else {
20-
findVariantManager35()
21-
}
22-
}
23-
24-
private fun Project.findVariantManager35(): VariantManager {
25-
return project.plugins.findPlugin(com.android.build.gradle.AppPlugin::class.java)!!.variantManager
26-
}
27-
28-
private fun Project.findVariantManager36(): VariantManager {
29-
return project.plugins.findPlugin("com.android.internal.application")!!.let {
30-
it.javaClass.getMethod("getVariantManager").invoke(it) as VariantManager
31-
}
32-
}
33-
34-
fun VariantManager.findVariantScope(variantName: String): VariantScope? {
35-
return if (revision.major < 4) {
36-
findVariantScope3X(variantName)
37-
} else if (revision.minor == 0) {
38-
findVariantScope40(variantName)
39-
} else {
40-
findVariantScope41(variantName)
41-
}
42-
}
43-
44-
private fun VariantManager.findVariantScope3X(variantName: String): VariantScope? {
45-
return variantScopes.firstOrNull { it.fullVariantName == variantName }
46-
}
47-
48-
private fun VariantManager.findVariantScope40(variantName: String): VariantScope? {
49-
return variantScopes.firstOrNull { it::class.java.getMethod("getName").invoke(it) == variantName }
50-
}
51-
52-
53-
private fun VariantManager.findVariantScope41(variantName: String): VariantScope? {
54-
for (info in this.javaClass.getMethod("getMainComponents").invoke(this) as List<Any>) {
55-
val properties = info.javaClass.getMethod("getProperties").invoke(info)
56-
if (properties.javaClass.getMethod("getName").invoke(properties) == variantName) {
57-
return properties.javaClass.getMethod("getVariantScope").invoke(properties) as VariantScope
58-
}
59-
}
60-
return null
16+
return AGP.withAndroidPlugin(this).variantManager.variants.firstOrNull { it.name==variantName }?.originScope()
6117
}

GradleToolKit/src/main/kotlin/com/ss/android/ugc/bytex/gradletoolkit/Task.kt

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,20 @@
11
package com.ss.android.ugc.bytex.gradletoolkit
22

3-
import com.android.build.gradle.AppExtension
4-
import com.android.build.gradle.BaseExtension
5-
import com.android.build.gradle.LibraryExtension
3+
64
import com.android.build.gradle.api.BaseVariant
5+
import com.bytedance.gradle.compat.AGP
76
import org.gradle.api.Task
87

98
val Task.variant: BaseVariant?
109
get() = this.let {
11-
val android = project.extensions.findByName("android") as? BaseExtension ?: return@let null
12-
val allVariant = if (android is AppExtension) {
13-
android.applicationVariants.map { it as BaseVariant }
14-
} else if (android is LibraryExtension) {
15-
android.libraryVariants.map { it as BaseVariant }
16-
} else {
17-
return@let null
18-
}
10+
if(!AGP.isAndroidModule(project)) return@let null
11+
val android = AGP.withAndroidExtension(project)
12+
val allVariant = android.variants
1913
var matchedVariant: BaseVariant? = null
2014
for (variant in allVariant) {
2115
if (it.name.endsWith(variant.name.capitalize())) {
2216
if (matchedVariant == null || matchedVariant.name.length < variant.name.length) {
23-
matchedVariant = variant
17+
matchedVariant = variant.raw()
2418
}
2519
}
2620
}

0 commit comments

Comments
 (0)