99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Gradle Plugin和AGP的區(qū)別2

jf_78858299 ? 來(lái)源:小余的自習(xí)室 ? 作者:小余的自習(xí)室 ? 2023-03-30 11:49 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

  • 3.build 變體

build 變體是 build 類(lèi)型與產(chǎn)品變種的交叉產(chǎn)物,也是 Gradle 用來(lái)構(gòu)建應(yīng)用的配置

如上面的類(lèi)型,編譯時(shí)可選變體類(lèi)型:

  • 4.清單 (Manifest) 條目

在配置清單中可以設(shè)置Manifest清單中給的配置信息,如

applicationId "com.example.myapp"
minSdkVersion 15
targetSdkVersion 24
versionCode 1
versionName "1.0"

這些信息可以單獨(dú)配置在不同給的變種中:如上面的類(lèi)型,編譯時(shí)可選變體類(lèi)型:

這樣可以針對(duì)不同變體設(shè)置不同的清單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"
    }
}

配置清單中信息會(huì)覆蓋原Manifest文件中的信息,當(dāng)有多個(gè)清單配置時(shí)會(huì)合并

合并工具會(huì)根據(jù)每個(gè)清單文件的優(yōu)先級(jí)按順序合并,將所有清單文件組合到一個(gè)文件中。

例如,如果您有三個(gè)清單文件,則會(huì)先將優(yōu)先級(jí)最低的清單合并到優(yōu)先級(jí)第二高的清單中,

然后再將合并后的清單合并到優(yōu)先級(jí)最高的清單中,如圖:

  • 5.sourceSets:原文件文件目錄
sourceSets {
    main {
        java {
            srcDirs = ['src/main/java']
        }
        res {
            srcDirs = ['src/main/res']
        }
        aidl {
            srcDirs = ['src/main/aidl']
        }
    }
}
  • 6.signingConfigs:簽名

Android 系統(tǒng)要求所有 APK 必須先使用證書(shū)進(jìn)行數(shù)字簽名,然后才能安裝到設(shè)備上或進(jìn)行更新

signingConfigs {
    release {
        storeFile file("myreleasekey.keystore")
        storePassword "password"
        keyAlias "MyReleaseKey"
        keyPassword "password"
    }
}
  • 7.compileOptions:指定當(dāng)前編譯的java版本信息
compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}
  • 7.buildFeatures:編譯特色屬性
buildFeatures {
    aidl = true
    buildConfig = true
    viewBinding = false
    dataBinding = true
}
//這個(gè)方式已經(jīng)被棄用,后面源碼可以看到棄用的地方
dataBinding {
    enabled = true
}

以上就是我們使用AGP時(shí)常用的插件配置項(xiàng)

下面我們從源碼去看下AGP插件內(nèi)部原理。

4.AGP插件內(nèi)部原理

1.源碼查看方法

由于A(yíng)GP插件源碼大概有30多個(gè)g。所以不建議直接下載源碼去閱讀

可以直接在模塊中引入就可以:

  • 1.創(chuàng)建一個(gè)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自定義插件的時(shí)候,說(shuō)過(guò),我們使用的每個(gè)插件都會(huì)在resources中進(jìn)行聲明:

全局搜索:

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

進(jìn)入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

我們?cè)俅稳炙阉飨拢?code>com.android.internal.application

找到implementation-class=com.android.build.gradle.internal.plugins.AppPlugin
進(jìn)入:com.android.build.gradle.internal.plugins.AppPlugin

gradle源碼:

查找apply方法:

在父類(lèi)AbstractAppPlugin的父類(lèi)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;
    //創(chuàng)建Project運(yùn)行需要的服務(wù)信息
    createProjectServices(project);
    //獲取Project的屬性O(shè)ptions 
    ProjectOptions projectOptions = projectServices.getProjectOptions();
    //依賴(lài)檢測(cè)
    DependencyResolutionChecks.registerDependencyCheck(project, projectOptions);
    //AndroidBasePlugin內(nèi)部是一個(gè)空實(shí)現(xiàn),需要我們自己去擴(kuò)展。
    project.getPluginManager().apply(AndroidBasePlugin.class);
    //檢測(cè)文件路徑
    checkPathForErrors();
    //檢測(cè)模塊路徑
    checkModulesForErrors();

    AttributionListenerInitializer.INSTANCE.init(
            project, projectOptions.get(StringOption.IDE_ATTRIBUTION_FILE_LOCATION));
    //agp的版本檢測(cè)
    AgpVersionChecker.enforceTheSamePluginVersions(project);

    RecordingBuildListener buildListener = ProfilerInitializer.init(project, projectOptions);
    //注冊(cè)buildListener構(gòu)建的監(jiān)聽(tīng)邏輯
    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構(gòu)建生命周期中的Agp插件的配置流程:
    1.configureProject:構(gòu)建project配置、
    2.configureExtension:配置外部Extension字段
    3.createTasks:創(chuàng)建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);
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • AGP
    AGP
    +關(guān)注

    關(guān)注

    0

    文章

    25

    瀏覽量

    18514
  • 開(kāi)發(fā)
    +關(guān)注

    關(guān)注

    0

    文章

    373

    瀏覽量

    41511
  • gradle
    +關(guān)注

    關(guān)注

    0

    文章

    26

    瀏覽量

    883
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Android Studio與Gradle深入

    ://jcenter.bintray.com/" }  下載不到特定的版本  Maven 和 Gradle 都會(huì)有一個(gè)緩存庫(kù),默認(rèn)安裝的情況下,是在用戶(hù)根目錄下的 .m2 或者 .gradle 文件夾中。 可以嘗試刪除里面
    發(fā)表于 08-31 17:58

    HarmonyOS初步探索04:使用DevEco Studio時(shí)設(shè)置Gradle倉(cāng)庫(kù)代替

    路徑為 C:\ Users \ lwx48xxxx \ .gradle; 2)在這個(gè)目錄下新建一個(gè)init.gradle文件添加以下內(nèi)容allprojects { buildscript {存儲(chǔ)庫(kù)
    發(fā)表于 12-15 14:26

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

    'org.tboox.gradle-xmake-plugin' version '1.1.5'}被廢棄的插件集成方式buildscript {
    發(fā)表于 08-26 16:01

    什么是agp插槽

    什么是agp插槽 agp插的英文全稱(chēng):Accelerated Graphics Port    AGP(Accelerated Graphics Port)即加速圖形端口。它用于連接顯示設(shè)備的接口
    發(fā)表于 04-26 08:51 ?4762次閱讀
    什么是<b class='flag-5'>agp</b>插槽

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

    AGP插槽,什么是AGP插槽,AGP插槽外形圖 AGP(Accelerated Graphics Port)是在PCI總線(xiàn)基礎(chǔ)上發(fā)展起來(lái)的,主要針對(duì)圖形顯示方面進(jìn)行優(yōu)化,專(zhuān)門(mén)用于圖形
    發(fā)表于 04-26 18:15 ?2.5w次閱讀

    AGP插槽

    AGP插槽 AGP(Accelerated Graphics Port)是在PCI總線(xiàn)基礎(chǔ)上發(fā)展起來(lái)的,主要針對(duì)圖形顯示方面進(jìn)行優(yōu)化,專(zhuān)門(mén)用于圖形顯示卡。AGP標(biāo)準(zhǔn)也經(jīng)過(guò)了幾年的發(fā)展,從最初的
    發(fā)表于 12-24 15:22 ?1240次閱讀

    Dexcount Gradle Plugin計(jì)算APK方法數(shù)量的Gradle插件

    ./oschina_soft/dexcount-gradle-plugin.zip
    發(fā)表于 06-13 09:53 ?1次下載
    Dexcount <b class='flag-5'>Gradle</b> <b class='flag-5'>Plugin</b>計(jì)算APK方法數(shù)量的<b class='flag-5'>Gradle</b>插件

    gradle和gradlew的區(qū)別?

    你會(huì)注意到輸出里打印了 Gradle 的版本,它對(duì)應(yīng)著你運(yùn)行的 gradle 命令在設(shè)備中的 Gradle 安裝包版本。這聽(tīng)起來(lái)有點(diǎn)廢話(huà),但在談?wù)?gradlew 的時(shí)候需要明確這點(diǎn),這很重要。
    的頭像 發(fā)表于 12-13 09:57 ?2001次閱讀

    Gradle入門(mén)知識(shí)之Gradle詳解

    大家回想一下自己第一次接觸`Gradle`是什么時(shí)候? 相信大家也都是和我一樣,在我們打開(kāi)第一個(gè)AS項(xiàng)目的時(shí)候, 發(fā)現(xiàn)有很多帶gradle字樣的文件:`setting.gradle, build.
    的頭像 發(fā)表于 03-30 10:47 ?2794次閱讀
    <b class='flag-5'>Gradle</b>入門(mén)知識(shí)之<b class='flag-5'>Gradle</b>詳解

    Gradle入門(mén)知識(shí)之Gradle語(yǔ)法1

    很多開(kāi)發(fā)喜歡把`Gradle`簡(jiǎn)單定義為一種構(gòu)建工具,和`ant,maven`等作用類(lèi)似, 誠(chéng)然Gradle確實(shí)是用來(lái)做構(gòu)建,但是如果簡(jiǎn)單得把Gradle拿來(lái)做構(gòu)建,就太小看Gradle
    的頭像 發(fā)表于 03-30 10:54 ?1273次閱讀
    <b class='flag-5'>Gradle</b>入門(mén)知識(shí)之<b class='flag-5'>Gradle</b>語(yǔ)法1

    Gradle入門(mén)知識(shí)之Gradle語(yǔ)法2

    很多開(kāi)發(fā)喜歡把`Gradle`簡(jiǎn)單定義為一種構(gòu)建工具,和`ant,maven`等作用類(lèi)似, 誠(chéng)然Gradle確實(shí)是用來(lái)做構(gòu)建,但是如果簡(jiǎn)單得把Gradle拿來(lái)做構(gòu)建,就太小看Gradle
    的頭像 發(fā)表于 03-30 10:54 ?923次閱讀

    Gradle自定義插件介紹2

    首先來(lái)講下`Gradle`和`Gradle插件`有啥區(qū)別? > `Gradle`是一套構(gòu)建工具,其內(nèi)部構(gòu)建過(guò)程主要是以`Project`組成一個(gè)樹(shù)形的生態(tài)系統(tǒng),整個(gè)構(gòu)建流程有自己
    的頭像 發(fā)表于 03-30 11:17 ?1102次閱讀
    <b class='flag-5'>Gradle</b>自定義插件介紹<b class='flag-5'>2</b>

    Gradle PluginAGP區(qū)別1

    Gradle Plugin`和`AGP`的區(qū)別? `Gradle Plugin`是`
    的頭像 發(fā)表于 03-30 11:48 ?1493次閱讀
    <b class='flag-5'>Gradle</b> <b class='flag-5'>Plugin</b>和<b class='flag-5'>AGP</b>的<b class='flag-5'>區(qū)別</b>1

    Gradle PluginAGP區(qū)別3

    Gradle Plugin`和`AGP`的區(qū)別? `Gradle Plugin`是`
    的頭像 發(fā)表于 03-30 11:50 ?1491次閱讀

    agp和pcie插槽區(qū)別 agp插槽插的組件是什么

    AGP(加速圖形端口)和PCIe(Peripheral Component Interconnect Express)都是計(jì)算機(jī)插槽接口,用于連接顯卡和主板。下面將分別介紹AGP和PCIe插槽的區(qū)別
    的頭像 發(fā)表于 01-24 10:32 ?5867次閱讀