Skip to content

Commit

Permalink
Merge pull request #14 from bytedance/bugfix/agp-4.0.0-alpha07/gradle…
Browse files Browse the repository at this point in the history
…-6.1-milestone-2

release 0.1.2, Compatible with `AGP-4.0.0-alpha07`
  • Loading branch information
JingYeoh committed Jan 7, 2020
2 parents 0d5117d + cb185c8 commit cfc6ed6
Show file tree
Hide file tree
Showing 12 changed files with 215 additions and 23 deletions.
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ buildscript {
classpath deps.kotlin.plugin

if ("true".equalsIgnoreCase(System.getProperty("enableAabResGuardPlugin", "false"))) {
classpath "com.bytedance.android:aabresguard-plugin:${versions.aabresguard}"
classpath deps.aabresguard.plugin
}
}
}
Expand Down
10 changes: 8 additions & 2 deletions gradle/versions.gradle
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
def versions = [:]
versions.gradletools = "3.2.1"
versions.kotlin = "1.3.0"
//versions.gradletools = "4.0.0-alpha07"
//versions.kotlin = "1.3.61"
versions.java = "8"
//versions.aabresguard = "0.1.0-beta-7"
versions.aabresguard = "0.1.1"
versions.aabresguard = "0.1.2"
// android
versions.compileSdkVersion = 28
versions.minSdkVersion = 15
Expand Down Expand Up @@ -43,5 +44,10 @@ deps.plugin = plugin
// library
deps.appcompatV7 = "com.android.support:appcompat-v7:${versions.support}"
deps.bundletool = "com.android.tools.build:bundletool:${versions.bundletool}"
// aabresguard
def aabresguard = [:]
aabresguard.core = "$GROUP_ID:aabresguard-core:${versions["aabresguard"]}"
aabresguard.plugin = "$GROUP_ID:aabresguard-plugin:${versions["aabresguard"]}"
deps.aabresguard = aabresguard

ext.deps = deps
1 change: 1 addition & 0 deletions gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip
#distributionUrl=https\://services.gradle.org/distributions/gradle-6.1-milestone-2-all.zip
7 changes: 6 additions & 1 deletion plugin/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,12 @@ dependencies {
compileOnly deps.gradle.tools

implementation deps.kotlin.stdlib
api project(":core")
implementation deps.kotlin.plugin
compileOnly deps.aabresguard.core
api(deps.aabresguard.core) {
exclude group: "com.google.guava", module: "guava"
exclude group: "com.android.tools.build", module: "gradle"
}
}

configurations {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.bytedance.android.plugin

import com.android.build.gradle.AppPlugin
import com.android.build.gradle.internal.scope.VariantScope
import com.bytedance.android.plugin.extensions.AabResGuardExtension
import com.bytedance.android.plugin.internal.getVariantManager
import com.bytedance.android.plugin.tasks.AabResGuardTask
import org.gradle.api.GradleException
import org.gradle.api.Plugin
Expand All @@ -19,12 +19,8 @@ class AabResGuardPlugin : Plugin<Project> {
checkApplicationPlugin(project)
project.extensions.create("aabResGuard", AabResGuardExtension::class.java)
project.afterEvaluate {
project.plugins.withId("com.android.application") { appPlugin ->
if (appPlugin is AppPlugin) {
appPlugin.variantManager.variantScopes.forEach { scope ->
createAabResGuardTask(project, scope)
}
}
getVariantManager(project).variantScopes.forEach { scope ->
createAabResGuardTask(project, scope)
}
}
}
Expand All @@ -48,11 +44,17 @@ class AabResGuardPlugin : Plugin<Project> {
val bundlePackageTask: Task = project.tasks.getByName("package${variantName}Bundle")
bundleTask.dependsOn(aabResGuardTask)
aabResGuardTask.dependsOn(bundlePackageTask)
// AGP-4.0.0-alpha07: use FinalizeBundleTask to sign bundle file
// FinalizeBundleTask is executed after PackageBundleTask
val finalizeBundleTaskName = "sign${variantName}Bundle"
if (project.tasks.findByName(finalizeBundleTaskName) != null) {
aabResGuardTask.dependsOn(project.tasks.getByName(finalizeBundleTaskName))
}
}

private fun checkApplicationPlugin(project: Project) {
if (!project.plugins.hasPlugin("com.android.application")) {
throw GradleException("Android Application plugin required")
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.bytedance.android.plugin.internal

import com.android.build.gradle.internal.scope.VariantScope
import org.gradle.api.Project
import java.io.File
import java.nio.file.Path

/**
* Created by YangJing on 2020/01/07 .
* Email: yangjing.yeoh@bytedance.com
*/
internal fun getBundleFilePath(project: Project, variantScope: VariantScope): Path {
val agpVersion = getAGPVersion(project)
val flavor = variantScope.variantData.name
return if (agpVersion.startsWith("3.")) {
getBundleFileForAGP3(project, flavor).toPath()
} else {
getBundleFileForAGP4(project, flavor).toPath()
}
}

fun getBundleFileForAGP3(project: Project, flavor: String): File {
// AGP-3.2.1: package{}Bundle task is com.android.build.gradle.internal.tasks.BundleTask
// AGP-3.4.1: package{}Bundle task is com.android.build.gradle.internal.tasks.PackageBundleTask
val bundleTaskName = "package${flavor.capitalize()}Bundle"
val bundleTask = project.tasks.getByName(bundleTaskName)
return File(bundleTask.property("bundleLocation") as File, bundleTask.property("fileName") as String)
}

fun getBundleFileForAGP4(project: Project, flavor: String): File {
// AGP-4.0.0-alpha07: use FinalizeBundleTask to sign bundle file
val finalizeBundleTask = project.tasks.getByName("sign${flavor.capitalize()}Bundle")
// FinalizeBundleTask.finalBundleFile is the final bundle path
val bundleFile = finalizeBundleTask.property("finalBundleFile")
val regularFile = bundleFile!!::class.java.getMethod("get").invoke(bundleFile)
return regularFile::class.java.getMethod("getAsFile").invoke(regularFile) as File
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package com.bytedance.android.plugin.internal

import com.android.build.gradle.internal.VariantManager
import org.gradle.api.GradleException
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.initialization.dsl.ScriptHandler
import org.gradle.internal.component.external.model.DefaultModuleComponentIdentifier

/**
* Created by YangJing on 2020/01/07 .
* Email: yangjing.yeoh@bytedance.com
*/
internal fun getVariantManager(project: Project): VariantManager {
val appPlugin: Plugin<Any>? = when {
// AGP-4.0.0-alpha07: move all methods to com.android.internal.application
project.plugins.hasPlugin("com.android.internal.application") -> {
project.plugins.getPlugin("com.android.internal.application")
}
project.plugins.hasPlugin("com.android.application") -> {
project.plugins.getPlugin("com.android.application")
}
else -> {
throw GradleException("Unexpected AppPlugin")
}
}
return getVariantManagerFromAppPlugin(appPlugin)
?: throw GradleException("get VariantManager failed")
}

private fun getVariantManagerFromAppPlugin(appPlugin: Any?): VariantManager? {
return if (appPlugin == null) return null else try {
for (method in appPlugin::class.java.methods) {
if (method.name == "getVariantManager") {
return method.invoke(appPlugin) as VariantManager?
}
}
for (method in appPlugin::class.java.declaredMethods) {
if (method.name == "getVariantManager") {
return method.invoke(appPlugin) as VariantManager?
}
}
return null
} catch (e: Exception) {
null
}
}

internal fun getAGPVersion(project: Project): String {
var agpVersion: String? = null
for (artifact in project.rootProject.buildscript.configurations.getByName(ScriptHandler.CLASSPATH_CONFIGURATION)
.resolvedConfiguration.resolvedArtifacts) {
val identifier = artifact.id.componentIdentifier
if (identifier is DefaultModuleComponentIdentifier) {
if (identifier.group == "com.android.tools.build") {
if (identifier.module == "gradle") {
agpVersion = identifier.version
}
}
}
}
if (agpVersion == null) {
throw GradleException("get AGP version failed")
}
return agpVersion
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package com.bytedance.android.plugin.internal

import com.android.build.gradle.internal.scope.VariantScope
import com.bytedance.android.plugin.model.SigningConfig
import org.gradle.api.GradleException
import org.gradle.api.Project
import java.io.File

/**
* Created by YangJing on 2020/01/06 .
* Email: yangjing.yeoh@bytedance.com
*/
internal fun getSigningConfig(project: Project, variantScope: VariantScope): SigningConfig {
val agpVersion = getAGPVersion(project)
return if (agpVersion.startsWith("3.")) {
getSigningConfigForAGP3(project, variantScope)
} else {
getSigningConfigForAGP4(project, variantScope)
}
}

private fun getSigningConfigForAGP4(project: Project, variantScope: VariantScope): SigningConfig {
val variantManager = getVariantManager(project)
val buildTypes = variantManager::class.java.getMethod("getBuildTypes").invoke(variantManager) as Map<*, *>
val flavor = variantScope.variantData.name
val buildTypeData = buildTypes[variantScope.variantData.name]
?: throw GradleException("get buildType failed for $flavor")
val buildType = buildTypeData::class.java.getMethod("getBuildType").invoke(buildTypeData)
val signingConfig = buildType::class.java.getMethod("getSigningConfig").invoke(buildType)
return invokeSigningConfig(signingConfig)
}

private fun getSigningConfigForAGP3(project: Project, variantScope: VariantScope): SigningConfig {
val variantData = variantScope.variantData
val variantConfiguration = variantData::class.java.getMethod("getVariantConfiguration").invoke(variantData)
val signingConfig = variantConfiguration::class.java.getMethod("getSigningConfig").invoke(variantConfiguration)
return invokeSigningConfig(signingConfig)
}

private fun invokeSigningConfig(any: Any): SigningConfig {
val storeFile: File = any::class.java.getMethod("getStoreFile").invoke(any) as File
val keyAlias: String = any::class.java.getMethod("getKeyAlias").invoke(any) as String
val keyPassword: String = any::class.java.getMethod("getKeyPassword").invoke(any) as String
val storePassword: String = any::class.java.getMethod("getStorePassword").invoke(any) as String
return SigningConfig(
storeFile, storePassword, keyAlias, keyPassword
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.bytedance.android.plugin.model

import java.io.File

/**
* Created by YangJing on 2020/01/07 .
* Email: yangjing.yeoh@bytedance.com
*/
data class SigningConfig(
val storeFile: File?,
val storePassword: String?,
val keyAlias: String?,
val keyPassword: String?
)
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package com.bytedance.android.plugin.tasks

import com.android.build.gradle.internal.dsl.CoreSigningConfig
import com.android.build.gradle.internal.scope.VariantScope
import com.bytedance.android.aabresguard.commands.ObfuscateBundleCommand
import com.bytedance.android.plugin.extensions.AabResGuardExtension
import com.bytedance.android.plugin.internal.getBundleFilePath
import com.bytedance.android.plugin.internal.getSigningConfig
import com.bytedance.android.plugin.model.SigningConfig
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction
import java.io.File
Expand All @@ -16,7 +18,7 @@ import java.nio.file.Path
open class AabResGuardTask : DefaultTask() {

private lateinit var variantScope: VariantScope
lateinit var signingConfig: CoreSigningConfig
lateinit var signingConfig: SigningConfig
var aabResGuard: AabResGuardExtension = project.extensions.getByName("aabResGuard") as AabResGuardExtension
private lateinit var bundlePath: Path
private lateinit var obfuscatedBundlePath: Path
Expand All @@ -29,9 +31,9 @@ open class AabResGuardTask : DefaultTask() {

fun setVariantScope(variantScope: VariantScope) {
this.variantScope = variantScope
val bundlePackageTask = project.tasks.getByName("package${variantScope.variantData.name.capitalize()}Bundle")
bundlePath = File(bundlePackageTask.property("bundleLocation") as File, bundlePackageTask.property("fileName") as String).toPath()
obfuscatedBundlePath = File(bundlePackageTask.property("bundleLocation") as File, aabResGuard.obfuscatedBundleFileName).toPath()
// init bundleFile, obfuscatedBundlePath must init before task action.
bundlePath = getBundleFilePath(project, variantScope)
obfuscatedBundlePath = File(bundlePath.toFile().parentFile, aabResGuard.obfuscatedBundleFileName).toPath()
}

fun getObfuscatedBundlePath(): Path {
Expand All @@ -41,8 +43,10 @@ open class AabResGuardTask : DefaultTask() {
@TaskAction
private fun execute() {
println(aabResGuard.toString())
signingConfig = variantScope.variantData.variantConfiguration.signingConfig
// init signing config
signingConfig = getSigningConfig(project, variantScope)
printSignConfiguration()

prepareUnusedFile()

val command = ObfuscateBundleCommand.builder()
Expand All @@ -57,8 +61,8 @@ open class AabResGuardTask : DefaultTask() {
.setUnusedStrPath(aabResGuard.unusedStringPath)
.setLanguageWhiteList(aabResGuard.languageWhiteList)

if (signingConfig.storeFile.exists()) {
command.setStoreFile(signingConfig.storeFile.toPath())
if (signingConfig.storeFile != null && signingConfig.storeFile!!.exists()) {
command.setStoreFile(signingConfig.storeFile!!.toPath())
.setKeyAlias(signingConfig.keyAlias)
.setKeyPassword(signingConfig.keyPassword)
.setStorePassword(signingConfig.storePassword)
Expand Down Expand Up @@ -94,7 +98,8 @@ open class AabResGuardTask : DefaultTask() {
println("-------------- sign configuration --------------")
}

private fun encrypt(value: String): String {
private fun encrypt(value: String?): String {
if (value == null) return "/"
if (value.length > 2) {
return "${value.substring(0, value.length / 2)}****"
}
Expand Down
6 changes: 5 additions & 1 deletion wiki/en/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,12 @@

# Change log

## 0.1.2(2020/1/7)
- Compatible with `AGP-4.0.0-alpha07`
- Fix issue [#13](https://github.com/bytedance/AabResGuard/issues/13)

## 0.1.1(2019/11/26)
- Compatible with Gradle high version.
- Compatible with `AGP-3.4.1.`
- Fix issue [#4](https://github.com/bytedance/AabResGuard/issues/4)

## 0.1.0(2019/10/16)
Expand Down
6 changes: 5 additions & 1 deletion wiki/zh-cn/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,12 @@

# 版本日志

## 0.1.2(2020/1/7)
- 适配 `AGP-4.0.0-alpha07`
- Fix issue [#13](https://github.com/bytedance/AabResGuard/issues/13)

## 0.1.1(2019/11/26)
- 适配 Gradle 高版本.
- 适配 `AGP-3.4.1`
- Fix issue [#4](https://github.com/bytedance/AabResGuard/issues/4)

## 0.1.0(2019/10/16)
Expand Down

0 comments on commit cfc6ed6

Please sign in to comment.