构建插件
构建插件可分为项目插件和设置插件, 可 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: 29 April 2025