Gradle Plugin和AGP的区别2

3.build 变体build 变体是 build 类型与产品变种的交叉产物,也是 gradle 用来构建应用的配置
如上面的类型,编译时可选变体类型:
4.清单 (manifest) 条目在配置清单中可以设置manifest清单中给的配置信息,如
applicationid com.example.myappminsdkversion 15targetsdkversion 24versioncode 1versionname 1.0这些信息可以单独配置在不同给的变种中:如上面的类型,编译时可选变体类型:
这样可以针对不同变体设置不同的清单manifest信息:
productflavors { f1 { dimension 'abi' applicationid com.example.myapp minsdkversion 15 targetsdkversion 24 versioncode 1 versionname 1.0 } f2 { dimension 'x86' applicationid com.example.myapp1 minsdkversion 16 targetsdkversion 25 versioncode 2 versionname 2.0 }}配置清单中信息会覆盖原manifest文件中的信息,当有多个清单配置时会合并
合并工具会根据每个清单文件的优先级按顺序合并,将所有清单文件组合到一个文件中。
例如,如果您有三个清单文件,则会先将优先级最低的清单合并到优先级第二高的清单中,
然后再将合并后的清单合并到优先级最高的清单中,如图:
5.sourcesets:原文件文件目录sourcesets { main { java { srcdirs = ['src/main/java'] } res { srcdirs = ['src/main/res'] } aidl { srcdirs = ['src/main/aidl'] } }}6.signingconfigs:签名android 系统要求所有 apk 必须先使用证书进行数字签名,然后才能安装到设备上或进行更新
signingconfigs { release { storefile file(myreleasekey.keystore) storepassword password keyalias myreleasekey keypassword password }}7.compileoptions:指定当前编译的java版本信息compileoptions { sourcecompatibility javaversion.version_1_8 targetcompatibility javaversion.version_1_8}7.buildfeatures:编译特色属性buildfeatures { aidl = true buildconfig = true viewbinding = false databinding = true}//这个方式已经被弃用,后面源码可以看到弃用的地方databinding { enabled = true}以上就是我们使用agp时常用的插件配置项
下面我们从源码去看下agp插件内部原理。
4.agp插件内部原理1.源码查看方法由于agp插件源码大概有30多个g。所以不建议直接下载源码去阅读
可以直接在模块中引入就可以:
1.创建一个lib模块:2.修改build.gradle中的代码:apply plugin: 'java'sourcecompatibility = 1.8dependencies { implementation gradleapi() implementation 'com.android.tools.build:gradle:4.1.1'}同步代码后:可以在‘external libraries’中查看源码:
2.查看源码前面在讲解gradle自定义插件的时候,说过,我们使用的每个插件都会在resources中进行声明:
全局搜索:
找到implementation-class=com.android.build.gradle.appplugin进入appplugin看看:
/** * the plugin applied with `com.android.application' */@suppress(deprecation)class appplugin: baseplugin() { override fun apply(project: project) { super.apply(project) project.apply(internal_plugin_id) }}private val internal_plugin_id = mapof(plugin to com.android.internal.application)看到这里使用的internal_plugin_id中的plugin:com.android.internal.application
我们再次全局搜索下:com.android.internal.application
找到implementation-class=com.android.build.gradle.internal.plugins.appplugin进入:com.android.build.gradle.internal.plugins.appplugingradle源码:
查找apply方法:
在父类abstractappplugin的父类baseplugin找到了apply方法:
public final void apply(@nonnull project project) { crashreporting.runaction( () -> { //方法1 basepluginapply(project); //方法2 pluginspecificapply(project); });}这里我们看方法1:
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; //创建project运行需要的服务信息 createprojectservices(project); //获取project的属性options projectoptions projectoptions = projectservices.getprojectoptions(); //依赖检测 dependencyresolutionchecks.registerdependencycheck(project, projectoptions); //androidbaseplugin内部是一个空实现,需要我们自己去扩展。 project.getpluginmanager().apply(androidbaseplugin.class); //检测文件路径 checkpathforerrors(); //检测模块路径 checkmodulesforerrors(); attributionlistenerinitializer.instance.init( project, projectoptions.get(stringoption.ide_attribution_file_location)); //agp的版本检测 agpversionchecker.enforcethesamepluginversions(project); recordingbuildlistener buildlistener = profilerinitializer.init(project, projectoptions); //注册buildlistener构建的监听逻辑 profileagent.instance.register(project.getname(), buildlistener); threadrecorder = threadrecorder.get(); processprofilewriter.getproject(project.getpath()) .setandroidpluginversion(version.android_gradle_plugin_version) .setandroidplugin(getanalyticsplugintype()) .setplugingeneration(gradlebuildproject.plugingeneration.first) .setoptions(analyticsutil.toproto(projectoptions)); /** gradle构建生命周期中的agp插件的配置流程: 1.configureproject:构建project配置、 2.configureextension:配置外部extension字段 3.createtasks:创建tasks */ 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);}

OPPORenoZ好不好用
教您八招,如何成为优秀的射频工程师?
HanLP的使用方法
中国工业机器人自主品牌差距缩小,多关节机器人仍是主流
激光焊接技术在焊接奥氏体不锈钢的优点
Gradle Plugin和AGP的区别2
瑞萨10月全面恢复产能,USB 3.0控制器产量加倍
小米为什么如此热衷于抢“首发”?
关于高压共轨柴油机控制器开发套件解决方案的分析和介绍
基于孤岛微电网下的VSG虚拟阻抗的双闭环控制策略
CEVA和NXP合作提供基于CEVA-TeakLite-4 DSP的高清语音方案
运营商的主要利润来源:“薅羊毛”式的隐蔽扣费
LED投影机散热选用导热硅胶垫的原因
2.4寸串口屏应用于电暖器的解决方案
区块链中的分叉全面解析
什么是光合有效辐射,它的作用是怎样的
自制光驱雕刻机diy教程
物联网时代下智慧水务发展所需的仪表
高性能模拟、混合集成电路设计供应商——XBLW芯伯乐
基于STM32L431设计的云端绿化管理系统