1.gradle文件配置
apply plugin: 'com.tencent.matrix-plugin'
matrix {
logLevel "D"
trace {
enable = true
baseMethodMapFile = "${project.projectDir}/matrixTrace/methodMapping.txt"
blackListFile = "${project.projectDir}/matrixTrace/blackMethodList.txt"
}
removeUnusedResources {
variant = "debug"
v2 = removeUnusedResourcesV2Enable
if (!v2) {
unusedResources = project.ext.unusedResourcesSet
}
enable true
needSign true
shrinkArsc true
shrinkDuplicates true
use7zip = true
zipAlign = true
embedResGuard true
apkCheckerPath = "${project.configurations.apkCheckerDependency.resolve().find { it.name.startsWith("matrix-apk-canary") }.getAbsolutePath()}"
sevenZipPath = "${project.configurations.sevenZipDependency.resolve().getAt(0).getAbsolutePath()}"
//Notice: You need to modify the value of $apksignerPath on different platform. the value below only suitable for Mac Platform,
//if on Windows, you may have to replace apksigner with apksigner.bat.
apksignerPath = "${android.getSdkDirectory().getAbsolutePath()}/build-tools/${android.getBuildToolsVersion()}/apksigner"
zipAlignPath = "${android.getSdkDirectory().getAbsolutePath()}/build-tools/${android.getBuildToolsVersion()}/zipalign"
ignoreResources = ["R.id.*", "R.bool.*", "R.layout.unused_layout"]
}
}
2.MatrixPlugin插件起点
class MatrixPlugin : Plugin<Project> {
companion object {//伴生对象,里边的值都是static的
const val TAG = "Matrix.Plugin"
}
override fun apply(project: Project) {
//apply plugin: 'com.tencent.matrix-plugin'
//matrix {
//
// logLevel "D"
//
// trace {
// enable = true
// baseMethodMapFile = "${project.projectDir}/matrixTrace/methodMapping.txt"
// blackListFile = "${project.projectDir}/matrixTrace/blackMethodList.txt"
// }
// removeUnusedResources {
// variant = "debug"
//
// v2 = removeUnusedResourcesV2Enable
//
// if (!v2) {
// unusedResources = project.ext.unusedResourcesSet
// }
//
// enable true
// needSign true
// shrinkArsc true
// shrinkDuplicates true
// use7zip = true
// zipAlign = true
// embedResGuard true
//
// apkCheckerPath = "${project.configurations.apkCheckerDependency.resolve().find { it.name.startsWith("matrix-apk-canary") }.getAbsolutePath()}"
// sevenZipPath = "${project.configurations.sevenZipDependency.resolve().getAt(0).getAbsolutePath()}"
// //Notice: You need to modify the value of $apksignerPath on different platform. the value below only suitable for Mac Platform,
// //if on Windows, you may have to replace apksigner with apksigner.bat.
// apksignerPath = "${android.getSdkDirectory().getAbsolutePath()}/build-tools/${android.getBuildToolsVersion()}/apksigner"
// zipAlignPath = "${android.getSdkDirectory().getAbsolutePath()}/build-tools/${android.getBuildToolsVersion()}/zipalign"
// ignoreResources = ["R.id.*", "R.bool.*", "R.layout.unused_layout"]
// }
//}
//创建MatrixExtension对象
val matrix = project.extensions.create("matrix", MatrixExtension::class.java)
//创建MatrixTraceExtension对象
val traceExtension = (matrix as ExtensionAware).extensions.create("trace", MatrixTraceExtension::class.java)
//创建MatrixRemoveUnusedResExtension对象,todo
val removeUnusedResourcesExtension = matrix.extensions.create("removeUnusedResources", MatrixRemoveUnusedResExtension::class.java)
//只支持application
if (!project.plugins.hasPlugin("com.android.application")) {
throw GradleException("Matrix Plugin, Android Application plugin required.")
}
project.afterEvaluate {
Log.setLogLevel(matrix.logLevel)//设置level
}
//创建Matrix的tasks
MatrixTasksManager().createMatrixTasks(
project.extensions.getByName("android") as AppExtension,
project,
traceExtension,
removeUnusedResourcesExtension
)
}
}
3.MatrixExtension外部配置一些信息,logLevel
open class MatrixExtension(
var clientVersion: String = "",//todo
var uuid: String = "",//todo
var output: String = "",//todo
var logLevel: String = "I"//log的level
) {
override fun toString(): String {
return """| log vevel = $logLevel
// | uuid = $uuid
""".trimMargin()
}
}
4.MatrixTraceExtension配置
//Extension
public class MatrixTraceExtension {
boolean transformInjectionForced; //强制transfrom注入
String baseMethodMapFile; //base的mapping文件
String blackListFile; //不插桩的路径
String customDexTransformName; //自定义transform名字
boolean enable; //开关
// public void setEnable(boolean enable) {
// this.enable = enable;
// onTraceEnabled(enable);
// }
public String getBaseMethodMapFile() {
return baseMethodMapFile;
}
public String getBlackListFile() {
return blackListFile;
}
public String getCustomDexTransformName() {
return customDexTransformName;
}
//Injection 注射; 大量资金的投入; (液体)注入,喷入;
public boolean isTransformInjectionForced() {
return transformInjectionForced;
}
public boolean isEnable() {
return enable;
}
}
5.MatrixTasksManager createMatrixTraceTask创建task
class MatrixTasksManager {
companion object {
const val TAG = "Matrix.TasksManager"
}
fun createMatrixTasks(android: AppExtension,
project: Project,
traceExtension: MatrixTraceExtension,
removeUnusedResourcesExtension: MatrixRemoveUnusedResExtension) {
createMatrixTraceTask(android, project, traceExtension)
createRemoveUnusedResourcesTask(android, project, removeUnusedResourcesExtension)//todo
}
private fun createMatrixTraceTask(
android: AppExtension,
project: Project,
traceExtension: MatrixTraceExtension) {
//MatrixTraceCompat调用inject方法
MatrixTraceCompat().inject(android, project, traceExtension)
}
private fun createRemoveUnusedResourcesTask(
android: AppExtension,
project: Project,
removeUnusedResourcesExtension: MatrixRemoveUnusedResExtension) {
project.afterEvaluate {
if (!removeUnusedResourcesExtension.enable) {
return@afterEvaluate
}
android.applicationVariants.all { variant ->
if (Util.isNullOrNil(removeUnusedResourcesExtension.variant) ||
variant.name.equals(removeUnusedResourcesExtension.variant, true)) {
Log.i(TAG, "RemoveUnusedResourcesExtension: %s", removeUnusedResourcesExtension)
val removeUnusedResourcesTaskProvider = if (removeUnusedResourcesExtension.v2) {
val action = RemoveUnusedResourcesTaskV2.CreationAction(
CreationConfig(variant, project), removeUnusedResourcesExtension
)
project.tasks.register(action.name, action.type, action)
} else {
val action = RemoveUnusedResourcesTask.CreationAction(
CreationConfig(variant, project), removeUnusedResourcesExtension
)
project.tasks.register(action.name, action.type, action)
}
variant.assembleProvider?.configure {
it.dependsOn(removeUnusedResourcesTaskProvider)
}
removeUnusedResourcesTaskProvider.configure {
it.dependsOn(variant.packageApplicationProvider)
}
}
}
}
}
}
6.MatrixTraceCompat //Compat兼容性;
class MatrixTraceCompat : ITraceSwitchListener {//Compat兼容性;
companion object {
const val TAG = "Matrix.TraceCompat"
const val LEGACY_FLAG = "matrix_trace_legacy"//legacy遗产; 遗赠财物; 遗留; 后遗症;
}
var traceInjection: MatrixTraceInjection? = null
init {
if (VersionsCompat.greatThanOrEqual(AGPVersion.AGP_4_0_0)) {
traceInjection = MatrixTraceInjection()
}
}
override fun onTraceEnabled(enable: Boolean) {
traceInjection?.onTraceEnabled(enable)
}
fun inject(appExtension: AppExtension, project: Project, extension: MatrixTraceExtension) {
when {
VersionsCompat.lessThan(AGPVersion.AGP_3_6_0) ->
legacyInject(appExtension, project, extension)
VersionsCompat.greatThanOrEqual(AGPVersion.AGP_4_0_0) -> {
if (project.extensions.extraProperties.has(LEGACY_FLAG) &&
(project.extensions.extraProperties.get(LEGACY_FLAG) as? String?) == "true") {
legacyInject(appExtension, project, extension)
} else {
traceInjection!!.inject(appExtension, project, extension)
}
}
else -> Log.e(TAG, "Matrix does not support Android Gradle Plugin " +
"${VersionsCompat.androidGradlePluginVersion}!.")
}
}
//legacy遗产; 遗赠财物; 遗留; 后遗症;
private fun legacyInject(appExtension: AppExtension,
project: Project,
extension: MatrixTraceExtension) {
project.afterEvaluate {
if (!extension.isEnable) {
return@afterEvaluate
}
appExtension.applicationVariants.all {
MatrixTraceLegacyTransform.inject(extension, project, it)
}
}
}
}
7.MatrixTraceInjection 开始注入的类
class MatrixTraceInjection : ITraceSwitchListener {
companion object {
const val TAG = "Matrix.TraceInjection"
}
private var traceEnable = false
override fun onTraceEnabled(enable: Boolean) {
traceEnable = enable
}
//step 1
fun inject(appExtension: AppExtension,
project: Project,
extension: MatrixTraceExtension) {
injectTransparentTransform(appExtension, project, extension)
project.afterEvaluate {
if (extension.isEnable) {
doInjection(appExtension, project, extension)
}
}
}
private var transparentTransform: MatrixTraceTransform? = null
//step 2
private fun injectTransparentTransform(appExtension: AppExtension,
project: Project,
extension: MatrixTraceExtension) {
//创建一个MatrixTraceTransform
transparentTransform = MatrixTraceTransform(project, extension)
//注册MatrixTraceTransform
appExtension.registerTransform(transparentTransform!!)