日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Gradle 工具的源码研究

發布時間:2023/12/19 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Gradle 工具的源码研究 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Gradle 工具源碼不是gradle wrapper 源碼

安裝android studio之后,Gradle 工具被緩存到 user/.gradle/cache/module-2/下面,不同的AS,緩存具體路徑還不一樣。


對于gradle-2.3.3.jar 源碼:


Context類代碼:

package com.android.build.api.transform;import java.io.File; import org.gradle.api.logging.LoggingManager;public abstract interface Context {public abstract LoggingManager getLogging();public abstract File getTemporaryDir();public abstract String getPath(); }

QualifiedContent代碼:

package com.android.build.api.transform;import java.io.File; import java.util.Set;public abstract interface QualifiedContent {public abstract String getName();public abstract File getFile();public abstract Set<ContentType> getContentTypes();public abstract Set<? super Scope> getScopes();public static abstract interface ContentType{public abstract String name();public abstract int getValue();}public static enum DefaultContentTypeimplements QualifiedContent.ContentType{CLASSES(1), RESOURCES(2);private final int value;private DefaultContentType(int value){this.value = value;}public int getValue(){return this.value;}}public static abstract interface ScopeType{public abstract String name();public abstract int getValue();}public static enum Scopeimplements QualifiedContent.ScopeType{PROJECT(1), PROJECT_LOCAL_DEPS(2), SUB_PROJECTS(4), SUB_PROJECTS_LOCAL_DEPS(8), EXTERNAL_LIBRARIES(16), TESTED_CODE(32), PROVIDED_ONLY(64);private final int value;private Scope(int value){this.value = value;}public int getValue(){return this.value;}} }

JarInput代碼:

package com.android.build.api.transform;public abstract interface JarInputextends QualifiedContent {public abstract Status getStatus(); }

Transform類:

package com.android.build.api.transform;import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import java.io.File; import java.io.IOException; import java.util.Collection; import java.util.Map; import java.util.Set;public abstract class Transform {public abstract String getName();public abstract Set<QualifiedContent.ContentType> getInputTypes();public Set<QualifiedContent.ContentType> getOutputTypes(){return getInputTypes();}public abstract Set<? super QualifiedContent.Scope> getScopes();public Set<? super QualifiedContent.Scope> getReferencedScopes(){return ImmutableSet.of();}@Deprecatedpublic Collection<File> getSecondaryFileInputs(){return ImmutableList.of();}public Collection<SecondaryFile> getSecondaryFiles(){return ImmutableList.of();}public Collection<File> getSecondaryFileOutputs(){return ImmutableList.of();}public Collection<File> getSecondaryDirectoryOutputs(){return ImmutableList.of();}public Map<String, Object> getParameterInputs(){return ImmutableMap.of();}public abstract boolean isIncremental();@Deprecatedpublic void transform(Context context, Collection<TransformInput> inputs, Collection<TransformInput> referencedInputs, TransformOutputProvider outputProvider, boolean isIncremental)throws IOException, TransformException, InterruptedException{}public void transform(TransformInvocation transformInvocation)throws TransformException, InterruptedException, IOException{transform(transformInvocation.getContext(), transformInvocation.getInputs(), transformInvocation.getReferencedInputs(), transformInvocation.getOutputProvider(), transformInvocation.isIncremental());} }

TransformInput類代碼:

package com.android.build.api.transform;import java.util.Collection;public abstract interface TransformInput {public abstract Collection<JarInput> getJarInputs();public abstract Collection<DirectoryInput> getDirectoryInputs(); }

TransformInvocation代碼:

package com.android.build.api.transform;import java.util.Collection;public abstract interface TransformInvocation {public abstract Context getContext();public abstract Collection<TransformInput> getInputs();public abstract Collection<TransformInput> getReferencedInputs();public abstract Collection<SecondaryInput> getSecondaryInputs();public abstract TransformOutputProvider getOutputProvider();public abstract boolean isIncremental(); }

TransformOutputProvider代碼:

package com.android.build.api.transform;import java.io.File; import java.io.IOException; import java.util.Set;public abstract interface TransformOutputProvider {public abstract void deleteAll()throws IOException;public abstract File getContentLocation(String paramString, Set<QualifiedContent.ContentType> paramSet, Set<? super QualifiedContent.Scope> paramSet1, Format paramFormat); }

看到 gradle.jar 定義了加載plugin 方法,沒有看到加載到哪些plugin,沒有看到加載?com.android.application plugin

-----------------------------------------------------------------------------------------------------

gradle.2.2.3.jar 源碼:


android.properties

implementation-class=com.android.build.gradle.AppPlugin

android-library.properties

implementation-class=com.android.build.gradle.LibraryPlugin

android-reporting.properties

implementation-class=com.android.build.gradle.ReportingPlugin

android.application.properties

implementation-class=com.android.build.gradle.AppPlugin

externals.build.properties

implementation-class=com.android.build.gradle.internal.externalBuild.ExternalBuildPlugin

ProductFlavorFactory類代碼:

public class ProductFlavorFactory implements NamedDomainObjectFactory<ProductFlavor> {@NonNullprivate final Instantiator instantiator;@NonNullprivate final Project project;@NonNullprivate final Logger logger;@NonNullprivate final ErrorReporter errorReporter;public ProductFlavorFactory(@NonNull Instantiator instantiator,@NonNull Project project,@NonNull Logger logger,@NonNull ErrorReporter errorReporter) {this.instantiator = instantiator;this.project = project;this.logger = logger;this.errorReporter = errorReporter;}@Overridepublic ProductFlavor create(String name) {return instantiator.newInstance(ProductFlavor.class,name, project, instantiator, logger, errorReporter);} }

ExternalBuildPlugin類代碼:

/** Copyright (C) 2016 The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/package com.android.build.gradle.internal.externalBuild;import com.android.build.gradle.internal.profile.ProfilerInitializer;import org.gradle.api.Plugin; import org.gradle.api.Project;/*** Gradle plugin for supporting InstantRun with external build system..** <p>* This plugin is private to the android build system and is not intented to be used directly in* end users projects.* </p>* Interfaces, DSL and tasks are subject to change without any notification.*/ public class ExternalBuildPlugin implements Plugin<Project> {@Overridepublic void apply(Project project) {final ExternalBuildExtension externalBuildExtension =project.getExtensions().create("externalBuild", ExternalBuildExtension.class);ProfilerInitializer.init(project);ExternalBuildTaskManager taskManager =new ExternalBuildTaskManager(project);project.afterEvaluate(project1 -> {try {taskManager.createTasks(externalBuildExtension);} catch (Exception e) {throw new RuntimeException(e);}});} }

ApiObjectFactory類代碼:

/** Copyright (C) 2015 The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/package com.android.build.gradle.internal;import com.android.annotations.NonNull; import com.android.build.gradle.BaseExtension; import com.android.build.gradle.TestedAndroidConfig; import com.android.build.gradle.api.BaseVariant; import com.android.build.gradle.internal.api.ReadOnlyObjectProvider; import com.android.build.gradle.internal.api.TestVariantImpl; import com.android.build.gradle.internal.api.TestedVariant; import com.android.build.gradle.internal.api.UnitTestVariantImpl; import com.android.build.gradle.internal.variant.ApplicationVariantFactory; import com.android.build.gradle.internal.variant.BaseVariantData; import com.android.build.gradle.internal.variant.TestVariantData; import com.android.build.gradle.internal.variant.TestedVariantData; import com.android.build.gradle.internal.variant.VariantFactory; import com.android.builder.core.AndroidBuilder;import org.gradle.internal.reflect.Instantiator;import static com.android.builder.core.VariantType.ANDROID_TEST; import static com.android.builder.core.VariantType.UNIT_TEST;/*** Factory to create ApiObject from VariantData.*/ public class ApiObjectFactory {@NonNullprivate final AndroidBuilder androidBuilder;@NonNullprivate final BaseExtension extension;@NonNullprivate final VariantFactory variantFactory;@NonNullprivate final Instantiator instantiator;@NonNullprivate final ReadOnlyObjectProvider readOnlyObjectProvider = new ReadOnlyObjectProvider();public ApiObjectFactory(@NonNull AndroidBuilder androidBuilder,@NonNull BaseExtension extension,@NonNull VariantFactory variantFactory,@NonNull Instantiator instantiator) {this.androidBuilder = androidBuilder;this.extension = extension;this.variantFactory = variantFactory;this.instantiator = instantiator;}public void create(BaseVariantData<?> variantData) {if (variantData.getType().isForTesting()) {// Testing variants are handled together with their "owners".return;}BaseVariant variantApi =variantFactory.createVariantApi(variantData, readOnlyObjectProvider);if (variantFactory.hasTestScope()) {TestVariantData androidTestVariantData =((TestedVariantData) variantData).getTestVariantData(ANDROID_TEST);if (androidTestVariantData != null) {TestVariantImpl androidTestVariant = instantiator.newInstance(TestVariantImpl.class,androidTestVariantData,variantApi,androidBuilder,readOnlyObjectProvider);// add the test output.ApplicationVariantFactory.createApkOutputApiObjects(instantiator,androidTestVariantData,androidTestVariant);((TestedAndroidConfig) extension).getTestVariants().add(androidTestVariant);((TestedVariant) variantApi).setTestVariant(androidTestVariant);}TestVariantData unitTestVariantData =((TestedVariantData) variantData).getTestVariantData(UNIT_TEST);if (unitTestVariantData != null) {UnitTestVariantImpl unitTestVariant = instantiator.newInstance(UnitTestVariantImpl.class,unitTestVariantData,variantApi,androidBuilder,readOnlyObjectProvider);((TestedAndroidConfig) extension).getUnitTestVariants().add(unitTestVariant);((TestedVariant) variantApi).setUnitTestVariant(unitTestVariant);}}// Only add the variant API object to the domain object set once it's been fully// initialized.extension.addVariant(variantApi);} }

NativeLibraryFactoryImpl類代碼:

/** Copyright (C) 2015 The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/package com.android.build.gradle.internal;import com.android.annotations.NonNull; import com.android.build.gradle.AndroidGradleOptions; import com.android.build.gradle.internal.core.Abi; import com.android.build.gradle.internal.dsl.CoreNdkOptions; import com.android.build.gradle.internal.model.NativeLibraryFactory; import com.android.build.gradle.internal.model.NativeLibraryImpl; import com.android.build.gradle.internal.ndk.NdkHandler; import com.android.build.gradle.internal.ndk.Stl; import com.android.build.gradle.internal.scope.VariantScope; import com.android.build.gradle.internal.variant.BaseVariantData; import com.android.build.gradle.internal.variant.BaseVariantOutputData; import com.android.builder.model.NativeLibrary; import com.google.common.collect.ImmutableList;import java.io.File; import java.util.Collections; import java.util.List; import java.util.Optional;/*** Implementation of NativeLibraryFactory for gradle plugin.*/ public class NativeLibraryFactoryImpl implements NativeLibraryFactory {@NonNullfinal NdkHandler ndkHandler;public NativeLibraryFactoryImpl(@NonNull NdkHandler ndkHandler) {this.ndkHandler = ndkHandler;}@NonNull@Overridepublic Optional<NativeLibrary> create(@NonNull VariantScope scope,@NonNull String toolchainName, @NonNull Abi abi) {BaseVariantData<? extends BaseVariantOutputData> variantData = scope.getVariantData();if (!AndroidGradleOptions.useDeprecatedNdk(scope.getGlobalScope().getProject())) {return Optional.empty();}CoreNdkOptions ndkConfig = variantData.getVariantConfiguration().getNdkConfig();String sysrootFlag = "--sysroot=" + ndkHandler.getSysroot(abi);List<String> cFlags = ndkConfig.getcFlags() == null? ImmutableList.of(sysrootFlag): ImmutableList.of(sysrootFlag, ndkConfig.getcFlags());// The DSL currently do not support all options available in the model such as the// include dirs and the defines. Therefore, just pass an empty collection for now.return Optional.<NativeLibrary>of(new NativeLibraryImpl(ndkConfig.getModuleName(),toolchainName,abi.getName(),Collections.<File>emptyList(), /*cIncludeDirs*/Collections.<File>emptyList(), /*cppIncludeDirs*/Collections.<File>emptyList(), /*cSystemIncludeDirs*/ndkHandler.getStlNativeToolSpecification(Stl.getById(ndkConfig.getStl()),null /*stlVersion*/,abi).getIncludes(),Collections.<String>emptyList(), /*cDefines*/Collections.<String>emptyList(), /*cppDefines*/cFlags,cFlags, // TODO: NdkConfig should allow cppFlags to be set separately.ImmutableList.of(scope.getNdkDebuggableLibraryFolders(abi))));} }

Version類:

package com.android.build.gradle.internal;public final class Version {private Version() {}public static final String ANDROID_GRADLE_PLUGIN_VERSION = "2.2.3";public static final String ANDROID_GRADLE_COMPONENT_PLUGIN_VERSION = "0.8.3"; }

AppExtension類代碼:

package com.android.build.gradle;import com.android.annotations.NonNull; import com.android.build.gradle.api.ApplicationVariant; import com.android.build.gradle.api.BaseVariant; import com.android.build.gradle.internal.ExtraModelInfo; import com.android.build.gradle.internal.SdkHandler; import com.android.build.gradle.internal.dsl.BuildType; import com.android.build.gradle.internal.dsl.ProductFlavor; import com.android.build.gradle.internal.dsl.SigningConfig; import com.android.builder.core.AndroidBuilder;import org.gradle.api.DomainObjectSet; import org.gradle.api.NamedDomainObjectContainer; import org.gradle.api.internal.DefaultDomainObjectSet; import org.gradle.api.internal.project.ProjectInternal; import org.gradle.internal.reflect.Instantiator;/*** {@code android} extension for {@code com.android.application} projects.*/ public class AppExtension extends TestedExtension {private final DefaultDomainObjectSet<ApplicationVariant> applicationVariantList= new DefaultDomainObjectSet<ApplicationVariant>(ApplicationVariant.class);public AppExtension(@NonNull ProjectInternal project, @NonNull Instantiator instantiator,@NonNull AndroidBuilder androidBuilder, @NonNull SdkHandler sdkHandler,@NonNull NamedDomainObjectContainer<BuildType> buildTypes,@NonNull NamedDomainObjectContainer<ProductFlavor> productFlavors,@NonNull NamedDomainObjectContainer<SigningConfig> signingConfigs,@NonNull ExtraModelInfo extraModelInfo, boolean isLibrary) {super(project, instantiator, androidBuilder, sdkHandler, buildTypes, productFlavors,signingConfigs, extraModelInfo, isLibrary);}/*** Returns the list of Application variants. Since the collections is built after evaluation, it* should be used with Gradle's <code>all</code> iterator to process future items.*/public DomainObjectSet<ApplicationVariant> getApplicationVariants() {return applicationVariantList;}@Overridepublic void addVariant(BaseVariant variant) {applicationVariantList.add((ApplicationVariant) variant);} }

AppPlugin類代碼:

/** Copyright (C) 2012 The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/package com.android.build.gradle;import com.android.annotations.NonNull; import com.android.build.gradle.internal.ApplicationTaskManager; import com.android.build.gradle.internal.DependencyManager; import com.android.build.gradle.internal.SdkHandler; import com.android.build.gradle.internal.TaskManager; import com.android.build.gradle.internal.ndk.NdkHandler; import com.android.build.gradle.internal.variant.ApplicationVariantFactory; import com.android.build.gradle.internal.variant.VariantFactory; import com.android.builder.core.AndroidBuilder;import org.gradle.api.Plugin; import org.gradle.api.Project; import org.gradle.internal.reflect.Instantiator; import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry;import android.databinding.tool.DataBindingBuilder;import javax.inject.Inject;/*** Gradle plugin class for 'application' projects.*/ public class AppPlugin extends BasePlugin implements Plugin<Project> {@Injectpublic AppPlugin(Instantiator instantiator, ToolingModelBuilderRegistry registry) {super(instantiator, registry);}@Overrideprotected Class<? extends BaseExtension> getExtensionClass() {return AppExtension.class;}@Overrideprotected TaskManager createTaskManager(@NonNull Project project,@NonNull AndroidBuilder androidBuilder,@NonNull DataBindingBuilder dataBindingBuilder,@NonNull AndroidConfig extension,@NonNull SdkHandler sdkHandler,@NonNull NdkHandler ndkHandler,@NonNull DependencyManager dependencyManager,@NonNull ToolingModelBuilderRegistry toolingRegistry) {return new ApplicationTaskManager(project,androidBuilder,dataBindingBuilder,extension,sdkHandler,ndkHandler,dependencyManager,toolingRegistry);}@Overridepublic void apply(@NonNull Project project) {super.apply(project);}@Overrideprotected VariantFactory createVariantFactory() {return new ApplicationVariantFactory(instantiator, androidBuilder, extension);} }

BaseExtension類代碼:

/** Copyright (C) 2012 The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/ package com.android.build.gradle;import com.android.annotations.NonNull; import com.android.annotations.Nullable; import com.android.build.api.transform.Transform; import com.android.build.api.variant.VariantFilter; import com.android.build.gradle.api.AndroidSourceSet; import com.android.build.gradle.api.BaseVariant; import com.android.build.gradle.internal.CompileOptions; import com.android.build.gradle.internal.ExtraModelInfo; import com.android.build.gradle.internal.LoggingUtil; import com.android.build.gradle.internal.SdkHandler; import com.android.build.gradle.internal.SourceSetSourceProviderWrapper; import com.android.build.gradle.internal.coverage.JacocoOptions; import com.android.build.gradle.internal.dsl.AaptOptions; import com.android.build.gradle.internal.dsl.AdbOptions; import com.android.build.gradle.internal.dsl.AndroidSourceSetFactory; import com.android.build.gradle.internal.dsl.BuildType; import com.android.build.gradle.internal.dsl.DataBindingOptions; import com.android.build.gradle.internal.dsl.DexOptions; import com.android.build.gradle.internal.dsl.ExternalNativeBuild; import com.android.build.gradle.internal.dsl.LintOptions; import com.android.build.gradle.internal.dsl.PackagingOptions; import com.android.build.gradle.internal.dsl.ProductFlavor; import com.android.build.gradle.internal.dsl.SigningConfig; import com.android.build.gradle.internal.dsl.Splits; import com.android.build.gradle.internal.dsl.TestOptions; import com.android.builder.core.AndroidBuilder; import com.android.builder.core.BuilderConstants; import com.android.builder.core.LibraryRequest; import com.android.builder.model.SourceProvider; import com.android.builder.sdk.TargetInfo; import com.android.builder.testing.api.DeviceProvider; import com.android.builder.testing.api.TestServer; import com.android.repository.Revision; import com.android.resources.Density; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import com.google.common.collect.Sets;import org.gradle.api.Action; import org.gradle.api.GradleException; import org.gradle.api.NamedDomainObjectContainer; import org.gradle.api.Project; import org.gradle.api.artifacts.Configuration; import org.gradle.api.artifacts.ConfigurationContainer; import org.gradle.api.internal.project.ProjectInternal; import org.gradle.api.logging.Logger; import org.gradle.api.logging.Logging; import org.gradle.api.tasks.SourceSet; import org.gradle.internal.reflect.Instantiator;import java.io.File; import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Set;/*** Base 'android' extension for all android plugins.** <p>This is never used directly. Instead,*<ul>* <li>Plugin <code>com.android.application</code> uses {@link AppExtension}</li>* <li>Plugin <code>com.android.library</code> uses {@link LibraryExtension}</li>* <li>Plugin <code>com.android.test</code> uses {@link TestExtension}</li>* </ul>*/ // All the public methods are meant to be exposed in the DSL. // We can't yet lambdas in this class (yet), because the DSL reference generator doesn't understand // them. @SuppressWarnings({"UnnecessaryInheritDoc", "WeakerAccess", "unused", "Convert2Lambda"}) public abstract class BaseExtension implements AndroidConfig {/** Secondary dependencies for the custom transform. */private final List<List<Object>> transformDependencies = Lists.newArrayList();private final AndroidBuilder androidBuilder;private final SdkHandler sdkHandler;private final ProductFlavor defaultConfig;private final AaptOptions aaptOptions;private final LintOptions lintOptions;private final ExternalNativeBuild externalNativeBuild;private final DexOptions dexOptions;private final TestOptions testOptions;private final CompileOptions compileOptions;private final PackagingOptions packagingOptions;private final JacocoOptions jacoco;private final Splits splits;private final AdbOptions adbOptions;private final NamedDomainObjectContainer<ProductFlavor> productFlavors;private final NamedDomainObjectContainer<BuildType> buildTypes;private final NamedDomainObjectContainer<SigningConfig> signingConfigs;private final List<DeviceProvider> deviceProviderList = Lists.newArrayList();private final List<TestServer> testServerList = Lists.newArrayList();private final List<Transform> transforms = Lists.newArrayList();private final DataBindingOptions dataBinding;private final NamedDomainObjectContainer<AndroidSourceSet> sourceSetsContainer;private String target;private Revision buildToolsRevision;private List<LibraryRequest> libraryRequests = Lists.newArrayList();private List<String> flavorDimensionList;private String resourcePrefix;private ExtraModelInfo extraModelInfo;private String defaultPublishConfig = "release";private boolean publishNonDefault = false;private Action<VariantFilter> variantFilter;protected Logger logger;private boolean isWritable = true;protected Project project;BaseExtension(@NonNull final ProjectInternal project,@NonNull Instantiator instantiator,@NonNull AndroidBuilder androidBuilder,@NonNull SdkHandler sdkHandler,@NonNull NamedDomainObjectContainer<BuildType> buildTypes,@NonNull NamedDomainObjectContainer<ProductFlavor> productFlavors,@NonNull NamedDomainObjectContainer<SigningConfig> signingConfigs,@NonNull ExtraModelInfo extraModelInfo,final boolean isLibrary) {this.androidBuilder = androidBuilder;this.sdkHandler = sdkHandler;this.buildTypes = buildTypes;//noinspection uncheckedthis.productFlavors = (NamedDomainObjectContainer) productFlavors;this.signingConfigs = signingConfigs;this.extraModelInfo = extraModelInfo;this.project = project;logger = Logging.getLogger(this.getClass());defaultConfig = instantiator.newInstance(ProductFlavor.class, BuilderConstants.MAIN,project, instantiator, project.getLogger(), extraModelInfo);aaptOptions = instantiator.newInstance(AaptOptions.class);dexOptions = instantiator.newInstance(DexOptions.class, extraModelInfo);lintOptions = instantiator.newInstance(LintOptions.class);externalNativeBuild = instantiator.newInstance(ExternalNativeBuild.class, instantiator, project);testOptions = instantiator.newInstance(TestOptions.class);compileOptions = instantiator.newInstance(CompileOptions.class);packagingOptions = instantiator.newInstance(PackagingOptions.class);jacoco = instantiator.newInstance(JacocoOptions.class);adbOptions = instantiator.newInstance(AdbOptions.class);splits = instantiator.newInstance(Splits.class, instantiator);dataBinding = instantiator.newInstance(DataBindingOptions.class);sourceSetsContainer = project.container(AndroidSourceSet.class,new AndroidSourceSetFactory(instantiator, project, isLibrary));sourceSetsContainer.whenObjectAdded(new Action<AndroidSourceSet>() {@Overridepublic void execute(AndroidSourceSet sourceSet) {ConfigurationContainer configurations = project.getConfigurations();createConfiguration(configurations,sourceSet.getCompileConfigurationName(),"Classpath for compiling the " + sourceSet.getName() + " sources.");String packageConfigDescription;if (isLibrary) {packageConfigDescription= "Classpath only used when publishing '" + sourceSet.getName() + "'.";} else {packageConfigDescription= "Classpath packaged with the compiled '" + sourceSet.getName() + "' classes.";}createConfiguration(configurations,sourceSet.getPackageConfigurationName(),packageConfigDescription);createConfiguration(configurations,sourceSet.getProvidedConfigurationName(),"Classpath for only compiling the " + sourceSet.getName() + " sources.");createConfiguration(configurations,sourceSet.getWearAppConfigurationName(),"Link to a wear app to embed for object '" + sourceSet.getName() + "'.");createConfiguration(configurations,sourceSet.getAnnotationProcessorConfigurationName(),"Classpath for the annotation processor for '" + sourceSet.getName() +"'.");sourceSet.setRoot(String.format("src/%s", sourceSet.getName()));}});sourceSetsContainer.create(defaultConfig.getName());setDefaultConfigValues();}private void setDefaultConfigValues() {Set<Density> densities = Density.getRecommendedValuesForDevice();Set<String> strings = Sets.newHashSetWithExpectedSize(densities.size());for (Density density : densities) {strings.add(density.getResourceValue());}defaultConfig.getVectorDrawables().setGeneratedDensities(strings);defaultConfig.getVectorDrawables().setUseSupportLibrary(false);}/*** Disallow further modification on the extension.*/public void disableWrite() {isWritable = false;}protected void checkWritability() {if (!isWritable) {throw new GradleException("Android tasks have already been created.\n" +"This happens when calling android.applicationVariants,\n" +"android.libraryVariants or android.testVariants.\n" +"Once these methods are called, it is not possible to\n" +"continue configuring the model.");}}protected void createConfiguration(@NonNull ConfigurationContainer configurations,@NonNull String configurationName,@NonNull String configurationDescription) {logger.info("Creating configuration {}", configurationName);Configuration configuration = configurations.findByName(configurationName);if (configuration == null) {configuration = configurations.create(configurationName);}configuration.setVisible(false);configuration.setDescription(configurationDescription);}/*** Sets the compile SDK version, based on full SDK version string, e.g.* <code>android-21</code> for Lollipop.*/public void compileSdkVersion(String version) {checkWritability();this.target = version;}/*** Sets the compile SDK version, based on API level, e.g. 21 for Lollipop.*/public void compileSdkVersion(int apiLevel) {compileSdkVersion("android-" + apiLevel);}public void setCompileSdkVersion(int apiLevel) {compileSdkVersion(apiLevel);}public void setCompileSdkVersion(String target) {compileSdkVersion(target);}/*** Request the use a of Library. The library is then added to the classpath.* @param name the name of the library.*/public void useLibrary(String name) {useLibrary(name, true);}/*** Request the use a of Library. The library is then added to the classpath.* @param name the name of the library.* @param required if using the library requires a manifest entry, the entry will* indicate that the library is not required.*/public void useLibrary(String name, boolean required) {libraryRequests.add(new LibraryRequest(name, required));}public void buildToolsVersion(String version) {checkWritability();//The underlying Revision class has the maven artifact semantic,// so 20 is not the same as 20.0. For the build tools revision this// is not the desired behavior, so normalize e.g. to 20.0.0.buildToolsRevision = Revision.parseRevision(version, Revision.Precision.MICRO);}/*** <strong>Required.</strong> Version of the build tools to use.** <p>Value assigned to this property is parsed and stored in a normalized form, so reading it* back may give a slightly different string.*/@Overridepublic String getBuildToolsVersion() {return buildToolsRevision.toString();}public void setBuildToolsVersion(String version) {buildToolsVersion(version);}/*** Configures build types.*/public void buildTypes(Action<? super NamedDomainObjectContainer<BuildType>> action) {checkWritability();action.execute(buildTypes);}/*** Configures product flavors.*/public void productFlavors(Action<? super NamedDomainObjectContainer<ProductFlavor>> action) {checkWritability();action.execute(productFlavors);}/*** Configures signing configs.*/public void signingConfigs(Action<? super NamedDomainObjectContainer<SigningConfig>> action) {checkWritability();action.execute(signingConfigs);}/*** Specifies names of flavor dimensions.** <p>See <a href="http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Multi-flavor-variants">Multi-flavor variants</a>.*/public void flavorDimensions(String... dimensions) {checkWritability();flavorDimensionList = Arrays.asList(dimensions);}/*** Configures source sets.** <p>Note that the Android plugin uses its own implementation of source sets,* {@link AndroidSourceSet}.*/public void sourceSets(Action<NamedDomainObjectContainer<AndroidSourceSet>> action) {checkWritability();action.execute(sourceSetsContainer);}/*** All source sets. Note that the Android plugin uses its own implementation of* source sets, {@link AndroidSourceSet}.*/@Overridepublic NamedDomainObjectContainer<AndroidSourceSet> getSourceSets() {return sourceSetsContainer;}/*** The default configuration, inherited by all product flavors (if any are defined).*/public void defaultConfig(Action<ProductFlavor> action) {checkWritability();action.execute(defaultConfig);}/*** Configures aapt options.*/public void aaptOptions(Action<AaptOptions> action) {checkWritability();action.execute(aaptOptions);}/*** Configures dex options.*/public void dexOptions(Action<DexOptions> action) {checkWritability();action.execute(dexOptions);}/*** Configures lint options.*/public void lintOptions(Action<LintOptions> action) {checkWritability();action.execute(lintOptions);}/*** Configures external native build options.*/public void externalNativeBuild(Action<ExternalNativeBuild> action) {checkWritability();action.execute(externalNativeBuild);}/** Configures test options. */public void testOptions(Action<TestOptions> action) {checkWritability();action.execute(testOptions);}/*** Configures compile options.*/public void compileOptions(Action<CompileOptions> action) {checkWritability();action.execute(compileOptions);}/*** Configures packaging options.*/public void packagingOptions(Action<PackagingOptions> action) {checkWritability();action.execute(packagingOptions);}/*** Configures JaCoCo options.*/public void jacoco(Action<JacocoOptions> action) {checkWritability();action.execute(jacoco);}/*** Configures adb options.*/public void adbOptions(Action<AdbOptions> action) {checkWritability();action.execute(adbOptions);}/*** Configures APK splits.*/public void splits(Action<Splits> action) {checkWritability();action.execute(splits);}/*** Configures data binding options.*/public void dataBinding(Action<DataBindingOptions> action) {checkWritability();action.execute(dataBinding);}/** {@inheritDoc} */@Overridepublic DataBindingOptions getDataBinding() {return dataBinding;}public void deviceProvider(DeviceProvider deviceProvider) {checkWritability();deviceProviderList.add(deviceProvider);}@Override@NonNullpublic List<DeviceProvider> getDeviceProviders() {return deviceProviderList;}public void testServer(TestServer testServer) {checkWritability();testServerList.add(testServer);}@Override@NonNullpublic List<TestServer> getTestServers() {return testServerList;}public void registerTransform(@NonNull Transform transform, Object... dependencies) {transforms.add(transform);transformDependencies.add(Arrays.asList(dependencies));}@Override@NonNullpublic List<Transform> getTransforms() {return ImmutableList.copyOf(transforms);}@Override@NonNullpublic List<List<Object>> getTransformsDependencies() {return ImmutableList.copyOf(transformDependencies);}/** {@inheritDoc} */@Overridepublic Collection<ProductFlavor> getProductFlavors() {return productFlavors;}/** {@inheritDoc} */@Overridepublic Collection<BuildType> getBuildTypes() {return buildTypes;}/** {@inheritDoc} */@Overridepublic Collection<SigningConfig> getSigningConfigs() {return signingConfigs;}public void defaultPublishConfig(String value) {setDefaultPublishConfig(value);}public void publishNonDefault(boolean value) {publishNonDefault = value;}/*** Name of the configuration used to build the default artifact of this project.** <p>See <a href="http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Referencing-a-Library">* Referencing a Library</a>*/@Overridepublic String getDefaultPublishConfig() {return defaultPublishConfig;}public void setDefaultPublishConfig(String value) {defaultPublishConfig = value;}/*** Whether to publish artifacts for all configurations, not just the default one.** <p>See <a href="http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Referencing-a-Library">* Referencing a Library</a>*/@Overridepublic boolean getPublishNonDefault() {return publishNonDefault;}public void variantFilter(Action<VariantFilter> filter) {setVariantFilter(filter);}public void setVariantFilter(Action<VariantFilter> filter) {variantFilter = filter;}/*** Callback to control which variants should be excluded.** <p>The {@link Action} is passed a single object of type {@link VariantFilter}.* It should set the {@link VariantFilter#setIgnore(boolean)} flag to filter out the* given variant.*/@Overridepublic Action<VariantFilter> getVariantFilter() {return variantFilter;}/** {@inheritDoc} */@Overridepublic AdbOptions getAdbOptions() {return adbOptions;}/** {@inheritDoc} */@Overridepublic String getResourcePrefix() {return resourcePrefix;}/*** Returns the names of flavor dimensions.** <p>See <a href="http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Multi-flavor-variants">Multi-flavor variants</a>.*/@Overridepublic List<String> getFlavorDimensionList() {return flavorDimensionList;}/** {@inheritDoc} */@Overridepublic boolean getGeneratePureSplits() {return generatePureSplits;}public void resourcePrefix(String prefix) {resourcePrefix = prefix;}public abstract void addVariant(BaseVariant variant);public void registerArtifactType(@NonNull String name,boolean isTest,int artifactType) {extraModelInfo.registerArtifactType(name, isTest, artifactType);}public void registerBuildTypeSourceProvider(@NonNull String name,@NonNull BuildType buildType,@NonNull SourceProvider sourceProvider) {extraModelInfo.registerBuildTypeSourceProvider(name, buildType, sourceProvider);}public void registerProductFlavorSourceProvider(@NonNull String name,@NonNull ProductFlavor productFlavor,@NonNull SourceProvider sourceProvider) {extraModelInfo.registerProductFlavorSourceProvider(name, productFlavor, sourceProvider);}public void registerJavaArtifact(@NonNull String name,@NonNull BaseVariant variant,@NonNull String assembleTaskName,@NonNull String javaCompileTaskName,@NonNull Collection<File> generatedSourceFolders,@NonNull Iterable<String> ideSetupTaskNames,@NonNull Configuration configuration,@NonNull File classesFolder,@NonNull File javaResourceFolder,@Nullable SourceProvider sourceProvider) {extraModelInfo.registerJavaArtifact(name, variant, assembleTaskName,javaCompileTaskName, generatedSourceFolders, ideSetupTaskNames,configuration, classesFolder, javaResourceFolder, sourceProvider);}public void registerMultiFlavorSourceProvider(@NonNull String name,@NonNull String flavorName,@NonNull SourceProvider sourceProvider) {extraModelInfo.registerMultiFlavorSourceProvider(name, flavorName, sourceProvider);}@NonNullpublic static SourceProvider wrapJavaSourceSet(@NonNull SourceSet sourceSet) {return new SourceSetSourceProviderWrapper(sourceSet);}/*** <strong>Required.</strong> Compile SDK version.** <p>Your code will be compiled against the android.jar from this API level. You should* generally use the most up-to-date SDK version here. Use the Lint tool to make sure you don't* use APIs not available in earlier platform version without checking.** <p>Setter can be called with a string like "android-21" or a number.** <p>Value assigned to this property is parsed and stored in a normalized form, so reading it* back may give a slightly different string.*/@Overridepublic String getCompileSdkVersion() {return target;}@Overridepublic Revision getBuildToolsRevision() {return buildToolsRevision;}@Overridepublic Collection<LibraryRequest> getLibraryRequests() {return libraryRequests;}/*** Returns the SDK directory used.*/public File getSdkDirectory() {return sdkHandler.getSdkFolder();}/*** ReturnS the NDK directory used.*/public File getNdkDirectory() {return sdkHandler.getNdkFolder();}public List<File> getBootClasspath() {ensureTargetSetup();return androidBuilder.getBootClasspath(false);}/*** The adb executable from the compile SDK.*/public File getAdbExecutable() {return sdkHandler.getSdkInfo().getAdb();}@Deprecatedpublic File getAdbExe() {return getAdbExecutable();}public File getDefaultProguardFile(String name) {return ProguardFiles.getDefaultProguardFile(name, project);}// ---------------// TEMP for compatibility// by default, we do not generate pure splitsboolean generatePureSplits = false;public void generatePureSplits(boolean flag) {setGeneratePureSplits(flag);}public void setGeneratePureSplits(boolean flag) {if (flag) {logger.warn("Pure splits are not supported by PlayStore yet.");}this.generatePureSplits = flag;}private boolean enforceUniquePackageName = true;public void enforceUniquePackageName(boolean value) {if (!value) {LoggingUtil.displayDeprecationWarning(logger, project, "Support for libraries with same package name is deprecated and will be removed in a future release.");}enforceUniquePackageName = value;}public void setEnforceUniquePackageName(boolean value) {enforceUniquePackageName(value);}@Overridepublic boolean getEnforceUniquePackageName() {return enforceUniquePackageName;}/** {@inheritDoc} */@Overridepublic ProductFlavor getDefaultConfig() {return defaultConfig;}/** {@inheritDoc} */@Overridepublic AaptOptions getAaptOptions() {return aaptOptions;}/** {@inheritDoc} */@Overridepublic CompileOptions getCompileOptions() {return compileOptions;}/** {@inheritDoc} */@Overridepublic DexOptions getDexOptions() {return dexOptions;}/** {@inheritDoc} */@Overridepublic JacocoOptions getJacoco() {return jacoco;}/** {@inheritDoc} */@Overridepublic LintOptions getLintOptions() {return lintOptions;}/** {@inheritDoc} */@Overridepublic ExternalNativeBuild getExternalNativeBuild() {return externalNativeBuild;}/** {@inheritDoc} */@Overridepublic PackagingOptions getPackagingOptions() {return packagingOptions;}/** {@inheritDoc} */@Overridepublic Splits getSplits() {return splits;}/** {@inheritDoc} */@Overridepublic TestOptions getTestOptions() {return testOptions;}private void ensureTargetSetup() {// check if the target has been set.TargetInfo targetInfo = androidBuilder.getTargetInfo();if (targetInfo == null) {sdkHandler.initTarget(getCompileSdkVersion(),buildToolsRevision,libraryRequests,androidBuilder,SdkHandler.useCachedSdk(project));}}// For compatibility with LibraryExtension.@Overridepublic Boolean getPackageBuildConfig() {throw new GradleException("packageBuildConfig is not supported.");}@Overridepublic Collection<String> getAidlPackageWhiteList() {throw new GradleException("aidlPackageWhiteList is not supported.");} }

BasePlugin代碼:

/** Copyright (C) 2012 The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/package com.android.build.gradle;import static com.android.builder.model.AndroidProject.FD_INTERMEDIATES; import static com.google.common.base.Preconditions.checkState; import static java.io.File.separator;import com.android.annotations.NonNull; import com.android.annotations.Nullable; import com.android.annotations.VisibleForTesting; import com.android.build.api.transform.Transform; import com.android.build.gradle.internal.ApiObjectFactory; import com.android.build.gradle.internal.BadPluginException; import com.android.build.gradle.internal.DependencyManager; import com.android.build.gradle.internal.ExecutionConfigurationUtil; import com.android.build.gradle.internal.ExtraModelInfo; import com.android.build.gradle.internal.LibraryCache; import com.android.build.gradle.internal.LoggerWrapper; import com.android.build.gradle.internal.NativeLibraryFactoryImpl; import com.android.build.gradle.internal.SdkHandler; import com.android.build.gradle.internal.TaskContainerAdaptor; import com.android.build.gradle.internal.TaskManager; import com.android.build.gradle.internal.ToolingRegistryProvider; import com.android.build.gradle.internal.VariantManager; import com.android.build.gradle.internal.coverage.JacocoPlugin; import com.android.build.gradle.internal.dependency.VariantDependencies; import com.android.build.gradle.internal.dsl.BuildType; import com.android.build.gradle.internal.dsl.BuildTypeFactory; import com.android.build.gradle.internal.dsl.ProductFlavor; import com.android.build.gradle.internal.dsl.ProductFlavorFactory; import com.android.build.gradle.internal.dsl.SigningConfig; import com.android.build.gradle.internal.dsl.SigningConfigFactory; import com.android.build.gradle.internal.model.ModelBuilder; import com.android.build.gradle.internal.model.NativeModelBuilder; import com.android.build.gradle.internal.ndk.NdkHandler; import com.android.build.gradle.internal.pipeline.TransformTask; import com.android.build.gradle.internal.process.GradleJavaProcessExecutor; import com.android.build.gradle.internal.process.GradleProcessExecutor; import com.android.build.gradle.internal.profile.ProfilerInitializer; import com.android.build.gradle.internal.profile.RecordingBuildListener; import com.android.build.gradle.internal.transforms.DexTransform; import com.android.build.gradle.internal.variant.BaseVariantData; import com.android.build.gradle.internal.variant.VariantFactory; import com.android.build.gradle.tasks.ExternalNativeBuildTaskUtils; import com.android.build.gradle.tasks.ExternalNativeJsonGenerator; import com.android.build.gradle.tasks.JackPreDexTransform; import com.android.builder.Version; import com.android.builder.core.AndroidBuilder; import com.android.builder.core.BuilderConstants; import com.android.builder.internal.compiler.JackConversionCache; import com.android.builder.internal.compiler.PreDexCache; import com.android.builder.model.AndroidProject; import com.android.builder.model.SyncIssue; import com.android.builder.profile.ProcessRecorder; import com.google.wireless.android.sdk.stats.AndroidStudioStats; import com.google.wireless.android.sdk.stats.AndroidStudioStats.GradleBuildProfileSpan.ExecutionType; import com.android.builder.profile.ProcessRecorderFactory; import com.android.builder.profile.Recorder; import com.android.builder.profile.ThreadRecorder; import com.android.builder.sdk.SdkLibData; import com.android.builder.sdk.TargetInfo; import com.android.dx.command.dexer.Main; import com.android.ide.common.internal.ExecutorSingleton; import com.android.ide.common.repository.GradleVersion; import com.android.repository.api.Channel; import com.android.repository.api.Downloader; import com.android.repository.api.SettingsController; import com.android.repository.impl.downloader.LocalFileAwareDownloader; import com.android.repository.io.FileOpUtils; import com.android.sdklib.repository.legacy.LegacyDownloader; import com.android.utils.ILogger; import com.google.common.base.CharMatcher; import com.google.common.base.Splitter; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap;import org.gradle.BuildListener; import org.gradle.BuildResult; import org.gradle.api.Action; import org.gradle.api.GradleException; import org.gradle.api.NamedDomainObjectContainer; import org.gradle.api.Project; import org.gradle.api.Task; import org.gradle.api.execution.TaskExecutionGraph; import org.gradle.api.execution.TaskExecutionGraphListener; import org.gradle.api.initialization.Settings; import org.gradle.api.invocation.Gradle; import org.gradle.api.logging.LogLevel; import org.gradle.api.plugins.JavaBasePlugin; import org.gradle.api.plugins.JavaPlugin; import org.gradle.api.tasks.StopExecutionException; import org.gradle.internal.reflect.Instantiator; import org.gradle.tooling.UnsupportedVersionException; import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry;import android.databinding.tool.DataBindingBuilder;import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.math.BigInteger; import java.net.URL; import java.net.URLClassLoader; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.concurrent.TimeUnit; import java.util.jar.Manifest;/*** Base class for all Android plugins*/ public abstract class BasePlugin implements ToolingRegistryProvider {private static final GradleVersion GRADLE_MIN_VERSION = GradleVersion.parse("2.14.1");/** default retirement age in days since its inception date for RC or beta versions. */private static final int DEFAULT_RETIREMENT_AGE_FOR_NON_RELEASE_IN_DAYS = 40;protected BaseExtension extension;protected VariantManager variantManager;protected TaskManager taskManager;protected Project project;protected SdkHandler sdkHandler;private NdkHandler ndkHandler;protected AndroidBuilder androidBuilder;protected DataBindingBuilder dataBindingBuilder;protected Instantiator instantiator;protected VariantFactory variantFactory;private ToolingModelBuilderRegistry registry;private JacocoPlugin jacocoPlugin;private LoggerWrapper loggerWrapper;private ExtraModelInfo extraModelInfo;private String creator;private DependencyManager dependencyManager;private boolean hasCreatedTasks = false;BasePlugin(@NonNull Instantiator instantiator, @NonNull ToolingModelBuilderRegistry registry) {this.instantiator = instantiator;this.registry = registry;creator = "Android Gradle " + Version.ANDROID_GRADLE_PLUGIN_VERSION;verifyRetirementAge();ModelBuilder.clearCaches();}/*** Verify that this plugin execution is within its public time range.*/private void verifyRetirementAge() {Manifest manifest;URLClassLoader cl = (URLClassLoader) getClass().getClassLoader();try {URL url = cl.findResource("META-INF/MANIFEST.MF");manifest = new Manifest(url.openStream());} catch (IOException ignore) {return;}int retirementAgeInDays =getRetirementAgeInDays(manifest.getMainAttributes().getValue("Plugin-Version"));// if this plugin version will never be outdated, return.if (retirementAgeInDays == -1) {return;}String inceptionDateAttr = manifest.getMainAttributes().getValue("Inception-Date");// when running in unit tests, etc... the manifest entries are absent.if (inceptionDateAttr == null) {return;}List<String> items = ImmutableList.copyOf(Splitter.on(':').split(inceptionDateAttr));GregorianCalendar inceptionDate = new GregorianCalendar(Integer.parseInt(items.get(0)),Integer.parseInt(items.get(1)), Integer.parseInt(items.get(2)));Calendar now = GregorianCalendar.getInstance();long nowTimestamp = now.getTimeInMillis();long inceptionTimestamp = inceptionDate.getTimeInMillis();long days = TimeUnit.DAYS.convert(nowTimestamp - inceptionTimestamp, TimeUnit.MILLISECONDS);if (days > retirementAgeInDays) {// this plugin is too old.String dailyOverride = System.getenv("ANDROID_DAILY_OVERRIDE");final MessageDigest crypt;try {crypt = MessageDigest.getInstance("SHA-1");} catch (NoSuchAlgorithmException e) {return;}crypt.reset();// encode the day, not the current time.try {crypt.update(String.format("%1$s:%2$s:%3$s",now.get(Calendar.YEAR),now.get(Calendar.MONTH),now.get(Calendar.DATE)).getBytes("utf8"));} catch (UnsupportedEncodingException e) {return;}String overrideValue = new BigInteger(1, crypt.digest()).toString(16);if (dailyOverride == null) {String message = "Plugin is too old, please update to a more recent version, or " +"set ANDROID_DAILY_OVERRIDE environment variable to \"" + overrideValue + '"';System.err.println(message);throw new RuntimeException(message);} else {if (!dailyOverride.equals(overrideValue)) {String message = "Plugin is too old and ANDROID_DAILY_OVERRIDE value is " +"also outdated, please use new value :\"" + overrideValue + '"';System.err.println(message);throw new RuntimeException(message);}}}}/*** Returns the retirement age for this plugin depending on its version string, or -1 if this* plugin version will never become obsolete* @param version the plugin full version, like 1.3.4-preview5 or 1.0.2 or 1.2.3-beta4* @return the retirement age in days or -1 if no retirement*/private static int getRetirementAgeInDays(@Nullable String version) {if (version == null || version.contains("rc") || version.contains("beta")|| version.contains("alpha") || version.contains("preview")) {return DEFAULT_RETIREMENT_AGE_FOR_NON_RELEASE_IN_DAYS;}return -1;}protected abstract Class<? extends BaseExtension> getExtensionClass();protected abstract VariantFactory createVariantFactory();protected abstract TaskManager createTaskManager(@NonNull Project project,@NonNull AndroidBuilder androidBuilder,@NonNull DataBindingBuilder dataBindingBuilder,@NonNull AndroidConfig extension,@NonNull SdkHandler sdkHandler,@NonNull NdkHandler ndkHandler,@NonNull DependencyManager dependencyManager,@NonNull ToolingModelBuilderRegistry toolingRegistry);/*** Return whether this plugin creates Android library. Should be overridden if true.*/protected boolean isLibrary() {return false;}@VisibleForTestingVariantManager getVariantManager() {return variantManager;}protected ILogger getLogger() {if (loggerWrapper == null) {loggerWrapper = new LoggerWrapper(project.getLogger());}return loggerWrapper;}protected void apply(@NonNull Project project) {checkPluginVersion();this.project = project;ExecutionConfigurationUtil.setThreadPoolSize(project);checkPathForErrors();checkModulesForErrors();ProfilerInitializer.init(project);String benchmarkName = AndroidGradleOptions.getBenchmarkName(project);String benchmarkMode = AndroidGradleOptions.getBenchmarkMode(project);if (benchmarkName != null && benchmarkMode != null) {ProcessRecorder.setBenchmark(benchmarkName, benchmarkMode);}AndroidStudioStats.GradleBuildProject.PluginType pluginType =AndroidStudioStats.GradleBuildProject.PluginType.UNKNOWN_PLUGIN_TYPE;if (this instanceof AppPlugin) {pluginType = AndroidStudioStats.GradleBuildProject.PluginType.APPLICATION;} else if (this instanceof LibraryPlugin) {pluginType = AndroidStudioStats.GradleBuildProject.PluginType.LIBRARY;} else if (this instanceof TestPlugin) {pluginType = AndroidStudioStats.GradleBuildProject.PluginType.TEST;}ProcessRecorder.getProject(project.getPath()).setAndroidPluginVersion(Version.ANDROID_GRADLE_PLUGIN_VERSION).setAndroidPlugin(pluginType).setPluginGeneration(AndroidStudioStats.GradleBuildProject.PluginGeneration.FIRST);ThreadRecorder.get().record(ExecutionType.BASE_PLUGIN_PROJECT_CONFIGURE,project.getPath(), null /*variantName*/, new Recorder.Block<Void>() {@Overridepublic Void call() throws Exception {configureProject();return null;}});ThreadRecorder.get().record(ExecutionType.BASE_PLUGIN_PROJECT_BASE_EXTENSION_CREATION,project.getPath(), null /*variantName*/, new Recorder.Block<Void>() {@Overridepublic Void call() throws Exception {createExtension();return null;}});ThreadRecorder.get().record(ExecutionType.BASE_PLUGIN_PROJECT_TASKS_CREATION,project.getPath(), null /*variantName*/, new Recorder.Block<Void>() {@Overridepublic Void call() throws Exception {createTasks();return null;}});// Apply additional pluginsfor (String plugin : AndroidGradleOptions.getAdditionalPlugins(project)) {project.apply(ImmutableMap.of("plugin", plugin));}}protected void configureProject() {extraModelInfo = new ExtraModelInfo(project, isLibrary());checkGradleVersion();sdkHandler = new SdkHandler(project, getLogger());project.afterEvaluate(p -> {// TODO: Read flag from extension.if (!p.getGradle().getStartParameter().isOffline()&& AndroidGradleOptions.getUseSdkDownload(p)) {SdkLibData sdkLibData =SdkLibData.download(getDownloader(), getSettingsController());dependencyManager.setSdkLibData(sdkLibData);sdkHandler.setSdkLibData(sdkLibData);}});androidBuilder = new AndroidBuilder(project == project.getRootProject() ? project.getName() : project.getPath(),creator,new GradleProcessExecutor(project),new GradleJavaProcessExecutor(project),extraModelInfo,getLogger(),isVerbose());dataBindingBuilder = new DataBindingBuilder();dataBindingBuilder.setPrintMachineReadableOutput(extraModelInfo.getErrorFormatMode() ==ExtraModelInfo.ErrorFormatMode.MACHINE_PARSABLE);project.getPlugins().apply(JavaBasePlugin.class);jacocoPlugin = project.getPlugins().apply(JacocoPlugin.class);project.getTasks().getByName("assemble").setDescription("Assembles all variants of all applications and secondary packages.");// call back on execution. This is called after the whole build is done (not// after the current project is done).// This is will be called for each (android) projects though, so this should support// being called 2+ times.project.getGradle().addBuildListener(new BuildListener() {private final LibraryCache libraryCache = LibraryCache.getCache();@Overridepublic void buildStarted(Gradle gradle) { }@Overridepublic void settingsEvaluated(Settings settings) { }@Overridepublic void projectsLoaded(Gradle gradle) { }@Overridepublic void projectsEvaluated(Gradle gradle) { }@Overridepublic void buildFinished(BuildResult buildResult) {ExecutorSingleton.shutdown();sdkHandler.unload();ThreadRecorder.get().record(ExecutionType.BASE_PLUGIN_BUILD_FINISHED,project.getPath(), null, new Recorder.Block() {@Overridepublic Void call() throws Exception {PreDexCache.getCache().clear(new File(project.getRootProject().getBuildDir(),FD_INTERMEDIATES + "/dex-cache/cache.xml"),getLogger());JackConversionCache.getCache().clear(new File(project.getRootProject().getBuildDir(),FD_INTERMEDIATES + "/jack-cache/cache.xml"),getLogger());libraryCache.unload();Main.clearInternTables();return null;}});}});project.getGradle().getTaskGraph().addTaskExecutionGraphListener(new TaskExecutionGraphListener() {@Overridepublic void graphPopulated(TaskExecutionGraph taskGraph) {for (Task task : taskGraph.getAllTasks()) {if (task instanceof TransformTask) {Transform transform = ((TransformTask) task).getTransform();if (transform instanceof DexTransform) {PreDexCache.getCache().load(new File(project.getRootProject().getBuildDir(),FD_INTERMEDIATES + "/dex-cache/cache.xml"));break;} else if (transform instanceof JackPreDexTransform) {JackConversionCache.getCache().load(new File(project.getRootProject().getBuildDir(),FD_INTERMEDIATES + "/jack-cache/cache.xml"));break;}}}}});}private void createExtension() {final NamedDomainObjectContainer<BuildType> buildTypeContainer = project.container(BuildType.class,new BuildTypeFactory(instantiator, project, project.getLogger()));final NamedDomainObjectContainer<ProductFlavor> productFlavorContainer = project.container(ProductFlavor.class,new ProductFlavorFactory(instantiator, project, project.getLogger(), extraModelInfo));final NamedDomainObjectContainer<SigningConfig> signingConfigContainer = project.container(SigningConfig.class,new SigningConfigFactory(instantiator));extension = project.getExtensions().create("android", getExtensionClass(),project, instantiator, androidBuilder, sdkHandler,buildTypeContainer, productFlavorContainer, signingConfigContainer,extraModelInfo, isLibrary());// create the default mapping configuration.project.getConfigurations().create("default" + VariantDependencies.CONFIGURATION_MAPPING).setDescription("Configuration for default mapping artifacts.");project.getConfigurations().create("default" + VariantDependencies.CONFIGURATION_METADATA).setDescription("Metadata for the produced APKs.");dependencyManager = new DependencyManager(project,extraModelInfo,sdkHandler);ndkHandler = new NdkHandler(project.getRootDir(),null, /* compileSkdVersion, this will be set in afterEvaluate */"gcc","" /*toolchainVersion*/);taskManager = createTaskManager(project,androidBuilder,dataBindingBuilder,extension,sdkHandler,ndkHandler,dependencyManager,registry);variantFactory = createVariantFactory();variantManager = new VariantManager(project,androidBuilder,extension,variantFactory,taskManager,instantiator);// Register a builder for the custom tooling modelModelBuilder modelBuilder = new ModelBuilder(androidBuilder,variantManager,taskManager,extension,extraModelInfo,ndkHandler,new NativeLibraryFactoryImpl(ndkHandler),isLibrary(),AndroidProject.GENERATION_ORIGINAL);registry.register(modelBuilder);// Register a builder for the native tooling modelNativeModelBuilder nativeModelBuilder = new NativeModelBuilder(variantManager);registry.register(nativeModelBuilder);// map the whenObjectAdded callbacks on the containers.signingConfigContainer.whenObjectAdded(new Action<SigningConfig>() {@Overridepublic void execute(SigningConfig signingConfig) {variantManager.addSigningConfig(signingConfig);}});buildTypeContainer.whenObjectAdded(new Action<BuildType>() {@Overridepublic void execute(BuildType buildType) {SigningConfig signingConfig = signingConfigContainer.findByName(BuilderConstants.DEBUG);buildType.init(signingConfig);variantManager.addBuildType(buildType);}});productFlavorContainer.whenObjectAdded(new Action<ProductFlavor>() {@Overridepublic void execute(ProductFlavor productFlavor) {variantManager.addProductFlavor(productFlavor);}});// map whenObjectRemoved on the containers to throw an exception.signingConfigContainer.whenObjectRemoved(new UnsupportedAction("Removing signingConfigs is not supported."));buildTypeContainer.whenObjectRemoved(new UnsupportedAction("Removing build types is not supported."));productFlavorContainer.whenObjectRemoved(new UnsupportedAction("Removing product flavors is not supported."));// create default Objects, signingConfig first as its used by the BuildTypes.variantFactory.createDefaultComponents(buildTypeContainer, productFlavorContainer, signingConfigContainer);}private static class UnsupportedAction implements Action<Object> {private final String message;UnsupportedAction(String message) {this.message = message;}@Overridepublic void execute(Object o) {throw new UnsupportedOperationException(message);}}private void createTasks() {ThreadRecorder.get().record(ExecutionType.TASK_MANAGER_CREATE_TASKS,project.getPath(), null,new Recorder.Block<Void>() {@Overridepublic Void call() throws Exception {taskManager.createTasksBeforeEvaluate(new TaskContainerAdaptor(project.getTasks()));return null;}});project.afterEvaluate(project -> {ThreadRecorder.get().record(ExecutionType.BASE_PLUGIN_CREATE_ANDROID_TASKS,project.getPath(), null,new Recorder.Block<Void>() {@Overridepublic Void call() throws Exception {createAndroidTasks(false);return null;}});});}private void checkGradleVersion() {String currentVersion = project.getGradle().getGradleVersion();if (GRADLE_MIN_VERSION.compareTo(currentVersion) > 0) {File file = new File("gradle" + separator + "wrapper" + separator +"gradle-wrapper.properties");String errorMessage =String.format("Minimum supported Gradle version is %s. Current version is %s. "+ "If using the gradle wrapper, try editing the distributionUrl in %s "+ "to gradle-%s-all.zip",GRADLE_MIN_VERSION,currentVersion,file.getAbsolutePath(),GRADLE_MIN_VERSION);if (AndroidGradleOptions.overrideGradleVersionCheck(project)) {getLogger().warning(errorMessage);getLogger().warning("As %s is set, continuing anyways.",AndroidGradleOptions.GRADLE_VERSION_CHECK_OVERRIDE_PROPERTY);} else {extraModelInfo.handleSyncError(GRADLE_MIN_VERSION.toString(), SyncIssue.TYPE_GRADLE_TOO_OLD, errorMessage);}}}@VisibleForTestingfinal void createAndroidTasks(boolean force) {// Make sure unit tests set the required fields.checkState(extension.getBuildToolsRevision() != null,"buildToolsVersion is not specified.");checkState(extension.getCompileSdkVersion() != null, "compileSdkVersion is not specified.");ndkHandler.setCompileSdkVersion(extension.getCompileSdkVersion());// get current plugins and look for the default Java plugin.if (project.getPlugins().hasPlugin(JavaPlugin.class)) {throw new BadPluginException("The 'java' plugin has been applied, but it is not compatible with the Android plugins.");}ensureTargetSetup();// don't do anything if the project was not initialized.// Unless TEST_SDK_DIR is set in which case this is unit tests and we don't return.// This is because project don't get evaluated in the unit test setup.// See AppPluginDslTestif (!force&& (!project.getState().getExecuted() || project.getState().getFailure() != null)&& SdkHandler.sTestSdkFolder == null) {return;}if (hasCreatedTasks) {return;}hasCreatedTasks = true;extension.disableWrite();ProcessRecorder.getProject(project.getPath()).setBuildToolsVersion(extension.getBuildToolsRevision().toString());// setup SDK repositories.sdkHandler.addLocalRepositories(project);taskManager.addDataBindingDependenciesIfNecessary(extension.getDataBinding());ThreadRecorder.get().record(ExecutionType.VARIANT_MANAGER_CREATE_ANDROID_TASKS,project.getPath(), null,new Recorder.Block<Void>() {@Overridepublic Void call() throws Exception {variantManager.createAndroidTasks();ApiObjectFactory apiObjectFactory = new ApiObjectFactory(androidBuilder, extension, variantFactory, instantiator);for (BaseVariantData variantData : variantManager.getVariantDataList()) {apiObjectFactory.create(variantData);}return null;}});// Create and read external native build JSON files depending on what's happening right// now.//// CREATE PHASE:// Creates JSONs by shelling out to external build system when:// - Any one of AndroidProject.PROPERTY_INVOKED_FROM_IDE,// AndroidProject.PROPERTY_BUILD_MODEL_ONLY_ADVANCED,// AndroidProject.PROPERTY_BUILD_MODEL_ONLY,// AndroidProject.PROPERTY_REFRESH_EXTERNAL_NATIVE_MODEL are set.// - *and* AndroidProject.PROPERTY_REFRESH_EXTERNAL_NATIVE_MODEL is set// or JSON files don't exist or are out-of-date.// Create phase may cause ProcessException (from cmake.exe for example)//// READ PHASE:// Reads and deserializes JSONs when:// - Any one of AndroidProject.PROPERTY_INVOKED_FROM_IDE,// AndroidProject.PROPERTY_BUILD_MODEL_ONLY_ADVANCED,// AndroidProject.PROPERTY_BUILD_MODEL_ONLY,// AndroidProject.PROPERTY_REFRESH_EXTERNAL_NATIVE_MODEL are set.// Read phase may produce IOException if the file can't be read for standard IO reasons.// Read phase may produce JsonSyntaxException in the case that the content of the file is// corrupt.boolean forceRegeneration = AndroidGradleOptions.refreshExternalNativeModel(project);if (ExternalNativeBuildTaskUtils.shouldRegenerateOutOfDateJsons(project)) {ThreadRecorder.get().record(ExecutionType.VARIANT_MANAGER_EXTERNAL_NATIVE_CONFIG_VALUES,project.getPath(), null,new Recorder.Block<Void>() {@Overridepublic Void call() throws Exception {for (BaseVariantData variantData : variantManager.getVariantDataList()) {ExternalNativeJsonGenerator generator =variantData.getScope().getExternalNativeJsonGenerator();if (generator != null) {// This will generate any out-of-date or non-existent JSONs.// When refreshExternalNativeModel() is true it will also// force update all JSONs.generator.build(forceRegeneration);variantData.getScope().addExternalNativeBuildConfigValues(generator.readExistingNativeBuildConfigurations());}}return null;}});}}private boolean isVerbose() {return project.getLogger().isEnabled(LogLevel.INFO);}private void ensureTargetSetup() {// check if the target has been set.TargetInfo targetInfo = androidBuilder.getTargetInfo();if (targetInfo == null) {if (extension.getCompileOptions() == null) {throw new GradleException("Calling getBootClasspath before compileSdkVersion");}sdkHandler.initTarget(extension.getCompileSdkVersion(),extension.getBuildToolsRevision(),extension.getLibraryRequests(),androidBuilder,SdkHandler.useCachedSdk(project));}}/*** Check the sub-projects structure :* So far, checks that 2 modules do not have the same identification (group+name).*/private void checkModulesForErrors() {Project rootProject = project.getRootProject();Map<String, Project> subProjectsById = new HashMap<String, Project>();for (Project subProject : rootProject.getAllprojects()) {String id = subProject.getGroup().toString() + ":" + subProject.getName();if (subProjectsById.containsKey(id)) {String message = String.format("Your project contains 2 or more modules with the same " +"identification %1$s\n" +"at \"%2$s\" and \"%3$s\".\n" +"You must use different identification (either name or group) for " +"each modules.",id,subProjectsById.get(id).getPath(),subProject.getPath() );throw new StopExecutionException(message);} else {subProjectsById.put(id, subProject);}}}/*** Verify the plugin version. If a newer version of gradle-experimental plugin is applied, then* builder.jar module will be resolved to a different version than the one this gradle plugin is* compiled with. Throw an error and suggest to update this plugin.*/private static void checkPluginVersion() {String actualGradlePluginVersion = Version.getAndroidGradlePluginVersion();if(!actualGradlePluginVersion.equals(com.android.build.gradle.internal.Version.ANDROID_GRADLE_PLUGIN_VERSION)) {throw new UnsupportedVersionException(String.format("Plugin version mismatch. "+ "'com.android.tools.build:gradle-experimental:%s' was applied, and it "+ "requires 'com.android.tools.build:gradle:%s'. Current version is '%s'. "+ "Please update to version '%s'.",Version .getAndroidGradleComponentPluginVersion(),Version .getAndroidGradlePluginVersion(),com.android.build.gradle.internal.Version.ANDROID_GRADLE_PLUGIN_VERSION,Version .getAndroidGradlePluginVersion()));}}private void checkPathForErrors() {// See if we're on Windows:if (!System.getProperty("os.name").toLowerCase(Locale.US).contains("windows")) {return;}// See if the user disabled the check:if (AndroidGradleOptions.overridePathCheck(project)) {return;}// See if the path contains non-ASCII characters.if (CharMatcher.ASCII.matchesAllOf(project.getRootDir().getAbsolutePath())) {return;}String message ="Your project path contains non-ASCII characters. This will most likely "+ "cause the build to fail on Windows. Please move your project to a different "+ "directory. See http://b.android.com/95744 for details. "+ "This warning can be disabled by adding the line '"+ AndroidGradleOptions.OVERRIDE_PATH_CHECK_PROPERTY+ "=true' to gradle.properties file in the project directory.";throw new StopExecutionException(message);}@NonNull@Overridepublic ToolingModelBuilderRegistry getModelBuilderRegistry() {return registry;}private static SettingsController getSettingsController() {return new SettingsController() {@Overridepublic boolean getForceHttp() {return false;}@Overridepublic void setForceHttp(boolean force) {// Default, doesn't allow to set force HTTP.}@Nullable@Overridepublic Channel getChannel() {return Channel.DEFAULT;}};}private static Downloader getDownloader() {return new LocalFileAwareDownloader(new LegacyDownloader(FileOpUtils.create()));} }

LibraryExtension類代碼:

package com.android.build.gradle;import com.android.annotations.NonNull; import com.android.build.gradle.api.BaseVariant; import com.android.build.gradle.api.LibraryVariant; import com.android.build.gradle.internal.ExtraModelInfo; import com.android.build.gradle.internal.LoggingUtil; import com.android.build.gradle.internal.SdkHandler; import com.android.build.gradle.internal.dsl.BuildType; import com.android.build.gradle.internal.dsl.ProductFlavor; import com.android.build.gradle.internal.dsl.SigningConfig; import com.android.builder.core.AndroidBuilder; import com.google.common.collect.Lists;import org.gradle.api.GradleException; import org.gradle.api.NamedDomainObjectContainer; import org.gradle.api.internal.DefaultDomainObjectSet; import org.gradle.api.internal.project.ProjectInternal; import org.gradle.internal.reflect.Instantiator;import java.util.Collection; import java.util.Collections;/*** {@code android} extension for {@code com.android.library} projects.*/ public class LibraryExtension extends TestedExtension {private final DefaultDomainObjectSet<LibraryVariant> libraryVariantList= new DefaultDomainObjectSet<LibraryVariant>(LibraryVariant.class);private boolean packageBuildConfig = true;private Collection<String> aidlPackageWhiteList = null;public LibraryExtension(@NonNull ProjectInternal project, @NonNull Instantiator instantiator,@NonNull AndroidBuilder androidBuilder, @NonNull SdkHandler sdkHandler,@NonNull NamedDomainObjectContainer<BuildType> buildTypes,@NonNull NamedDomainObjectContainer<ProductFlavor> productFlavors,@NonNull NamedDomainObjectContainer<SigningConfig> signingConfigs,@NonNull ExtraModelInfo extraModelInfo, boolean isLibrary) {super(project, instantiator, androidBuilder, sdkHandler, buildTypes, productFlavors,signingConfigs, extraModelInfo, isLibrary);}/*** Returns the list of library variants. Since the collections is built after evaluation, it* should be used with Gradle's <code>all</code> iterator to process future items.*/public DefaultDomainObjectSet<LibraryVariant> getLibraryVariants() {return libraryVariantList;}@Overridepublic void addVariant(BaseVariant variant) {libraryVariantList.add((LibraryVariant) variant);}public void packageBuildConfig(boolean value) {if (!value) {LoggingUtil.displayDeprecationWarning(logger, project,"Support for not packaging BuildConfig is deprecated.");}packageBuildConfig = value;}@Deprecatedpublic void setPackageBuildConfig(boolean value) {// Remove when users stop requiring this setting.packageBuildConfig(value);}@Overridepublic Boolean getPackageBuildConfig() {return packageBuildConfig;}public void aidlPackageWhiteList(String ... aidlFqcns) {if (aidlPackageWhiteList == null) {aidlPackageWhiteList = Lists.newArrayList();}Collections.addAll(aidlPackageWhiteList, aidlFqcns);}public void setAidlPackageWhiteList(Collection<String> aidlPackageWhiteList) {this.aidlPackageWhiteList = Lists.newArrayList(aidlPackageWhiteList);}@Overridepublic Collection<String> getAidlPackageWhiteList() {return aidlPackageWhiteList;} }

LibraryPlugin代碼:

/** Copyright (C) 2012 The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/ package com.android.build.gradle;import com.android.annotations.NonNull; import com.android.build.gradle.internal.DependencyManager; import com.android.build.gradle.internal.LibraryTaskManager; import com.android.build.gradle.internal.SdkHandler; import com.android.build.gradle.internal.TaskManager; import com.android.build.gradle.internal.ndk.NdkHandler; import com.android.build.gradle.internal.variant.LibraryVariantFactory; import com.android.build.gradle.internal.variant.VariantFactory; import com.android.builder.core.AndroidBuilder;import org.gradle.api.Plugin; import org.gradle.api.Project; import org.gradle.internal.reflect.Instantiator; import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry;import android.databinding.tool.DataBindingBuilder;import javax.inject.Inject;/*** Gradle plugin class for 'library' projects.*/ public class LibraryPlugin extends BasePlugin implements Plugin<Project> {@Injectpublic LibraryPlugin(Instantiator instantiator, ToolingModelBuilderRegistry registry) {super(instantiator, registry);}@Overridepublic Class<? extends BaseExtension> getExtensionClass() {return LibraryExtension.class;}@Overrideprotected VariantFactory createVariantFactory() {return new LibraryVariantFactory(instantiator, androidBuilder, extension);}@Overrideprotected boolean isLibrary() {return true;}@Overrideprotected TaskManager createTaskManager(@NonNull Project project,@NonNull AndroidBuilder androidBuilder,@NonNull DataBindingBuilder dataBindingBuilder,@NonNull AndroidConfig extension,@NonNull SdkHandler sdkHandler,@NonNull NdkHandler ndkHandler,@NonNull DependencyManager dependencyManager,@NonNull ToolingModelBuilderRegistry toolingRegistry) {return new LibraryTaskManager(project,androidBuilder,dataBindingBuilder,extension,sdkHandler,ndkHandler,dependencyManager,toolingRegistry);}@Overridepublic void apply(@NonNull Project project) {super.apply(project);// Default assemble task for the default-published artifact.// This is needed for the prepare task on the consuming project.project.getTasks().create("assembleDefault");} }




總結

以上是生活随笔為你收集整理的Gradle 工具的源码研究的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

久久香蕉电影网 | 在线日韩一区 | 免费婷婷| 麻豆视传媒官网免费观看 | 婷婷激情小说网 | 91原创在线观看 | 日韩久久久久久久久久 | zzijzzij日本成熟少妇 | 中文字幕欧美日韩va免费视频 | 91九色蝌蚪视频在线 | 天天操天天操天天操天天操天天操 | 久久午夜色播影院免费高清 | 成人免费在线电影 | 中国一级特黄毛片大片久久 | 久久夜视频 | 黄色亚洲精品 | 五月天婷亚洲天综合网精品偷 | av资源在线观看 | 在线观看中文字幕视频 | 日韩在线免费高清视频 | 手机看片午夜 | 日本久久91 | 久久精品一区 | 热久久免费视频 | 一级黄视频 | 欧美日韩国产综合一区二区 | 欧美亚洲国产日韩 | 久久免费电影网 | 婷婷六月在线 | 国色天香在线观看 | 国产日韩欧美在线 | 成人黄色av网站 | 97av在线视频免费播放 | 在线亚洲播放 | 中文字幕在线字幕中文 | 久久av中文字幕片 | 91精品国产一区二区在线观看 | 欧美国产日韩一区二区 | 久久精品国产精品亚洲 | 国产剧情一区二区 | 日批在线观看 | 亚洲精品国偷拍自产在线观看蜜桃 | 天天干天天干天天射 | 韩国精品在线观看 | 国产精品网在线观看 | 午夜12点 | 亚洲午夜精品一区二区三区电影院 | av中文在线播放 | 国产麻豆精品传媒av国产下载 | 日本精品一区二区三区在线播放视频 | 丁香视频全集免费观看 | 日韩成人免费在线 | 国产成人精品综合久久久 | 337p日本大胆噜噜噜噜 | 亚洲欧美视频在线观看 | 欧美成人区 | 国产精品视频久久久 | 97精品国产97久久久久久春色 | www狠狠| 伊人色综合网 | 99久久精品无码一区二区毛片 | 在线免费观看av网站 | 国产一级电影网 | 国产精品入口麻豆www | 久久精品爱爱视频 | 久久一区国产 | 99久久99久久精品免费 | 中文字幕在线观看网站 | 欧美日韩aa | 九九热视频在线 | 国际精品久久久 | 日韩一区二区在线免费观看 | 色黄久久久久久 | 色婷婷啪啪免费在线电影观看 | 黄色一级动作片 | 久久午夜精品视频 | 国产一区二区在线观看免费 | 国产免费av一区二区三区 | 国产中的精品av小宝探花 | 中文字幕日本特黄aa毛片 | 超碰免费成人 | 亚洲精品国久久99热 | 亚洲午夜久久久久久久久 | 午夜久久久精品 | 激情av一区二区 | 天天操天天干天天综合网 | www.com在线观看 | 天天摸天天操天天舔 | 综合激情婷婷 | 99久久精品日本一区二区免费 | 亚洲精品高清视频在线观看 | 中文字幕日韩电影 | 亚洲尺码电影av久久 | 久久影视一区 | 国产中文在线观看 | 久久天堂影院 | 久草在线观看资源 | 中文字幕在线免费观看 | 成人av电影网址 | 香蕉视频国产在线观看 | 久久高清国产 | 国产污视频在线观看 | 国产精品久久久久久欧美 | 欧美亚洲一区二区在线 | 亚洲mv大片欧洲mv大片免费 | 欧美激情视频一二三区 | 视频91在线 | 精品视频在线播放 | 黄色成人av | 一 级 黄 色 片免费看的 | 久久欧美综合 | 三级视频片| 国产精品手机看片 | 国产一二三区在线观看 | 精品伊人久久久 | 国产高清不卡 | 91热视频在线观看 | 欧美亚洲三级 | 91桃色在线播放 | 亚洲国产伊人 | 国产一区久久 | 丰满少妇高潮在线观看 | 国产精品免费在线视频 | 一级免费黄视频 | 激情图片区| 在线视频一区观看 | 免费在线观看视频a | 福利一区二区 | 欧美精品黑人性xxxx | 热re99久久精品国产66热 | 亚洲精品在线二区 | 天天操夜夜操夜夜操 | 亚洲丝袜一区二区 | 外国av网 | 成年人免费电影在线观看 | 日韩欧美精品一区二区 | 91看片在线 | 天天爱天天操天天干 | 国产手机视频在线 | 国产成人av综合色 | 国产 视频 高清 免费 | 久久亚洲热| 免费精品视频在线 | 久久人操| 日本精品一区二区三区在线播放视频 | 在线看黄色的网站 | 亚洲一区二区三区在线看 | 色国产精品| 欧美一区二区三区特黄 | 国产精品专区在线观看 | 色91在线视频 | 久久中文欧美 | 二区精品视频 | 久久久性 | 91综合久久一区二区 | 中文字幕中文 | 久久草在线视频国产 | 搡bbbb搡bbb视频 | av三级在线播放 | 久久久亚洲国产精品麻豆综合天堂 | 久草视频免费观 | 久久伦理网 | 欧美日韩在线播放一区 | 91视频这里只有精品 | 免费国产ww| 久久精品国产免费 | 91porny九色在线播放 | 中文字幕 婷婷 | 在线精品一区二区 | 欧美视频不卡 | 天天射天天射 | 久久a v电影| www.久艹| 日韩专区视频 | 国产精品久久久久久久久毛片 | 狠狠躁日日躁狂躁夜夜躁av | 婷婷丁香视频 | 日日操天天爽 | 狠狠色伊人亚洲综合网站色 | 亚洲精品在线电影 | 最新日韩在线观看 | 丝袜美腿一区 | 天天艹天天爽 | 精品国产一区二区三区免费 | 蜜臀av性久久久久蜜臀aⅴ四虎 | 中文字幕在线乱 | 日韩视频中文字幕在线观看 | 久久精国产 | 美女天天操 | 色综合天天狠天天透天天伊人 | 亚洲va欧洲va国产va不卡 | 久久天天躁狠狠躁亚洲综合公司 | 白丝av在线 | 国产精品久久久久毛片大屁完整版 | 最新日韩精品 | 欧美日韩视频在线一区 | 97色免费视频 | 中文字幕日韩电影 | 国产在线观看你懂得 | 国产三级在线播放 | 美州a亚洲一视本频v色道 | 天堂在线视频免费观看 | 久久久久9999亚洲精品 | 免费成人黄色av | 久久久久久久久久久久久9999 | 日韩av播放在线 | 亚洲国产视频在线 | 国产在线高清视频 | 西西www4444大胆在线 | 三级av免费观看 | 在线免费观看视频a | 色狠狠综合 | 免费看黄的视频 | 香蕉精品视频在线观看 | 国产白浆在线观看 | 欧美孕妇视频 | 亚洲区精品 | 超碰在线98 | 91精品爽啪蜜夜国产在线播放 | 国产日韩精品一区二区在线观看播放 | av福利在线看 | 色婷婷激情五月 | 在线国产片| 97在线免费 | 青青看片 | 国产视频手机在线 | 九九综合九九综合 | 成人一级片免费看 | 深夜视频久久 | 国产一区二区不卡视频 | 在线日韩精品视频 | 日韩av片无码一区二区不卡电影 | 在线观看av网 | 久久老司机精品视频 | 午夜视频在线观看网站 | 中文字幕中文字幕在线一区 | 夜夜操夜夜干 | 欧美一区二区三区在线观看 | 欧美视频网址 | 欧美激情精品久久久久 | 日韩精品久久久久久中文字幕8 | 久久精品网站视频 | 国产福利久久 | 久久 国产一区 | 久久久免费精品国产一区二区 | 国产精品 久久 | www国产精品com| 久久dvd| 一区精品久久 | 夜夜操天天 | 91视频午夜 | 中文字幕亚洲欧美日韩2019 | 久久视了 | 国产激情电影综合在线看 | 国产视频精品久久 | 色www.| 91亚洲网站 | 国产成人av福利 | 91黄色小视频 | 中文欧美字幕免费 | 久久草网站 | 色多多视频在线 | 日韩综合一区二区三区 | 久久66热这里只有精品 | 青草草在线 | 久草在线视频资源 | 98超碰人人 | 亚洲激情在线观看 | 丁香六月在线观看 | 久久久久欠精品国产毛片国产毛生 | 国产一卡二卡在线 | 4438全国亚洲精品在线观看视频 | 亚洲综合在线视频 | 亚洲欧洲久久久 | 韩国av永久免费 | 久久久久久在线观看 | 又黄又刺激 | 久久在视频| 少妇搡bbbb搡bbb搡忠贞 | 欧美性色综合 | 色综合久久88色综合天天人守婷 | 精品麻豆 | 夜色成人网| 女女av在线 | 99久久综合精品五月天 | 四川妇女搡bbbb搡bbbb搡 | 国产精品va在线观看入 | 国产精品99蜜臀久久不卡二区 | 99精品在这里 | 成人资源在线 | 亚洲永久精品视频 | 97精品国自产拍在线观看 | av电影 一区二区 | 国产美女主播精品一区二区三区 | 欧美日韩一级视频 | 日韩在线观看一区二区 | 亚洲国产精品一区二区久久,亚洲午夜 | 久草视频看看 | 久久一级片 | 国产在线观看午夜 | www久久久久| 欧美日韩国产亚洲乱码字幕 | 国内精品久久久久国产 | 丝袜美女视频网站 | 伊人伊成久久人综合网小说 | 国产亚洲综合性久久久影院 | 天天综合日 | 五月综合色婷婷 | 天天干夜夜操视频 | 国产中文伊人 | 亚洲精品视频在线 | 成人午夜网址 | 狠狠操91 | 国产看片 色 | 色噜噜在线观看 | 亚洲欧美日韩不卡 | 91香蕉视频 mp4 | 久久久受www免费人成 | 波多野结衣视频一区二区三区 | 狠狠狠的干 | 亚洲欧美久久 | 黄色免费看片网站 | 在线色网站 | 日本三级不卡视频 | 激情黄色一级片 | 精品二区视频 | 亚洲综合在线观看视频 | 久久三级毛片 | 久久免费看av | 97人人澡人人爽人人模亚洲 | 精品在线亚洲视频 | 婷婷婷国产在线视频 | 日韩av免费大片 | 亚洲免费a | 欧美精品久久久久久久 | 国产又粗又猛又黄又爽的视频 | 又污又黄的网站 | 国内精品久久久久影院日本资源 | 国产精品欧美久久久久天天影视 | 五月婷婷视频在线观看 | 97人人网 | 999久久| 久久免费视频在线 | 福利一区在线 | 91视频在线观看免费 | 日韩高清在线观看 | 日韩在线 | 亚洲v精品 | 女人高潮一级片 | 国内精品久久久久久久久久 | 91精品国产91久久久久 | 97成人精品视频在线观看 | 在线最新av| 中文在线www | 爱色av.com| 99久久精品国产系列 | 色天天| 97超碰网| 国产在线观看国语版免费 | 久久视频国产精品免费视频在线 | 国产精品久久久久9999吃药 | 亚洲精品一区二区三区在线观看 | 天天操天天干天天操天天干 | 九九在线视频 | 麻豆综合网 | 精品三级av| 99国内精品 | 99精品视频在线观看免费 | 绯色av一区 | 99高清视频有精品视频 | 中文字幕一区二区三区在线播放 | 91九色免费视频 | 狠狠狠色狠狠色综合 | 亚洲国产精品推荐 | 国产精品手机播放 | 久久精品视频网 | 精品一区二区在线看 | 国产字幕在线观看 | 久久理论视频 | 一区二区三区四区五区在线视频 | 精品特级毛片 | 天天操操操操操 | 激情伊人五月天久久综合 | 天天爽天天爽天天爽 | 91免费观看视频网站 | 国产精品黄色在线观看 | 91久久精品一区二区三区 | 日韩激情中文字幕 | 西西444www | 日本中文字幕在线电影 | 欧美日韩性视频在线 | 国产成人一级电影 | 精品视频免费看 | av在线免费播放 | 久久久久这里只有精品 | 成年人国产视频 | 狠狠狠狠干 | 中文字幕无吗 | 91av在线免费播放 | 欧美一区二区三区不卡 | 九九视频在线观看视频6 | 天天色天天爱天天射综合 | 国内精品视频一区二区三区八戒 | 白丝av免费观看 | 麻豆91在线看 | 在线电影91 | 91精品久久久久久综合五月天 | 亚洲精品综合欧美二区变态 | 91激情在线视频 | 国内成人精品视频 | 久久免费国产视频 | 在线免费观看羞羞视频 | 色网站在线 | 久久伊人婷婷 | 欧美孕交vivoestv另类 | 天天曰天天爽 | 久久婷婷色 | 国产69熟| 最近久乱中文字幕 | 美女黄视频免费 | 97av在线视频免费播放 | 久久成人国产精品 | 人人爽人人爽人人片 | 亚洲精品www.| 国产高清区 | 亚洲资源 | 国产精品久久久久久999 | 奇米影视8888在线观看大全免费 | 成人免费视频网站 | japanesefreesex中国少妇 | 国产精品女人久久久 | 天天爱天天射天天干天天 | 色综合五月天 | 久久精品99视频 | 国产免费不卡 | 黄色网在线播放 | 成人午夜电影免费在线观看 | 亚洲第一区在线观看 | 人人澡av | 日韩av电影手机在线观看 | 草久久久久 | 色99网| 精品国产成人在线影院 | 一区二区精品在线视频 | 7777精品伊人久久久大香线蕉 | 日韩午夜电影 | 久久y| 黄av资源 | 久久国产手机看片 | www免费网站在线观看 | 久草在线视频精品 | 不卡国产在线 | 操一草| 午夜视频日本 | 免费黄a | 欧美男男激情videos | 日韩在线视频看看 | 在线欧美小视频 | 五月天com | 91在线看网站| 亚洲永久精品在线 | 国产亚洲人成网站在线观看 | 在线看日韩av | 色综合久久久 | 欧美午夜精品久久久久久孕妇 | 久久精品99北条麻妃 | 黄色91在线 | 99视频在线看 | 亚洲三级视频 | 黄色在线视频网址 | 人人爱人人做人人爽 | 成人小电影在线看 | 麻豆系列在线观看 | 日韩欧美一区二区在线 | 天天爽天天搞 | 久久国产精品一区二区三区四区 | 99久久综合国产精品二区 | 国产成人一区二区三区在线观看 | 亚洲国产精品一区二区久久hs | 欧美日韩视频网站 | 国产一区二区影院 | 欧美精品亚州精品 | 久久午夜精品影院一区 | av久久在线| 日本视频精品 | 国产亚洲欧美精品久久久久久 | 99精品视频在线观看免费 | 伊人五月天 | 亚洲一级片在线观看 | 综合在线亚洲 | 综合精品久久 | 日韩网站视频 | 色综合久久综合网 | 麻豆视频在线免费 | 日韩在线| 97视频在线观看网址 | 伊人五月综合 | av大片免费 | 日韩精品一区二区三区三炮视频 | 在线只有精品 | 亚洲人人av| 成年人免费观看在线视频 | 久久久久婷 | 欧美极品xxx | 亚洲精品人人 | 开心激情婷婷 | 久久精品99国产 | 青青久草在线视频 | 黄色91免费观看 | 久久久久久久综合色一本 | 日韩在线电影一区 | 国产精品久久久久久久婷婷 | 国产一区视频免费在线观看 | 99色精品视频 | 国产精品黄色在线观看 | 午夜精品99久久免费 | 日韩天天综合 | 亚洲国产欧洲综合997久久, | 九九久久久久99精品 | 999久久久免费精品国产 | 一区二三国产 | 免费h在线观看 | 在线不卡a | 91在线操| 久久影院午夜论 | 成人福利av | 日韩精品不卡在线 | 亚洲国产精品资源 | 97超碰在线资源 | 久久人网 | 国产高清在线免费视频 | 精品在线观看免费 | 欧美日本中文字幕 | 久草视频在线免费播放 | 婷婷色吧| 欧美日韩高清国产 | 日韩精品影视 | 青青视频一区 | 97福利视频| 久久国产成人午夜av影院潦草 | av丝袜在线 | 97在线观看免费视频 | 日韩网站一区 | 国产区av在线 | 中日韩在线 | 亚洲高清在线精品 | 91探花在线视频 | 国产无套精品久久久久久 | 国产在线高清精品 | 亚洲最大av在线播放 | 91九色视频 | 精品欧美一区二区在线观看 | 成人91av | 国内精品免费 | 一级黄色a视频 | 91精品入口 | 久草在线欧美 | 精品中文字幕视频 | 深夜成人av| 国产大片免费久久 | 日日爽夜夜操 | 国产精品一区二区av日韩在线 | 国产成人亚洲在线观看 | 夜夜干夜夜 | 亚洲精品a区 | 最近中文字幕免费 | 成年人视频在线免费观看 | 国产精品视频线看 | 国产精品免费小视频 | 看黄色91 | 国产精品永久在线 | 99爱这里只有精品 | www婷婷| 99精品视频精品精品视频 | 国产99在线播放 | 欧美性成人 | 亚洲激色| 国产第一福利 | 日本久久综合视频 | 狠狠色丁香婷综合久久 | 九色精品免费永久在线 | 国产成人a v电影 | 日本视频精品 | 激情视频国产 | 国产一区在线精品 | 在线观看免费黄视频 | 成人小电影在线看 | 久久五月天综合 | 97福利视频| 特级西西444www大精品视频免费看 | 日韩在线小视频 | 久久老司机精品视频 | 亚洲国产免费网站 | 久久久人人人 | 毛片永久新网址首页 | 天天干人人插 | 精品国产99国产精品 | 日韩一区二区三区免费视频 | 最新的av网站 | 成人av中文字幕 | 四虎国产精品免费观看视频优播 | 夜夜操天天 | 99久久婷婷国产综合亚洲 | 免费网址你懂的 | 伊人影院av | 国产免费又爽又刺激在线观看 | 天天操天天谢 | 国产精品久久久久久模特 | 日韩av三区 | av高清一区 | 一区二区精品在线 | 亚洲一级电影在线观看 | 成人精品一区二区三区中文字幕 | 久久电影中文字幕视频 | 国产一级a毛片视频爆浆 | 天天草网站 | 人人插人人爱 | 狠狠色丁香久久婷婷综合_中 | 国产精品一区一区三区 | 在线视频精品 | 国产精品久久久区三区天天噜 | 日韩一区二区三区在线观看 | 成人全视频免费观看在线看 | free. 性欧美.com | 夜夜操网 | 久久精品视频4 | 成年人在线免费视频观看 | 中文不卡视频 | 国产美女主播精品一区二区三区 | 天天看天天干天天操 | 99久久婷婷国产综合精品 | 精品国产中文字幕 | 色播五月婷婷 | 一区二区视频网站 | 在线免费观看av网站 | 婷婷资源站| 中文字幕日韩精品有码视频 | 久久九九九九 | 日韩中文在线视频 | 国产剧情在线一区 | 国产在线免费观看 | 激情av网址 | 99中文字幕| 在线看v片 | 国产在线播放观看 | 激情av在线资源 | 精品免费视频 | 国产一级免费视频 | 91亚洲综合 | 久久国产精品99久久人人澡 | 又黄又爽的免费高潮视频 | 乱男乱女www7788 | 丁香婷婷色月天 | 久久夜靖品 | 在线免费国产 | 天天干人人插 | 成年人免费av网站 | 中文字幕一区av | 狠狠色丁香婷婷综合基地 | 国产精品久久久久久久久久久不卡 | 国产精品美女久久久久久久久 | 精品黄色在线观看 | 天天操综合网站 | 国产精品美女免费看 | 久草在线免 | 亚洲一区二区天堂 | 久久影院精品 | 波多野结衣精品在线 | 九九天堂| 91亚洲精品国偷拍 | 色网av| 久久久这里有精品 | 久热色超碰 | 中文字幕一区av | 永久免费的av电影 | 久久a v视频| www.色的| 久久久人 | 天天干天天色2020 | 免费观看成人av | 波多野结衣在线播放视频 | 国产精品一区二区美女视频免费看 | 婷婷婷国产在线视频 | 91人人爽人人爽人人精88v | 日日夜夜av| 丁香视频全集免费观看 | 国产原厂视频在线观看 | 久久久久网站 | 中文字幕在线国产精品 | 色爱成人网 | 欧美最爽乱淫视频播放 | 国产在线一线 | 99久久精品国产一区二区三区 | 日韩视频一 | 午夜av一区 | 久久亚洲影视 | 天天色天天草天天射 | 国内精品视频在线播放 | 麻豆av电影 | 国产精品国内免费一区二区三区 | 狠狠干天天射 | 91手机视频在线 | 成人在线小视频 | 97精品视频在线播放 | 视频二区在线视频 | 天天操夜夜操国产精品 | 欧美激情综合五月色丁香小说 | 国内小视频 | 999在线视频 | 日韩剧情 | 成人免费色 | 人人干人人草 | 在线看片中文字幕 | 中文字幕有码在线 | 日韩电影一区二区在线观看 | 欧美,日韩| 亚洲一区二区三区91 | 日本激情中文字幕 | av免费观看在线 | 中文字幕欲求不满 | 日韩精品在线观看av | 亚洲精品国产第一综合99久久 | 成人国产一区二区 | 久草免费在线 | 欧日韩在线视频 | 国产男女无遮挡猛进猛出在线观看 | 97人人人人 | 久久夜色精品国产欧美一区麻豆 | 午夜色大片在线观看 | 成人久久国产 | 日韩理论视频 | 成人免费在线看片 | 精品国产一区二区在线 | 日韩一二区在线观看 | 黄色在线看网站 | 国产成人精品网站 | 欧美日韩二区在线 | 激情婷婷在线观看 | 日韩精品欧美精品 | 久久精品久久精品久久 | 亚洲一区欧美精品 | 激情视频在线观看网址 | 日韩欧美区 | 亚洲国产午夜视频 | 成人免费看电影 | 日日弄天天弄美女bbbb | 日本中文乱码卡一卡二新区 | 亚洲激情 在线 | 久久草在线视频国产 | 午夜视频一区二区三区 | 成人午夜电影在线 | 在线观看国产一区 | 91桃色在线播放 | av网站免费线看精品 | 97视频免费在线看 | 日韩成人精品一区二区三区 | 在线一二三四区 | 国产成人av在线影院 | a视频免费| 免费久久网站 | av黄色在线| 亚洲视频 一区 | 成+人+色综合 | 制服丝袜在线91 | 黄网站色成年免费观看 | 久久av影院| 干干日日 | 波多在线视频 | 欧美日韩中文另类 | 亚洲视频免费在线 | 中文字幕av最新 | 婷婷色在线观看 | 91一区啪爱嗯打偷拍欧美 | 国产免费美女 | 国产又黄又硬又爽 | 婷婷视频在线播放 | 中文字幕网站视频在线 | 免费在线一区二区三区 | 久草com | 在线观看的a站 | 精品久久久久久久久中文字幕 | 中文字幕一区二区三区乱码在线 | 欧美日比视频 | 友田真希av| 亚洲最新视频在线播放 | 99中文字幕在线观看 | 亚洲成人资源在线观看 | 免费高清在线视频一区· | 国产精品一区二区三区在线播放 | 99久久er热在这里只有精品15 | 毛片一区二区 | 综合激情婷婷 | 亚洲一区精品二人人爽久久 | 日韩v欧美v日本v亚洲v国产v | 亚洲桃花综合 | 日日爱网站 | 西西44人体做爰大胆视频 | 日韩欧美精品一区 | 久草视频资源 | 激情五月五月婷婷 | 免费开视频 | 精品欧美一区二区精品久久 | 日韩av线观看 | 草久久av| 97精品国自产拍在线观看 | 久久美女电影 | 国产区精品视频 | 国内精品久久久久久久影视简单 | 久久精品a | 国产91欧美 | 在线观看日本韩国电影 | 欧美一级特黄aaaaaa大片在线观看 | 99热在线网站 | 91精品啪在线观看国产 | 91成年人视频 | 久久久在线免费观看 | 国产亚洲精品久久久久久无几年桃 | 欧美一区二区三区不卡 | 正在播放一区二区 | 狠狠色丁香久久综合网 | 欧美成人h版电影 | 岛国av在线 | 国内精品久久久久影院男同志 | 久久久久亚洲精品成人网小说 | 久久av不卡| 成人在线观看资源 | 色成人亚洲 | 欧美高清视频不卡网 | 亚洲午夜精 | 欧美精品久久久久a | 欧美少妇的秘密 | 久久久久久精 | 天天碰天天操 | 亚洲天堂色婷婷 | 日韩精品在线视频免费观看 | 久久国产精品第一页 | 99久久精品免费看国产四区 | 国产69精品久久app免费版 | 国产精品视频你懂的 | 久久国产免费 | a午夜在线| 国产一区在线视频观看 | 国产成人精品国内自产拍免费看 | 国产成人在线观看免费 | 国偷自产视频一区二区久 | 欧美一区,二区 | 免费视频区| 欧美久久久影院 | 九九九热精品 | a在线v| 久久成人精品 | 青青河边草免费直播 | 午夜国产在线观看 | 国产一区视频导航 | 永久黄网站色视频免费观看w | 91完整版观看 | 波多野结衣亚洲一区二区 | 伊人首页 | 久久久久久久久综合 | 欧美亚洲免费在线一区 | 日韩av男人的天堂 | 中文字幕 国产精品 | 91av在线视频免费观看 | 精品毛片久久久久久 | 色综合亚洲精品激情狠狠 | 中文字幕在线观看1 | 精品96久久久久久中文字幕无 | 亚洲www天堂com | 亚洲国产中文字幕 | 美女视频黄免费网站 | 亚洲精品国产免费 | 成年人视频在线免费播放 | 久久国产视频网站 | 免费日韩一区二区 | 9999在线视频 | 国产精品密入口果冻 | 人人爱爱 | 在线免费观看视频一区 | av免费线看| 亚洲精品在线观看中文字幕 | 国产资源在线免费观看 | av中文资源在线 | 国产亚洲人成网站在线观看 | 午夜av免费看 | 色多视频在线观看 | 97看片网| 91在线色| 免费成人在线电影 | 大型av综合网站 | 日韩av一区二区三区 | 亚洲1区 在线 | 国产成人精品国内自产拍免费看 | 欧美性色综合网站 | 国产精品爽爽久久久久久蜜臀 | 17婷婷久久www| 69国产在线观看 | 91黄色视屏 | 黄色亚洲 | 免费看三级黄色片 | 国产精品9999久久久久仙踪林 | 日日摸日日添夜夜爽97 | 日日操夜夜操狠狠操 | 一级一级一片免费 | 日韩欧美国产激情在线播放 | 国产亚洲午夜高清国产拍精品 | 久久99精品国产91久久来源 | www.色午夜,com| 免费观看mv大片高清 | 99久高清在线观看视频99精品热在线观看视频 | 在线看成人 | 99国产精品久久久久老师 | 少妇bbw搡bbbb搡bbbb | av.com在线 | 麻豆av一区二区三区在线观看 | 国产一级片免费视频 | 婷婷丁香自拍 | 在线亚州 | 久久99精品久久久久婷婷 | 久青草视频 | 精品国产一区二区三区久久久久久 | 久久手机免费视频 | 天天躁日日躁狠狠躁av麻豆 | 在线蜜桃视频 | 99久久99久久综合 | 婷婷成人在线 | 91av色| 国产精品久久久久久99 | 久久超碰免费 | 亚洲一级免费观看 | 亚洲一级免费观看 | 成人观看| 永久免费观看视频 | 人人草网站 | 国产香蕉视频在线观看 | 999电影免费在线观看 | 欧美日韩免费一区二区 | 久二影院 | 亚洲一级免费电影 | 国产中文字幕在线观看 | 天天综合视频在线观看 | 日韩欧美在线国产 | 菠萝菠萝在线精品视频 | 久久久国产高清 | 激情欧美xxxx | 色婷婷婷| 国产亚洲欧美在线视频 | 久久综合五月天婷婷伊人 | 四虎小视频 | 99热这里只有精品在线观看 | 视频 国产区 | 天天天天爱天天躁 | 久草视频在线播放 | 欧美日韩高清一区 | 最近免费在线观看 | 欧美一级特黄aaaaaa大片在线观看 | 欧美激情一区不卡 | 日韩欧美在线综合网 | 亚洲天堂精品 | 日本三级国产 | 日韩精品专区在线影院重磅 | 婷婷av综合 | av一本久道久久波多野结衣 | 久久y| 色偷偷网站视频 | 婷婷色网站 | 91丨九色丨勾搭 | 999精品 | 成人在线观看资源 | 美女精品久久久 | 天天射天天干天天 | 欧洲精品在线视频 | 亚洲精品永久免费视频 | 国产精品资源在线 | 亚州精品在线视频 | 日韩欧美一区二区三区免费观看 | 久草在线网址 | 欧美作爱视频 | 91精品啪在线观看国产 | 久久婷亚洲五月一区天天躁 | 国产精品福利在线观看 | 欧美在线视频二区 | 日韩极品在线 | 亚洲综合色av | 99久久精品网| 久久人人爽人人片 | 在线国产99 | 一级性视频 | 一区二区三区四区五区在线 | 亚洲aaa级| 欧美美女一级片 | 丁香婷婷色综合亚洲电影 | 亚洲高清精品在线 | 欧美成人理伦片 | 视频在线国产 | 在线观看日本高清mv视频 | 亚洲精品视频偷拍 | 精品免费一区 | 久久五月天综合 |