提交 dca835f0 编写于 作者: S superq_sky

Supported com.android.tools.build:gradle:3.1.0.

上级 93d286eb
......@@ -62,7 +62,7 @@ uploadArchives {
}
dependencies {
compile 'com.android.support:support-annotations:22.2.0'
compile 'com.android.databinding:library:1.3.1'
compile 'com.android.databinding:baseLibrary:3.0.0'
api 'com.android.support:support-annotations:22.2.0'
api 'com.android.databinding:library:1.3.1'
api 'com.android.databinding:baseLibrary:3.0.0'
}
\ No newline at end of file
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "25.0.2"
compileSdkVersion VERSION_COMPILE_SDK
buildToolsVersion VERSION_BUILD_TOOLS
defaultConfig {
applicationId "com.didi.virtualapk.demo"
minSdkVersion 15
targetSdkVersion 15
minSdkVersion VERSION_MIN_SDK
targetSdkVersion VERSION_TARGET_SDK
versionName "1.0.0"
versionCode 1
}
compileOptions {
sourceCompatibility SOURCE_COMPATIBILITY
}
flavorDimensions "demo"
productFlavors {
......@@ -50,8 +53,8 @@ android {
dependencies {
// the following aars are also compiled in host project, so they will be filterd when build plugin apk.
// but, wo can still visit their Class and Resources.
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.didi.virtualapk:core:0.9.6-dev'
implementation 'com.android.support:appcompat-v7:23.4.0'
implementation 'com.didi.virtualapk:core:0.9.6'
}
apply plugin: 'com.didi.virtualapk.plugin'
......
......@@ -10,6 +10,16 @@ buildscript {
}
}
ext {
VERSION_COMPILE_SDK = 27
VERSION_BUILD_TOOLS = '26.0.2'
VERSION_MIN_SDK = 15
VERSION_TARGET_SDK = 25
SOURCE_COMPATIBILITY = JavaVersion.VERSION_1_7
}
allprojects {
repositories {
google()
......
......@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip
......@@ -45,11 +45,11 @@ android {
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
implementation fileTree(dir: 'libs', include: ['*.jar'])
testImplementation 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.didi.virtualapk:core:0.9.6-dev'
// compile project (':CoreLibrary')
implementation 'com.android.support:appcompat-v7:23.4.0'
implementation 'com.didi.virtualapk:core:0.9.6'
// implementation project (':CoreLibrary')
}
\ No newline at end of file
......@@ -16,7 +16,7 @@ buildscript {
ext {
VERSION_COMPILE_SDK = 27
VERSION_BUILD_TOOLS = '25.0.2'
VERSION_BUILD_TOOLS = '26.0.2'
VERSION_MIN_SDK = 15
VERSION_TARGET_SDK = 25
......
......@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip
......@@ -2,11 +2,10 @@ package com.didi.virtualapk
import com.android.build.gradle.AppExtension
import com.android.build.gradle.AppPlugin
import com.android.build.gradle.internal.TaskContainerAdaptor
import com.android.build.gradle.internal.TaskFactory
import com.android.build.gradle.internal.TaskManager
import com.android.build.gradle.internal.api.ApplicationVariantImpl
import com.android.build.gradle.internal.variant.VariantFactory
import com.android.builder.core.VariantConfiguration
import com.android.builder.core.VariantType
import com.didi.virtualapk.tasks.AssemblePlugin
import com.didi.virtualapk.utils.Log
......@@ -44,6 +43,14 @@ public abstract class BasePlugin implements Plugin<Project> {
@Override
public void apply(Project project) {
this.project = project
project.ext.set(Constants.GRADLE_3_1_0, false)
try {
Class.forName('com.android.builder.core.VariantConfiguration')
} catch (Throwable e) {
// com.android.tools.build:gradle:3.1.0
project.ext.set(Constants.GRADLE_3_1_0, true)
}
AppPlugin appPlugin = project.plugins.findPlugin(AppPlugin)
......@@ -69,7 +76,12 @@ public abstract class BasePlugin implements Plugin<Project> {
project.extensions.create('virtualApk', VAExtention)
taskFactory = new TaskContainerAdaptor(project.tasks)
if (project.extensions.extraProperties.get(Constants.GRADLE_3_1_0)) {
TaskManager taskManager = Reflect.on(appPlugin).field('taskManager').get()
taskFactory = taskManager.getTaskFactory()
} else {
taskFactory = Reflect.on('com.android.build.gradle.internal.TaskContainerAdaptor').create(project.tasks).get()
}
project.afterEvaluate {
if (!checkVariantFactoryInvoked) {
......@@ -84,12 +96,18 @@ public abstract class BasePlugin implements Plugin<Project> {
taskFactory.create(variantPluginTaskName, AssemblePlugin, configAction)
taskFactory.named("assemblePlugin", new Action<Task>() {
Action action = new Action<Task>() {
@Override
void execute(Task task) {
task.dependsOn(variantPluginTaskName)
}
})
}
if (project.extensions.extraProperties.get(Constants.GRADLE_3_1_0)) {
taskFactory.configure("assemblePlugin", action)
} else {
taskFactory.named("assemblePlugin", action)
}
}
}
}
......@@ -120,7 +138,12 @@ public abstract class BasePlugin implements Plugin<Project> {
}
appPlugin.variantManager.productFlavors.each {
String variantName = VariantConfiguration.computeFullName(it.key, buildType, VariantType.DEFAULT, null)
String variantName
if (project.extensions.extraProperties.get(Constants.GRADLE_3_1_0)) {
variantName = com.android.build.gradle.internal.core.VariantConfiguration.computeFullName(it.key, buildType, VariantType.DEFAULT, null)
} else {
variantName = com.android.builder.core.VariantConfiguration.computeFullName(it.key, buildType, VariantType.DEFAULT, null)
}
def variantPluginTaskName = createPluginTaskName("assemble${variantName.capitalize()}Plugin".toString())
pluginTasks.add(variantPluginTaskName)
}
......
package com.didi.virtualapk
public final class Constants {
public static final String GRADLE_3_1_0 = 'va.gradle.3.1.0'
}
\ No newline at end of file
......@@ -9,6 +9,7 @@ import com.android.build.gradle.internal.transforms.ProGuardTransform
import com.android.build.gradle.tasks.ProcessAndroidResources
import com.didi.virtualapk.utils.FileUtil
import com.didi.virtualapk.utils.Log
import com.google.common.collect.ImmutableMap
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.artifacts.component.ComponentIdentifier
......@@ -32,7 +33,15 @@ public class VAHostPlugin implements Plugin<Project> {
public void apply(Project project) {
this.project = project
project.ext.set(Constants.GRADLE_3_1_0, false)
try {
Class.forName('com.android.builder.core.VariantConfiguration')
} catch (Throwable e) {
// com.android.tools.build:gradle:3.1.0
project.ext.set(Constants.GRADLE_3_1_0, true)
}
//The target project must be a android application module
if (!project.plugins.hasPlugin('com.android.application')) {
Log.e(TAG, "application required!")
......@@ -86,8 +95,15 @@ public class VAHostPlugin implements Plugin<Project> {
FileUtil.saveFile(vaHostDir, "versions", {
List<String> deps = new ArrayList<String>()
Log.i TAG, "Used compileClasspath: ${applicationVariant.name}"
Set<ArtifactDependencyGraph.HashableResolvedArtifactResult> compileArtifacts = ArtifactDependencyGraph.getAllArtifacts(
applicationVariant.variantData.scope, AndroidArtifacts.ConsumedConfigType.COMPILE_CLASSPATH, null)
Set<ArtifactDependencyGraph.HashableResolvedArtifactResult> compileArtifacts
if (project.extensions.extraProperties.get(Constants.GRADLE_3_1_0)) {
ImmutableMap<String, String> buildMapping = com.android.build.gradle.internal.ide.ModelBuilder.computeBuildMapping(project.gradle)
compileArtifacts = ArtifactDependencyGraph.getAllArtifacts(
applicationVariant.variantData.scope, AndroidArtifacts.ConsumedConfigType.COMPILE_CLASSPATH, null, buildMapping)
} else {
compileArtifacts = ArtifactDependencyGraph.getAllArtifacts(
applicationVariant.variantData.scope, AndroidArtifacts.ConsumedConfigType.COMPILE_CLASSPATH, null)
}
compileArtifacts.each { ArtifactDependencyGraph.HashableResolvedArtifactResult artifact ->
ComponentIdentifier id = artifact.id.componentIdentifier
......
package com.didi.virtualapk
import com.android.build.gradle.AppPlugin
import com.android.build.gradle.internal.api.ApplicationVariantImpl
import com.android.build.gradle.options.BooleanOption
import com.android.build.gradle.options.ProjectOptions
import com.didi.virtualapk.hooker.*
import com.didi.virtualapk.transform.StripClassAndResTransform
import com.didi.virtualapk.utils.FileBinaryCategory
import com.didi.virtualapk.utils.Log
import com.didi.virtualapk.utils.Reflect
import org.gradle.api.InvalidUserDataException
import org.gradle.api.Project
import org.gradle.api.artifacts.Configuration
......@@ -220,6 +224,14 @@ class VAPlugin extends BasePlugin {
dst << hostMapping
}
}
AppPlugin appPlugin = project.plugins.findPlugin(AppPlugin)
ProjectOptions projectOptions = Reflect.on(appPlugin).field('projectOptions').get()
if (projectOptions.get(BooleanOption.ENABLE_DEX_ARCHIVE)) {
throw new InvalidUserDataException("Can't using incremental dexing mode, please add 'android.useDexArchive=false' in gradle.properties of :${project.name}.")
}
// project.ext.set('android.useDexArchive', false)
}
static class VATaskHookerManager extends TaskHookerManager {
......
......@@ -3,6 +3,7 @@ package com.didi.virtualapk.hooker
import com.android.build.gradle.api.ApkVariant
import com.android.build.gradle.internal.scope.TaskOutputHolder
import com.android.build.gradle.tasks.MergeManifests
import com.didi.virtualapk.Constants
import com.didi.virtualapk.collector.dependence.DependenceInfo
import com.didi.virtualapk.utils.Log
import com.didi.virtualapk.utils.Reflect
......@@ -57,8 +58,15 @@ class MergeManifestsHooker extends GradleTaskHooker<MergeManifests> {
*/
@Override
void afterTaskExecute(MergeManifests task) {
variantData.outputScope.getOutputs(TaskOutputHolder.TaskOutputType.MERGED_MANIFESTS).each {
rewrite(it.outputFile)
if (project.extensions.extraProperties.get(Constants.GRADLE_3_1_0)) {
File outputFile = com.android.build.gradle.internal.scope.ExistingBuildElements
.from(TaskOutputHolder.TaskOutputType.MERGED_MANIFESTS, scope.getOutput(TaskOutputHolder.TaskOutputType.MERGED_MANIFESTS))
.element(variantData.outputScope.mainSplit).outputFile
rewrite(outputFile)
} else {
variantData.outputScope.getOutputs(TaskOutputHolder.TaskOutputType.MERGED_MANIFESTS).each {
rewrite(it.outputFile)
}
}
}
......
......@@ -5,11 +5,13 @@ import com.android.build.gradle.internal.ide.ArtifactDependencyGraph
import com.android.build.gradle.internal.tasks.AppPreBuildTask
import com.android.builder.model.Dependencies
import com.android.builder.model.SyncIssue
import com.didi.virtualapk.Constants
import com.didi.virtualapk.collector.dependence.AarDependenceInfo
import com.didi.virtualapk.collector.dependence.DependenceInfo
import com.didi.virtualapk.collector.dependence.JarDependenceInfo
import com.didi.virtualapk.utils.FileUtil
import com.didi.virtualapk.utils.Log
import com.google.common.collect.ImmutableMap
import org.gradle.api.Project
import java.util.function.Consumer
......@@ -60,12 +62,19 @@ class PrepareDependenciesHooker extends GradleTaskHooker<AppPreBuildTask> {
*/
@Override
void afterTaskExecute(AppPreBuildTask task) {
Dependencies dependencies = new ArtifactDependencyGraph().createDependencies(scope, false, new Consumer<SyncIssue>() {
Consumer consumer = new Consumer<SyncIssue>() {
@Override
void accept(SyncIssue syncIssue) {
Log.i 'PrepareDependenciesHooker', "Error: ${syncIssue}"
}
})
}
Dependencies dependencies
if (project.extensions.extraProperties.get(Constants.GRADLE_3_1_0)) {
ImmutableMap<String, String> buildMapping = com.android.build.gradle.internal.ide.ModelBuilder.computeBuildMapping(project.gradle)
dependencies = new ArtifactDependencyGraph().createDependencies(scope, false, buildMapping, consumer)
} else {
dependencies = new ArtifactDependencyGraph().createDependencies(scope, false, consumer)
}
dependencies.libraries.each {
def mavenCoordinates = it.resolvedCoordinates
......
......@@ -6,6 +6,7 @@ import com.android.build.gradle.api.ApkVariant
import com.android.build.gradle.internal.scope.TaskOutputHolder
import com.android.build.gradle.tasks.ProcessAndroidResources
import com.android.sdklib.BuildToolInfo
import com.didi.virtualapk.Constants
import com.didi.virtualapk.aapt.Aapt
import com.didi.virtualapk.collector.ResourceCollector
import com.didi.virtualapk.collector.res.ResourceEntry
......@@ -57,8 +58,15 @@ class ProcessResourcesHooker extends GradleTaskHooker<ProcessAndroidResources> {
*/
@Override
void afterTaskExecute(ProcessAndroidResources par) {
variantData.outputScope.getOutputs(TaskOutputHolder.TaskOutputType.PROCESSED_RES).each {
repackage(par, it.outputFile)
if (project.extensions.extraProperties.get(Constants.GRADLE_3_1_0)) {
File outputFile = com.android.build.gradle.internal.scope.ExistingBuildElements
.from(TaskOutputHolder.TaskOutputType.PROCESSED_RES, scope.getOutput(TaskOutputHolder.TaskOutputType.PROCESSED_RES))
.element(variantData.outputScope.mainSplit).outputFile
repackage(par, outputFile)
} else {
variantData.outputScope.getOutputs(TaskOutputHolder.TaskOutputType.PROCESSED_RES).each {
repackage(par, it.outputFile)
}
}
}
......@@ -105,7 +113,7 @@ class ProcessResourcesHooker extends GradleTaskHooker<ProcessAndroidResources> {
def resIdMap = resourceCollector.resIdMap
def rSymbolFile = par.textSymbolOutputFile
def libRefTable = ["${virtualApk.packageId}": par.packageForR]
def libRefTable = ["${virtualApk.packageId}": par.applicationId]
def filteredResources = [] as HashSet<String>
def updatedResources = [] as HashSet<String>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册