13. Gradle编译其他应用代码流程(二 )
接着上一篇博客开始讲:
5. Gradle编译其他应用程序流程(一)
一. BuildActionsFactory.runBuildInProcess
privateRunnablerunBuildInProcess(StartParameterstartParameter,DaemonParametersdaemonParameters,ServiceRegistryloggingServices){ServiceRegistryglobalServices=ServiceRegistryBuilder.builder().displayName("Globalservices").parent(loggingServices).parent(NativeServices.getInstance()).provider(newGlobalScopeServices(startParameter.isContinuous())).build();returnrunBuildAndCloseServices(startParameter,daemonParameters,globalServices.get(BuildExecuter.class),globalServices);}
这个方法就是很绕的地方了!看了半天才大概明白。
首先runBuildInProcess这个方法分成两个部分
1. 初始化
2. 执行
首先来看初始化,也就是:
ServiceRegistryglobalServices=ServiceRegistryBuilder.builder().displayName("Globalservices").parent(loggingServices).parent(NativeServices.getInstance()).provider(newGlobalScopeServices(startParameter.isContinuous())).build();
直接看build():
publicServiceRegistrybuild(){DefaultServiceRegistryregistry=newDefaultServiceRegistry(displayName,parents);for(Objectprovider:providers){registry.addProvider(provider);}returnregistry;}
实例化的是DefaultServiceRegistry对象,那来看看DefaultServiceRegistry的Javadoc,看看怎么描述的。
org.gradle.internal.service.DefaultServiceRegistryAhierarchicalServiceRegistryimplementation.Subclassescanregisterservicesby:Callingadd(Class,Object)toregisteraserviceinstance.CallingaddProvider(Object)toregisteraserviceproviderbean.Aproviderbeanmayhavefactory,decoratorandconfigurationmethodsasdescribedbelow.Addingafactorymethod.Afactorymethodshouldhaveanamethatstartswith'create',andhaveanon-voidreturntype.Forexample,protectedSomeServicecreateSomeService(){....}.Parametersareinjectedusingservicesfromthisregistryoritsparents.Notethatfactorymethodswithasingleparameterandanreturntypeequaltothatparametertypeareinterpretedasdecoratormethods.Addingadecoratormethod.Adecoratormethodshouldhaveanamethatstartswith'decorate',takeasingleparameter,andahavereturntypeequaltotheparametertype.Beforeinvokingthemethod,theparameterislocatedintheparentserviceregistryandthenpassedtothemethod.Addingaconfiguremethod.Aconfiguremethodshouldbecalled'configure',takeaServiceRegistrationparameter,andahaveavoidreturntype.Additionalparametersareinjectedusingservicesfromthisregistryoritsparents.Serviceinstancesarecreatedondemand.getFactory(Class)looksforaserviceinstancewhichimplementsFactory<T>whereTistheexpectedtype.Serviceinstancesandfactoriesareclosedwhentheregistrythatcreatedthemisclosedusingclose().Ifaserviceinstanceorfactoryimplementsjava.io.Closeableororg.gradle.internal.concurrent.Stoppablethentheappropriateclose()orstop()methodiscalled.Instancesareclosedinreversedependencyorder.Serviceregistriesarearrangedinahierarchy.Ifaserviceofagiventypecannotbelocated,theregistryusesitsparentregistry,ifany,tolocatetheservice.主要意思就是DefaultServiceRegistry可以通过add(xxx)方法接受服务对象,通过addProvider(xxx)方法接受serviceproviderbean对象。而serviceproviderbean可以有3种类型的方法factory方法'create'开头,不是void的返回值,等等decorator方法'decorator'开头,等等configure方法'configure'方法,有个ServiceRegistration参数,void返回类型,等等。
那我们回过头来看初始化方法,里面传入了GlobalScopeServices作为provider,所以看下GlobalScopeServices。
二. GlobalScopeServices
publicclassGlobalScopeServices{...voidconfigure(ServiceRegistrationregistration,ClassLoaderRegistryclassLoaderRegistry){System.out.println("GlobalScopeServicesconfigureregistration:"+registration+"classLoaderRegistry:"+classLoaderRegistry);finalList<PluginServiceRegistry>pluginServiceFactories=newDefaultServiceLocator(classLoaderRegistry.getRuntimeClassLoader(),classLoaderRegistry.getPluginsClassLoader()).getAll(PluginServiceRegistry.class);for(PluginServiceRegistrypluginServiceRegistry:pluginServiceFactories){registration.add(PluginServiceRegistry.class,pluginServiceRegistry);pluginServiceRegistry.registerGlobalServices(registration);}}...ClassLoaderRegistrycreateClassLoaderRegistry(ClassPathRegistryclassPathRegistry,HashingClassLoaderFactoryclassLoaderFactory){if(GradleRuntimeShadedJarDetector.isLoadedFrom(getClass())){returnnewFlatClassLoaderRegistry(getClass().getClassLoader());}System.out.println("createClassLoaderRegistry");returnnewDefaultClassLoaderRegistry(classPathRegistry,classLoaderFactory);}...}
首先看configure方法
pluginServiceRegistry.registerGlobalServices(registration);
这行代码registerGlobalServices其实调用的是LauncherServices.registerGlobalServices
也就是:
publicclassLauncherServicesimplementsPluginServiceRegistry{publicvoidregisterGlobalServices(ServiceRegistrationregistration){registration.addProvider(newToolingGlobalScopeServices());}staticclassToolingGlobalScopeServices{BuildExecutercreateBuildExecuter(GradleLauncherFactorygradleLauncherFactory,ServiceRegistryglobalServices,ListenerManagerlistenerManager,FileWatcherFactoryfileWatcherFactory,ExecutorFactoryexecutorFactory,StyledTextOutputFactorystyledTextOutputFactory){List<BuildActionRunner>buildActionRunners=globalServices.getAll(BuildActionRunner.class);BuildActionExecuter<BuildActionParameters>delegate=newInProcessBuildActionExecuter(gradleLauncherFactory,newChainingBuildActionRunner(buildActionRunners));returnnewContinuousBuildActionExecuter(delegate,fileWatcherFactory,listenerManager,styledTextOutputFactory,executorFactory);}ExecuteBuildActionRunnercreateExecuteBuildActionRunner(){returnnewExecuteBuildActionRunner();}ClassLoaderCachecreateClassLoaderCache(){returnnewClassLoaderCache();}}}
registerGlobalServices的时候,实例化并添加了ToolingGlobalScopeServices对象。
最主要的是实例化了一个InProcessBuildActionExecuter对象,当然这里又不能免俗的使用了装饰者模式(ContinuousBuildActionExecuter包含了InProcessBuildActionExecuter,其实还是调用InProcessBuildActionExecuter.execute)
---------------------------分割线----------------------------------------
这个中间的逻辑非常绕,就是怎么回调到provider的factory和config方法?
有兴趣的同学可以自己去看。我贴一段中间回调createXXX的代码调用堆栈(也就是factory方法的调用)
java.lang.Exception:SandyDefaultModuleinitatorg.gradle.api.internal.classpath.DefaultModuleRegistry$DefaultModule.<init>(DefaultModuleRegistry.java:256)atorg.gradle.api.internal.classpath.DefaultModuleRegistry.module(DefaultModuleRegistry.java:121)atorg.gradle.api.internal.classpath.DefaultModuleRegistry.loadModule(DefaultModuleRegistry.java:89)atorg.gradle.api.internal.classpath.DefaultModuleRegistry.getModule(DefaultModuleRegistry.java:77)atorg.gradle.api.internal.DynamicModulesClassPathProvider.findClassPath(DynamicModulesClassPathProvider.java:38)atorg.gradle.api.internal.DefaultClassPathRegistry.getClassPath(DefaultClassPathRegistry.java:34)atorg.gradle.initialization.DefaultClassLoaderRegistry.<init>(DefaultClassLoaderRegistry.java:32)atorg.gradle.internal.service.scopes.GlobalScopeServices.createClassLoaderRegistry(GlobalScopeServices.java:212)atsun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethod)atsun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)atsun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)atjava.lang.reflect.Method.invoke(Method.java:483)atorg.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:75)atorg.gradle.internal.service.DefaultServiceRegistry.invoke(DefaultServiceRegistry.java:468)atorg.gradle.internal.service.DefaultServiceRegistry.access$1200(DefaultServiceRegistry.java:84)atorg.gradle.internal.service.DefaultServiceRegistry$FactoryMethodService.invokeMethod(DefaultServiceRegistry.java:803)atorg.gradle.internal.service.DefaultServiceRegistry$FactoryService.create(DefaultServiceRegistry.java:758)atorg.gradle.internal.service.DefaultServiceRegistry$ManagedObjectProvider.getInstance(DefaultServiceRegistry.java:595)atorg.gradle.internal.service.DefaultServiceRegistry$SingletonService.get(DefaultServiceRegistry.java:640)atorg.gradle.internal.service.DefaultServiceRegistry.applyConfigureMethod(DefaultServiceRegistry.java:257)atorg.gradle.internal.service.DefaultServiceRegistry.findProviderMethods(DefaultServiceRegistry.java:216)atorg.gradle.internal.service.DefaultServiceRegistry.addProvider(DefaultServiceRegistry.java:358)atorg.gradle.internal.service.ServiceRegistryBuilder.build(ServiceRegistryBuilder.java:52)atorg.gradle.launcher.cli.BuildActionsFactory.runBuildInProcess(BuildActionsFactory.java:135)atorg.gradle.launcher.cli.BuildActionsFactory.createAction(BuildActionsFactory.java:91)atorg.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.createAction(CommandLineActionFactory.java:255)atorg.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:240)atorg.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:217)atorg.gradle.launcher.cli.JavaRuntimeValidationAction.execute(JavaRuntimeValidationAction.java:33)atorg.gradle.launcher.cli.JavaRuntimeValidationAction.execute(JavaRuntimeValidationAction.java:24)atorg.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:33)atorg.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:22)atorg.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:210)atorg.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:174)atorg.gradle.launcher.Main.doAction(Main.java:33)atorg.gradle.launcher.bootstrap.EntryPoint.run(EntryPoint.java:45)atsun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethod)atsun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)atsun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)atjava.lang.reflect.Method.invoke(Method.java:483)atorg.gradle.launcher.bootstrap.ProcessBootstrap.runNoExit(ProcessBootstrap.java:60)atorg.gradle.launcher.bootstrap.ProcessBootstrap.run(ProcessBootstrap.java:37)atorg.gradle.launcher.GradleMain.main(GradleMain.java:24)
三. 执行
privateRunnablerunBuildInProcess(StartParameterstartParameter,DaemonParametersdaemonParameters,ServiceRegistryloggingServices){ServiceRegistryglobalServices=ServiceRegistryBuilder.builder().displayName("Globalservices").parent(loggingServices).parent(NativeServices.getInstance()).provider(newGlobalScopeServices(startParameter.isContinuous())).build();returnrunBuildAndCloseServices(startParameter,daemonParameters,globalServices.get(BuildExecuter.class),globalServices);}privateRunnablerunBuildAndCloseServices(StartParameterstartParameter,DaemonParametersdaemonParameters,BuildActionExecuter<BuildActionParameters>executer,ServiceRegistrysharedServices,Object...stopBeforeSharedServices){BuildActionParametersparameters=createBuildActionParamters(startParameter,daemonParameters);Stoppablestoppable=newCompositeStoppable().add(stopBeforeSharedServices).add(sharedServices);returnnewRunBuildAction(executer,startParameter,clientMetaData(),getBuildStartTime(),parameters,sharedServices,stoppable);}publicclassRunBuildActionimplementsRunnable{ServiceRegistryglobalServices=ServiceRegistryBuilder.builder().displayName("Globalservices").parent(loggingServices).parent(NativeServices.getInstance()).provider(newGlobalScopeServices(startParameter.isContinuous())).build();publicvoidrun(){try{System.out.println("RunBuildActionexecuter:"+executer+"startParameter:"+startParameter+"buildActionParameters:"+buildActionParameters);executer.execute(newExecuteBuildAction(startParameter),newDefaultBuildRequestContext(newDefaultBuildRequestMetaData(clientMetaData,startTime),newDefaultBuildCancellationToken(),newNoOpBuildEventConsumer()),buildActionParameters,sharedServices);}finally{if(stoppable!=null){stoppable.stop();}}}}
在RunBuildAction里面执行的还是executer.execute,也就是第三个参数globalServices.get(BuildExecuter.class)
globalServices是build出来的DefaultServiceRegistry对象
其实就是GlobalScopeServices.configure方法里面的ServiceRegistration对象。
voidconfigure(ServiceRegistrationregistration,ClassLoaderRegistryclassLoaderRegistry){System.out.println("GlobalScopeServicesconfigureregistration:"+registration+"classLoaderRegistry:"+classLoaderRegistry);finalList<PluginServiceRegistry>pluginServiceFactories=newDefaultServiceLocator(classLoaderRegistry.getRuntimeClassLoader(),classLoaderRegistry.getPluginsClassLoader()).getAll(PluginServiceRegistry.class);for(PluginServiceRegistrypluginServiceRegistry:pluginServiceFactories){registration.add(PluginServiceRegistry.class,pluginServiceRegistry);pluginServiceRegistry.registerGlobalServices(registration);}}
打印日志:
GlobalScopeServicesconfigureregistration:org.gradle.internal.service.DefaultServiceRegistry$1@56620197classLoaderRegistry:org.gradle.initialization.DefaultClassLoaderRegistry@393671df
接下来又继续在configure然后调用
pluginServiceRegistry.registerGlobalServices(registration);
根据前面说明的分析,这个registerGlobalServices方法就是调用LauncherServices.registerGlobalServices(registration),参数是DefaultServiceRegistry registration
publicclassLauncherServicesimplementsPluginServiceRegistry{publicvoidregisterGlobalServices(ServiceRegistrationregistration){registration.addProvider(newToolingGlobalScopeServices());}staticclassToolingGlobalScopeServices{BuildExecutercreateBuildExecuter(GradleLauncherFactorygradleLauncherFactory,ServiceRegistryglobalServices,ListenerManagerlistenerManager,FileWatcherFactoryfileWatcherFactory,ExecutorFactoryexecutorFactory,StyledTextOutputFactorystyledTextOutputFactory){List<BuildActionRunner>buildActionRunners=globalServices.getAll(BuildActionRunner.class);BuildActionExecuter<BuildActionParameters>delegate=newInProcessBuildActionExecuter(gradleLauncherFactory,newChainingBuildActionRunner(buildActionRunners));returnnewContinuousBuildActionExecuter(delegate,fileWatcherFactory,listenerManager,styledTextOutputFactory,executorFactory);}}}
所以也就是给DefaultServiceRegistry registration add了一个ToolingGlobalScopeServices对象。
这样就关联起来了,也就是说RunBuildAction.run方法里面执行的executer.execute走的就是ContinuousBuildActionExecuter.execute,然后通过装饰者模式,最后走的是InProcessBuildActionExecuter.execute方法。
很绕!!!
下面来看InProcessBuildActionExecuter.execute方法。
四. InProcessBuildActionExecuter
@OverridepublicGradleLaunchernewInstance(StartParameterstartParameter,BuildRequestContextrequestContext,ServiceRegistryparentRegistry){//Thisshouldonlybeusedfortop-levelbuildsif(tracker.getCurrentBuild()!=null){thrownewIllegalStateException("Cannothaveacurrentbuild");}BuildScopeServicesbuildScopeServices=createBuildScopeServices(parentRegistry);DefaultGradleLauncherlauncher=doNewInstance(startParameter,false,requestContext.getCancellationToken(),requestContext,requestContext.getEventConsumer(),buildScopeServices);DeploymentRegistrydeploymentRegistry=parentRegistry.get(DeploymentRegistry.class);deploymentRegistry.onNewBuild(launcher.getGradle());returnlauncher;}publicclassInProcessBuildActionExecuterimplementsBuildActionExecuter<BuildActionParameters>{privatefinalGradleLauncherFactorygradleLauncherFactory;privatefinalBuildActionRunnerbuildActionRunner;publicInProcessBuildActionExecuter(GradleLauncherFactorygradleLauncherFactory,BuildActionRunnerbuildActionRunner){this.gradleLauncherFactory=gradleLauncherFactory;this.buildActionRunner=buildActionRunner;}publicObjectexecute(BuildActionaction,BuildRequestContextbuildRequestContext,BuildActionParametersactionParameters,ServiceRegistrycontextServices){GradleLaunchergradleLauncher=gradleLauncherFactory.newInstance(action.getStartParameter(),buildRequestContext,contextServices);try{gradleLauncher.addStandardOutputListener(buildRequestContext.getOutputListener());gradleLauncher.addStandardErrorListener(buildRequestContext.getErrorListener());GradleBuildControllerbuildController=newGradleBuildController(gradleLauncher);buildActionRunner.run(action,buildController);System.out.println("SandybuildController.getResult():"+buildController.getResult());returnbuildController.getResult();}finally{gradleLauncher.stop();}}}
从代码来看newInstance返回的对象是DefaultGradleLauncher,那么接下来就真正走到开始编译的过程了,这个下篇再继续分析。
最后,附上一点DefaultGradleLauncher源代码:
publicclassDefaultGradleLauncherextendsGradleLauncher{privateenumStage{Load,Configure,Build}...@OverridepublicBuildResultrun(){returndoBuild(Stage.Build);}@OverridepublicBuildResultgetBuildAnalysis(){returndoBuild(Stage.Configure);}@OverridepublicBuildResultload()throwsReportedException{returndoBuild(Stage.Load);}privateBuildResultdoBuild(finalStageupTo){returnbuildOperationExecutor.run("Runbuild",newFactory<BuildResult>(){@OverridepublicBuildResultcreate(){...doBuildStages(upTo);...}});}privatevoiddoBuildStages(StageupTo){if(stage==Stage.Build){thrownewIllegalStateException("CannotbuildwithGradleLaunchermultipletimes");}if(stage==null){//EvaluateinitscriptsinitScriptHandler.executeScripts(gradle);//Build`buildSrc`,loadsettings.gradle,andconstructcomposite(ifappropriate)settings=settingsLoader.findAndLoadSettings(gradle);stage=Stage.Load;}if(upTo==Stage.Load){return;}if(stage==Stage.Load){//ConfigurebuildbuildOperationExecutor.run("Configurebuild",newRunnable(){@Overridepublicvoidrun(){buildConfigurer.configure(gradle);if(!gradle.getStartParameter().isConfigureOnDemand()){buildListener.projectsEvaluated(gradle);}modelConfigurationListener.onConfigure(gradle);}});stage=Stage.Configure;}if(upTo==Stage.Configure){return;}//Afterthispoint,theGradleLaunchercannotbereusedstage=Stage.Build;//PopulatetaskgraphbuildOperationExecutor.run("Calculatetaskgraph",newRunnable(){@Overridepublicvoidrun(){buildConfigurationActionExecuter.select(gradle);if(gradle.getStartParameter().isConfigureOnDemand()){buildListener.projectsEvaluated(gradle);}}});//ExecutebuildbuildOperationExecutor.run("Runtasks",newRunnable(){@Overridepublicvoidrun(){buildExecuter.execute(gradle);}});}...}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。