赞
踩
最简单的方式如下:
1.配置 gradle.properties
比较方便的做法是配置全局的 gradle.properties,这样对所有 Gradle 工具都适用,配置文件位于 ~/.gradle/gradle.properties,在 gradle.properties 文件中加上 org.gradle.jvmargs 属性:
org.gradle.jvmargs=-XX:MaxPermSize=4g -XX:+HeapDumpOnOutOfMemoryError -Xmx4g -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5006
2.启动 Gradle Daemon 进程
$ ./gradlew --stop # 先停掉 daemon 进程
$ ./gradlew --daemon # 启动 daemon 进程
3.Attach daemon 进程
然后,选择 Gradle Daemon 进程,如下图所示:
4.新建一个空的module
删除所有其他文件,只留如下2个文件
gradle文件配置如下
apply plugin: 'groovy'
dependencies {
implementation gradleApi()
implementation localGroovy()
implementation 'com.android.tools.build:gradle:3.5.0'
}
这样就引入了源码,想看对应版本的源码,改变相应的引用即可
保持和classpath声明的一致
classpath 'com.android.tools.build:gradle:3.5.0'
5.放断点
在相应的代码行放上断点
6.运行构建,开始调试
在命令行中执行相应的 Task,例如:
$ ./gradlew assembleDebug
平时我们使用plugin都是通过apply方法,例如:
apply plugin: 'com.android.application'
所以我们就从apply方法入手
1.AppPlugin#apply
从上面得知 ‘com.android.application’ 对应com.android.build.gradle.AppPlugin
AppPlugin继承自AbstractAppPlugin,AbstractAppPlugin继承自BasePlugin
2.BasePlugin#apply
@Override
public final void apply(@NonNull Project project) {
CrashReporting.runAction(
() -> {
basePluginApply(project);
pluginSpecificApply(project);
});
}
3.BasePlugin#basePluginApply
private void basePluginApply(@NonNull Project project) { // We run by default in headless mode, so the JVM doesn't steal focus. System.setProperty("java.awt.headless", "true"); this.project = project; this.projectOptions = new ProjectOptions(project); checkGradleVersion(project, getLogger(), projectOptions); DependencyResolutionChecks.registerDependencyCheck(project, projectOptions); project.getPluginManager().apply(AndroidBasePlugin.class); checkPathForErrors(); checkModulesForErrors(); PluginInitializer.initialize(project); RecordingBuildListener buildListener = ProfilerInitializer.init(project, projectOptions); ProfileAgent.INSTANCE.register(project.getName(), buildListener); threadRecorder = ThreadRecorder.get(); Workers.INSTANCE.initFromProject( projectOptions, // possibly, in the future, consider using a pool with a dedicated size // using the gradle parallelism settings. ForkJoinPool.commonPool()); ProcessProfileWriter.getProject(project.getPath()) .setAndroidPluginVersion(Version.ANDROID_GRADLE_PLUGIN_VERSION) .setAndroidPlugin(getAnalyticsPluginType()) .setPluginGeneration(GradleBuildProject.PluginGeneration.FIRST) .setOptions(AnalyticsUtil.toProto(projectOptions)); if (!projectOptions.get(BooleanOption.ENABLE_NEW_DSL_AND_API)) { threadRecorder.record( ExecutionType.BASE_PLUGIN_PROJECT_CONFIGURE, project.getPath(), null, this::configureProject); threadRecorder.record( ExecutionType.BASE_PLUGIN_PROJECT_BASE_EXTENSION_CREATION, project.getPath(), null, this::configureExtension); threadRecorder.record( ExecutionType.BASE_PLUGIN_PROJECT_TASKS_CREATION, project.getPath(), null, this::createTasks); } else { // Apply the Java plugin project.getPlugins().apply(JavaBasePlugin.class); // create the delegate ProjectWrapper projectWrapper = new ProjectWrapper(project); PluginDelegate<E> delegate = new PluginDelegate<>( project.getPath(), project.getObjects(), project.getExtensions(), project.getConfigurations(), projectWrapper, projectWrapper, project.getLogger(), projectOptions, getTypedDelegate()); delegate.prepareForEvaluation(); // after evaluate callbacks project.afterEvaluate( CrashReporting.afterEvaluate( p -> { threadRecorder.record( ExecutionType.BASE_PLUGIN_CREATE_ANDROID_TASKS, p.getPath(), null, delegate::afterEvaluate); })); } }
threadRecoirder.recode()是记录最后一个参数的路径和执行的时间点,前面做了一些必要性的信息检测之前,其实主要做了以下几件事情:
// 配置项目,设置构建回调
this::configureProject
// 配置Extension
this::configureExtension
// 创建任务
this::createTasks
4.configureProject
private void configureProject() { final Gradle gradle = project.getGradle(); ObjectFactory objectFactory = project.getObjects(); extraModelInfo = new ExtraModelInfo(project.getPath(), projectOptions, project.getLogger()); final SyncIssueHandler syncIssueHandler = extraModelInfo.getSyncIssueHandler(); SdkComponents sdkComponents = SdkComponents.Companion.createSdkComponents( project, projectOptions, // We pass a supplier here because extension will only be set later. this::getExtension, getLogger(), syncIssueHandler); dataBindingBuilder = new DataBindingBuilder(); dataBindingBuilder.setPrintMachineReadableOutput( SyncOptions.getErrorFormatMode(projectOptions) == ErrorFormatMode.MACHINE_PARSABLE); if (projectOptions.hasRemovedOptions()) { syncIssueHandler.reportWarning( Type.GENERIC, projectOptions.getRemovedOptionsErrorMessage()); } if (projectOptions.hasDeprecatedOptions()) { extraModelInfo .getDeprecationReporter() .reportDeprecatedOptions(projectOptions.getDeprecatedOptions()); } if (!projectOptions.getExperimentalOptions().isEmpty()) { projectOptions .getExperimentalOptions() .forEach(extraModelInfo.getDeprecationReporter()::reportExperimentalOption); } // Enforce minimum versions of certain plugins GradlePluginUtils.enforceMinimumVersionsOfPlugins(project, syncIssueHandler); // Apply the Java plugin project.getPlugins().apply(JavaBasePlugin.class); DslScopeImpl dslScope = new DslScopeImpl( syncIssueHandler, extraModelInfo.getDeprecationReporter(), objectFactory); @Nullable FileCache buildCache = BuildCacheUtils.createBuildCacheIfEnabled(project, projectOptions); globalScope = new GlobalScope( project, creator, new ProjectWrapper(project), projectOptions, dslScope, sdkComponents, registry, buildCache, extraModelInfo.getMessageReceiver()); project.getTasks() .named("assemble") .configure( task -> task.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. gradle.addBuildListener( new BuildListener() { @Override public void buildStarted(@NonNull Gradle gradle) {} @Override public void settingsEvaluated(@NonNull Settings settings) {} @Override public void projectsLoaded(@NonNull Gradle gradle) {} @Override public void projectsEvaluated(@NonNull Gradle gradle) {} @Override public void buildFinished(@NonNull BuildResult buildResult) { // Do not run buildFinished for included project in composite build. if (buildResult.getGradle().getParent() != null) { return; } ModelBuilder.clearCaches(); Workers.INSTANCE.shutdown(); sdkComponents.unload(); SdkLocator.resetCache(); threadRecorder.record( ExecutionType.BASE_PLUGIN_BUILD_FINISHED, project.getPath(), null, () -> { if (!projectOptions.get( BooleanOption.KEEP_
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。