M8Test Help

构建插件

构建插件可分为项目插件和设置插件, 可 hook 项目构建过程

项目插件

15

开发项目插件步骤如下:

  1. 在 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) }
  1. 编写一个类继承 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) }) } }
  1. 编写一个类实现 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" } }
  1. 在 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: 实现了插件的全类名

  1. 使用时需要在 init.build 文件中引用, 需要用到 BuildScriptConfig.requirePlugin 方法, 插件名为 com.m8test.plugin.name 指定的值

  2. build 文件中通过 PluginContainer.apply 方法应用插件, 这里需要的是插件id, 也就是 getPlugins 方法返回的插件中某个插件的id

设置插件

16

开发设置插件步骤如下:

  1. 在 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) }
  1. 编写一个类继承 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)}) } }
  1. 编写一个类实现 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" } }
  1. 在 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: 实现了插件的全类名

  1. 使用时需要在 init.settings 文件中引用, 需要用到 BuildScriptConfig.requirePlugin 方法, 插件名为 com.m8test.plugin.name 指定的值

  2. settings 文件中通过 PluginContainer.apply 方法应用插件, 这里需要的是插件id, 也就是 getPlugins 方法返回的插件中某个插件的id

Last modified: 29 April 2025