0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Gradle Plugin和AGP的区别2

jf_78858299 来源:小余的自习室 作者:小余的自习室 2023-03-30 11:49 次阅读
  • 3.build 变体

build 变体是 build 类型与产品变种的交叉产物,也是 Gradle 用来构建应用的配置

如上面的类型,编译时可选变体类型:

  • 4.清单 (Manifest) 条目

在配置清单中可以设置Manifest清单中给的配置信息,如

applicationId "com.example.myapp"
minSdkVersion 15
targetSdkVersion 24
versionCode 1
versionName "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.8
dependencies {
    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.AppPlugin

gradle源码:

查找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);
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • AGP
    AGP
    +关注

    关注

    0

    文章

    25

    浏览量

    18260
  • 开发
    +关注

    关注

    0

    文章

    370

    浏览量

    40840
  • gradle
    +关注

    关注

    0

    文章

    26

    浏览量

    712
收藏 人收藏

    评论

    相关推荐

    Android Studio与Gradle深入

    ://jcenter.bintray.com/" }  下载不到特定的版本  Maven 和 Gradle 都会有一个缓存库,默认安装的情况下,是在用户根目录下的 .m2 或者 .gradle 文件夹中。 可以尝试删除里面
    发表于 08-31 17:58

    HarmonyOS初步探索04:使用DevEco Studio时设置Gradle仓库代替

    路径为 C:\ Users \ lwx48xxxx \ .gradle; 2)在这个目录下新建一个init.gradle文件添加以下内容allprojects { buildscript {存储库
    发表于 12-15 14:26

    xmake-gradle是什么?怎样去配置呢

    'org.tboox.gradle-xmake-plugin' version '1.1.5'}被废弃的插件集成方式buildscript {
    发表于 08-26 16:01

    什么是agp插槽

    什么是agp插槽 agp插的英文全称:Accelerated Graphics Port    AGP(Accelerated Graphics Port)即加速图形端口。它用于连接显示设备的接口
    发表于 04-26 08:51 4261次阅读
    什么是<b class='flag-5'>agp</b>插槽

    AGP插槽,什么是AGP插槽,AGP插槽外形图

    AGP插槽,什么是AGP插槽,AGP插槽外形图 AGP(Accelerated Graphics Port)是在PCI总线基础上发展起来的,主要针对图形显示方面进行优化,专门用于图形
    发表于 04-26 18:15 2.4w次阅读

    AGP插槽

    AGP插槽 AGP(Accelerated Graphics Port)是在PCI总线基础上发展起来的,主要针对图形显示方面进行优化,专门用于图形显示卡。AGP标准也经过了几年的发展,从最初的
    发表于 12-24 15:22 1114次阅读

    什么是AGP接口

    什么是AGP接口 AGP(Accelerate Graphical Port),加速图形接口。随着显示芯片的发展,PCI总
    发表于 12-25 10:31 1601次阅读

    Dexcount Gradle Plugin计算APK方法数量的Gradle插件

    ./oschina_soft/dexcount-gradle-plugin.zip
    发表于 06-13 09:53 1次下载
    Dexcount <b class='flag-5'>Gradle</b> <b class='flag-5'>Plugin</b>计算APK方法数量的<b class='flag-5'>Gradle</b>插件

    gradle和gradlew的区别

    你会注意到输出里打印了 Gradle 的版本,它对应着你运行的 gradle 命令在设备中的 Gradle 安装包版本。这听起来有点废话,但在谈论 gradlew 的时候需要明确这点,这很重要。
    的头像 发表于 12-13 09:57 1637次阅读

    Gradle入门知识之Gradle详解

    大家回想一下自己第一次接触`Gradle`是什么时候? 相信大家也都是和我一样,在我们打开第一个AS项目的时候, 发现有很多带gradle字样的文件:`setting.gradle, build.
    的头像 发表于 03-30 10:47 2529次阅读
    <b class='flag-5'>Gradle</b>入门知识之<b class='flag-5'>Gradle</b>详解

    Gradle入门知识之Gradle语法2

    很多开发喜欢把`Gradle`简单定义为一种构建工具,和`ant,maven`等作用类似, 诚然Gradle确实是用来做构建,但是如果简单得把Gradle拿来做构建,就太小看Gradle
    的头像 发表于 03-30 10:54 734次阅读

    Gradle自定义插件介绍2

    首先来讲下`Gradle`和`Gradle插件`有啥区别? > `Gradle`是一套构建工具,其内部构建过程主要是以`Project`组成一个树形的生态系统,整个构建流程有自己
    的头像 发表于 03-30 11:17 890次阅读
    <b class='flag-5'>Gradle</b>自定义插件介绍<b class='flag-5'>2</b>

    Gradle PluginAGP区别1

    Gradle Plugin`和`AGP`的区别? `Gradle Plugin`是`
    的头像 发表于 03-30 11:48 1218次阅读
    <b class='flag-5'>Gradle</b> <b class='flag-5'>Plugin</b>和<b class='flag-5'>AGP</b>的<b class='flag-5'>区别</b>1

    Gradle PluginAGP区别3

    Gradle Plugin`和`AGP`的区别? `Gradle Plugin`是`
    的头像 发表于 03-30 11:50 1260次阅读

    agp和pcie插槽区别 agp插槽插的组件是什么

    AGP(加速图形端口)和PCIe(Peripheral Component Interconnect Express)都是计算机插槽接口,用于连接显卡和主板。下面将分别介绍AGP和PCIe插槽的区别
    的头像 发表于 01-24 10:32 3842次阅读