- 3.build 變體
build 變體是 build 類型與產(chǎn)品變種的交叉產(chǎn)物,也是 Gradle 用來構(gòu)建應(yīng)用的配置
如上面的類型,編譯時可選變體類型:
- 4.清單 (
Manifest
) 條目
在配置清單中可以設(shè)置Manifest清單中給的配置信息,如
applicationId "com.example.myapp"
minSdkVersion 15
targetSdkVersion 24
versionCode 1
versionName "1.0"
這些信息可以單獨配置在不同給的變種中:如上面的類型,編譯時可選變體類型:
這樣可以針對不同變體設(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"
}
}
配置清單中信息會覆蓋原Manifest文件中的信息,當(dāng)有多個清單配置時會合并
合并工具會根據(jù)每個清單文件的優(yōu)先級按順序合并,將所有清單文件組合到一個文件中。
例如,如果您有三個清單文件,則會先將優(yōu)先級最低的清單合并到優(yōu)先級第二高的清單中,
然后再將合并后的清單合并到優(yōu)先級最高的清單中,如圖:
- 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 必須先使用證書進(jìn)行數(shù)字簽名,然后才能安裝到設(shè)備上或進(jìn)行更新
signingConfigs {
release {
storeFile file("myreleasekey.keystore")
storePassword "password"
keyAlias "MyReleaseKey"
keyPassword "password"
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
- 7.
buildFeatures
:編譯特色屬性
buildFeatures {
aidl = true
buildConfig = true
viewBinding = false
dataBinding = true
}
//這個方式已經(jīng)被棄用,后面源碼可以看到棄用的地方
dataBinding {
enabled = true
}
以上就是我們使用AGP時常用的插件配置項
下面我們從源碼去看下AGP插件
內(nèi)部原理。
4.AGP插件
內(nèi)部原理
1.源碼查看方法
由于AGP插件源碼大概有30多個g。所以不建議直接下載源碼去閱讀
可以直接在模塊中引入就可以:
- 1.創(chuàng)建一個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
中進(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
我們再次全局搜索下:com.android.internal.application
找到implementation-class=com.android.build.gradle.internal.plugins.AppPlugin
進(jìn)入: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;
//創(chuàng)建Project運行需要的服務(wù)信息
createProjectServices(project);
//獲取Project的屬性O(shè)ptions
ProjectOptions projectOptions = projectServices.getProjectOptions();
//依賴檢測
DependencyResolutionChecks.registerDependencyCheck(project, projectOptions);
//AndroidBasePlugin內(nèi)部是一個空實現(xiàn),需要我們自己去擴展。
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構(gòu)建的監(jiān)聽邏輯
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);
}
-
AGP
+關(guān)注
關(guān)注
0文章
25瀏覽量
18288 -
開發(fā)
+關(guān)注
關(guān)注
0文章
370瀏覽量
40920 -
gradle
+關(guān)注
關(guān)注
0文章
26瀏覽量
741
發(fā)布評論請先 登錄
相關(guān)推薦
Android Studio與Gradle深入
HarmonyOS初步探索04:使用DevEco Studio時設(shè)置Gradle倉庫代替
xmake-gradle是什么?怎樣去配置呢
什么是agp插槽
![什么是<b class='flag-5'>agp</b>插槽](https://file1.elecfans.com//web2/M00/A4/CF/wKgZomUMNcmAfEZDAAJTbntUtA8588.jpg)
AGP插槽,什么是AGP插槽,AGP插槽外形圖
AGP插槽
什么是AGP接口
Dexcount Gradle Plugin計算APK方法數(shù)量的Gradle插件
![Dexcount <b class='flag-5'>Gradle</b> <b class='flag-5'>Plugin</b>計算APK方法數(shù)量的<b class='flag-5'>Gradle</b>插件](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
gradle和gradlew的區(qū)別?
Gradle入門知識之Gradle詳解
![<b class='flag-5'>Gradle</b>入門知識之<b class='flag-5'>Gradle</b>詳解](https://file1.elecfans.com/web2/M00/81/F1/wKgZomQk92SAKhFDAAC_CZMcFkY812.jpg)
Gradle入門知識之Gradle語法2
Gradle自定義插件介紹2
![<b class='flag-5'>Gradle</b>自定義插件介紹<b class='flag-5'>2</b>](https://file1.elecfans.com/web2/M00/81/F1/wKgZomQk_vCAB7TNAAB3RiNzalU516.jpg)
評論