构建插件
构建插件分为项目插件和设置插件两类,可用于 hook 项目的构建过程,扩展构建逻辑。

开发 项目插件
插件的步骤如下:
在 build.gradle.kts
文件中添加 m8test sdk
依赖。为减小插件 APK 的体积,如果依赖项已包含在 M8Test Version Catalog 中,建议使用 compileOnly
方式引入依赖。
import com.m8test.util.VersionUtils
plugins {
alias(m8test.plugins.android.application)
alias(m8test.plugins.kotlin.android)
}
android {
namespace = "com.m8test.builder.project"
compileSdk = m8test.versions.compileSdk.get().toInt()
defaultConfig {
minSdk = m8test.versions.minSdk.get().toInt()
targetSdk = m8test.versions.targetSdk.get().toInt()
versionName = libs.versions.versionName.get()
versionCode = VersionUtils.getCode(versionName!!)
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions {
sourceCompatibility = JavaVersion.toVersion(m8test.versions.sourceCompatibility.get())
targetCompatibility = JavaVersion.toVersion(m8test.versions.targetCompatibility.get())
}
kotlinOptions {
jvmTarget = m8test.versions.jvmTarget.get()
}
}
dependencies {
compileOnly(m8test.m8test.sdk)
}
创建一个类继承 AbstractProjectPlugin ,并重写 getPlugins
方法
package com.m8test.builder.project
import com.m8test.plugin.api.ApkPluginProvider
import com.m8test.script.builder.api.Plugin
import com.m8test.script.builder.api.Project
import com.m8test.script.builder.impl.AbstractProjectPlugin
import com.m8test.script.core.api.engine.ScriptContext
/**
* Description TODO
*
* @date 2025/02/03 12:00:22
* @author M8Test,
[email protected], https://m8test.com
*/
class ProjectPlugin(apkPluginProvider: ApkPluginProvider) :
AbstractProjectPlugin(apkPluginProvider) {
override fun getPlugins(): Map<String, (ScriptContext) -> Plugin<Project>> {
return mapOf(EchoPlugin.ID to { EchoPlugin(it) })
}
}
实现 Plugin 接口,定义插件功能
package com.m8test.builder.project
import com.m8test.script.builder.api.Plugin
import com.m8test.script.builder.api.Project
import com.m8test.script.core.api.engine.ScriptContext
/**
* Description TODO
*
* @date 2025/02/03 12:01:48
* @author M8Test,
[email protected], https://m8test.com
*/
class EchoPlugin(private val scriptContext: ScriptContext) : Plugin<Project> {
override fun apply(target: Project) {
scriptContext.getBindings().getConsole().log("echo project name: ${target.getName()}")
}
override fun getId(): String {
return ID
}
companion object {
const val ID = "echo-project"
}
}
在 AndroidManifest.xml
中配置插件信息
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application android:icon="@drawable/ic_launcher">
<meta-data
android:name="com.m8test.plugin.description"
android:value="本插件实现了在控制台输出项目名称的功能" />
<meta-data
android:name="com.m8test.plugin.url"
android:value="https://github.com/m8test/Plugins" />
<meta-data
android:name="com.m8test.plugin.type"
android:value="project" />
<meta-data
android:name="com.m8test.plugin.name"
android:value="Echo Project Plugin" />
<meta-data
android:name="com.m8test.plugin.className"
android:value="com.m8test.builder.project.ProjectPlugin" />
</application>
</manifest>
com.m8test.plugin.type
: 插件类型,此处为 project
com.m8test.plugin.name
: 插件名称,可为任意字符串
com.m8test.plugin.className
: 插件实现类的全限定类名
在 init.build
文件中引用插件,使用 BuildScriptConfig.requirePlugin 方法,其参数为 com.m8test.plugin.name
指定的名称。
在 build
文件中使用 PluginContainer.apply 方法应用插件, 此处需传入插件 ID,即 getPlugins
方法中定义的插件 ID。

开发 设置插件
插件的步骤如下:
在 build.gradle.kts
文件中添加 m8test sdk
依赖。为减小插件 APK 的体积,如果依赖项已包含在 M8Test Version Catalog 中,建议使用 compileOnly
方式引入依赖。
import com.m8test.util.VersionUtils
plugins {
alias(m8test.plugins.android.application)
alias(m8test.plugins.kotlin.android)
}
android {
namespace = "com.m8test.builder.settings"
compileSdk = m8test.versions.compileSdk.get().toInt()
defaultConfig {
minSdk = m8test.versions.minSdk.get().toInt()
targetSdk = m8test.versions.targetSdk.get().toInt()
versionName = libs.versions.versionName.get()
versionCode = VersionUtils.getCode(versionName!!)
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions {
sourceCompatibility = JavaVersion.toVersion(m8test.versions.sourceCompatibility.get())
targetCompatibility = JavaVersion.toVersion(m8test.versions.targetCompatibility.get())
}
kotlinOptions {
jvmTarget = m8test.versions.jvmTarget.get()
}
}
dependencies {
compileOnly(m8test.m8test.sdk)
}
创建一个类继承 AbstractSettingsPlugin ,并重写 getPlugins
方法
package com.m8test.builder.settings
import com.m8test.plugin.api.ApkPluginProvider
import com.m8test.script.builder.api.Plugin
import com.m8test.script.builder.api.Settings
import com.m8test.script.builder.impl.AbstractSettingsPlugin
import com.m8test.script.core.api.engine.ScriptContext
/**
* Description TODO
*
* @date 2025/02/03 12:18:20
* @author M8Test,
[email protected], https://m8test.com
*/
class SettingsPlugin(apkPluginProvider: ApkPluginProvider) :
AbstractSettingsPlugin(apkPluginProvider) {
override fun getPlugins(): Map<String, (ScriptContext) -> Plugin<Settings>> {
return mapOf(EchoPlugin.ID to { EchoPlugin(it)})
}
}
实现 Plugin 接口,定义插件功能
package com.m8test.builder.settings
import com.m8test.script.builder.api.Plugin
import com.m8test.script.builder.api.Settings
import com.m8test.script.core.api.engine.ScriptContext
/**
* Description TODO
*
* @date 2025/02/03 12:19:08
* @author M8Test,
[email protected], https://m8test.com
*/
class EchoPlugin(private val scriptContext: ScriptContext) : Plugin<Settings> {
override fun apply(target: Settings) {
target.onProjectsLoaded {
scriptContext.getBindings().getConsole()
.log("echo projects: ${target.getProjects()}")
}
}
override fun getId(): String {
return ID
}
companion object {
const val ID = "echo-settings"
}
}
在 AndroidManifest.xml
中配置插件信息
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application android:icon="@drawable/ic_launcher">
<meta-data
android:name="com.m8test.plugin.description"
android:value="本插件是实现了在所有的项目加载完成后输出所有的项目的功能." />
<meta-data
android:name="com.m8test.plugin.url"
android:value="https://github.com/m8test/Plugins" />
<meta-data
android:name="com.m8test.plugin.type"
android:value="settings" />
<meta-data
android:name="com.m8test.plugin.name"
android:value="Echo Settings Plugin" />
<meta-data
android:name="com.m8test.plugin.className"
android:value="com.m8test.builder.settings.SettingsPlugin" />
</application>
</manifest>
com.m8test.plugin.type
: 插件类型,此处为 settings
com.m8test.plugin.name
: 插件名称,可为任意字符串
com.m8test.plugin.className
: 插件实现类的全限定类名
在 init.settings
文件中引用插件,使用 BuildScriptConfig.requirePlugin 方法,其参数为 com.m8test.plugin.name
指定的名称。
在 settings
文件中使用 PluginContainer.apply 方法应用插件, 此处需传入插件 ID,即 getPlugins
方法中定义的插件 ID。
Last modified: 12 June 2025