提交 4b911c71 编写于 作者: J jackjintai

modify

[android]:优化打包方案
上级 cd117bc4
if (rootProject.ext.config["runType"] == 0) {
// 引用插件
apply plugin: 'com.didi.dokit.debug'
// apply plugin: 'com.didi.dokit'
//apply plugin: 'com.didi.dokit'
// 这里引用正常库
dependencies {
//外部平台依赖
......@@ -15,10 +15,10 @@ if (rootProject.ext.config["runType"] == 0) {
// 引用no-op的库
dependencies {
//新版线上包
debugImplementation "com.didichuxing.doraemonkit:doraemonkit:${rootProject.ext.android["jcenterArchivesVersionName"]}"
debugImplementation "com.didichuxing.doraemonkit:dokitx:${rootProject.ext.android["jcenterArchivesVersionName"]}"
// debugImplementation "com.didichuxing.doraemonkit:doraemonkit-leakcanary:${rootProject.ext.android["jcenterArchivesVersionName"]}"
releaseImplementation "com.didichuxing.doraemonkit:doraemonkit-no-op:${rootProject.ext.android["jcenterArchivesVersionName"]}"
//debugImplementation "com.didichuxing.doraemonkit:doraemonkit-weex:${rootProject.ext.android["jcenterArchivesVersionName"]}"
releaseImplementation "com.didichuxing.doraemonkit:dokitx-no-op:${rootProject.ext.android["jcenterArchivesVersionName"]}"
debugImplementation "com.didichuxing.doraemonkit:dokitx-weex:${rootProject.ext.android["jcenterArchivesVersionName"]}"
}
}
\ No newline at end of file
......@@ -35,8 +35,7 @@ class App : Application() {
mapKits["业务专区1"] = mutableListOf<AbstractKit>(DemoKit())
mapKits["业务专区2"] = mutableListOf<AbstractKit>(DemoKit())
//DoraemonKit.install(this, mapKits = mapKits, productId = "749a0600b5e48dd77cf8ee680be7b1b7")
DoraemonKit.install(this, mapKits = mapKits, productId = "61f9ea9b7308463010d5f1c937153916")
DoraemonKit.install(this, mapKits = mapKits, productId = "749a0600b5e48dd77cf8ee680be7b1b7")
DoraemonKit.setFileManagerHttpPort(9001)
//设置加密数据库
DoraemonKit.setDatabasePass(mapOf("Person.db" to "a_password"))
......
......@@ -14,7 +14,7 @@ buildscript {
classpath 'com.android.tools.build:gradle:4.0.2'
classpath 'com.novoda:bintray-release:0.9.2'
// classpath "com.didichuxing.doraemonkit:doraemonkit-plugin:${rootProject.ext.android["pluginVersionName"]}"
// classpath "com.didichuxing.doraemonkit:doraemonkit-plugin:3.1.8"
classpath "com.didichuxing.doraemonkit:dokitx-plugin:3.3.0"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${rootProject.ext.android["kotlin_version"]}"
}
}
......
......@@ -5,7 +5,7 @@ ext {
runOrPublish : 0,
//0:依赖dokit本地module运行
//1:依赖dokit远程aar运行
runType : 0,
runType : 1,
//0:发布到到本地localRepoURL仓库
//1:发布到滴滴内部仓库 一般不建议使用 如果需要发布到滴滴内网仓库需要将版本号改得比较大 假如版本号跟jcenter上的一致会由于缓存导致没法下载最新的jcenter的线上代码
//2:发布到jcenter远程仓库
......@@ -19,13 +19,13 @@ ext {
minSdkVersion : 16,
targetSdkVersion : 29,
//app版本号
versionCode : 320,
versionCode : 330,
//dokit 插件版本号
pluginVersionName : "3.2.0",
pluginVersionName : "3.3.0",
//jcenter dokit版本号 打包上传时 dokit的版本名字
jcenterArchivesVersionName: "3.2.0",
jcenterArchivesVersionName: "3.3.0",
//didi内部仓库版本号
versionName : "3.2.0",
versionName : "3.3.0",
glide_version : "4.9.0",
kotlin_version : "1.3.72",
booster_version : "2.3.0",
......
......@@ -52,7 +52,11 @@ dependencies {
implementation 'androidx.test.ext:junit:1.1.1'
//leakCanary
implementation rootProject.ext.dependencies["haha"]
compileOnly project(':doraemonkit')
if (rootProject.ext.config["runOrPublish"] == 0) {
compileOnly project(':doraemonkit')
} else {
compileOnly "com.didichuxing.doraemonkit:dokitx:${rootProject.ext.android["jcenterArchivesVersionName"]}"
}
//跨进程通信框架
compileOnly rootProject.ext.dependencies["utilcode"]
......
......@@ -6,7 +6,7 @@ if (publishArchivesType == 1) {
mavenDeployer {
pom.project {
groupId "com.didichuxing.doraemonkit"
artifactId "doraemonkit-leakcanary"
artifactId "dokitx-leakcanary"
version rootProject.ext.android["jcenterArchivesVersionName"]
}
......@@ -42,7 +42,7 @@ if (publishArchivesType == 1) {
mavenDeployer {
pom.project {
groupId "com.didichuxing.doraemonkit"
artifactId "doraemonkit-leakcanary"
artifactId "dokitx-leakcanary"
version rootProject.ext.android["jcenterArchivesVersionName"]
}
pom.withXml {
......
......@@ -2,7 +2,7 @@ apply plugin: 'com.novoda.bintray-release'
// 配置发布 # script
publish {
def groupProjectID = 'com.didichuxing.doraemonkit'
def artifactProjectID = 'doraemonkit-leakcanary'
def artifactProjectID = 'dokitx-leakcanary'
def publishVersionID = "${rootProject.ext.android["jcenterArchivesVersionName"]}"
userOrg = 'doraemonkit'
......
......@@ -42,7 +42,7 @@ dependencies {
//implementation rootProject.ext.dependencies["appcompat"]
//compileOnly rootProject.ext.dependencies["okio"]
implementation rootProject.ext.dependencies["kotlin"]
compileOnly rootProject.ext.dependencies["okhttp"]
compileOnly rootProject.ext.dependencies["okhttp_v3"]
//三大图片框架
compileOnly rootProject.ext.dependencies["glide"]
compileOnly rootProject.ext.dependencies["picasso"]
......
......@@ -6,7 +6,7 @@ if (publishArchivesType == 1) {
mavenDeployer {
pom.project {
groupId "com.didichuxing.doraemonkit"
artifactId "doraemonkit-no-op"
artifactId "dokitx-no-op"
version rootProject.ext.android["jcenterArchivesVersionName"]
}
......@@ -42,7 +42,7 @@ if (publishArchivesType == 1) {
mavenDeployer {
pom.project {
groupId "com.didichuxing.doraemonkit"
artifactId "doraemonkit-no-op"
artifactId "dokitx-no-op"
version rootProject.ext.android["jcenterArchivesVersionName"]
}
pom.withXml {
......
......@@ -2,7 +2,7 @@ apply plugin: 'com.novoda.bintray-release'
// 配置发布 # script
publish {
def groupProjectID = 'com.didichuxing.doraemonkit'
def artifactProjectID = 'doraemonkit-no-op'
def artifactProjectID = 'dokit-no-op'
def publishVersionID = "${rootProject.ext.android["jcenterArchivesVersionName"]}"
userOrg = 'doraemonkit'
......
......@@ -41,8 +41,16 @@ dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
//implementation rootProject.ext.dependencies["appcompat"]
//compileOnly rootProject.ext.dependencies["okio"]
implementation project(":doraemonkit-okhttp-v3")
implementation project(":doraemonkit-okhttp-v4")
if (rootProject.ext.config["runOrPublish"] == 0) {
implementation project(":doraemonkit-okhttp-v3")
implementation project(":doraemonkit-okhttp-v4")
} else {
implementation "com.didichuxing.doraemonkit:dokitx-okhttp-v3:${rootProject.ext.android["jcenterArchivesVersionName"]}"
implementation "com.didichuxing.doraemonkit:dokitx-okhttp-v4:${rootProject.ext.android["jcenterArchivesVersionName"]}"
}
compileOnly rootProject.ext.dependencies["utilcode"]
}
\ No newline at end of file
......@@ -6,7 +6,7 @@ if (publishArchivesType == 1) {
mavenDeployer {
pom.project {
groupId "com.didichuxing.doraemonkit"
artifactId "dokit-okhttp-api"
artifactId "dokitx-okhttp-api"
version rootProject.ext.android["jcenterArchivesVersionName"]
}
......@@ -42,7 +42,7 @@ if (publishArchivesType == 1) {
mavenDeployer {
pom.project {
groupId "com.didichuxing.doraemonkit"
artifactId "dokit-okhttp-api"
artifactId "dokitx-okhttp-api"
version rootProject.ext.android["jcenterArchivesVersionName"]
}
pom.withXml {
......
......@@ -2,7 +2,7 @@ apply plugin: 'com.novoda.bintray-release'
// 配置发布 # script
publish {
def groupProjectID = 'com.didichuxing.doraemonkit'
def artifactProjectID = 'dokit-okhttp-api'
def artifactProjectID = 'dokitx-okhttp-api'
def publishVersionID = "${rootProject.ext.android["jcenterArchivesVersionName"]}"
userOrg = 'doraemonkit'
......
......@@ -6,7 +6,7 @@ if (publishArchivesType == 1) {
mavenDeployer {
pom.project {
groupId "com.didichuxing.doraemonkit"
artifactId "dokit-okhttp-v3"
artifactId "dokitx-okhttp-v3"
version rootProject.ext.android["jcenterArchivesVersionName"]
}
......@@ -42,7 +42,7 @@ if (publishArchivesType == 1) {
mavenDeployer {
pom.project {
groupId "com.didichuxing.doraemonkit"
artifactId "dokit-okhttp-v3"
artifactId "dokitx-okhttp-v3"
version rootProject.ext.android["jcenterArchivesVersionName"]
}
pom.withXml {
......
......@@ -2,7 +2,7 @@ apply plugin: 'com.novoda.bintray-release'
// 配置发布 # script
publish {
def groupProjectID = 'com.didichuxing.doraemonkit'
def artifactProjectID = 'dokit-okhttp-v3'
def artifactProjectID = 'dokitx-okhttp-v3'
def publishVersionID = "${rootProject.ext.android["jcenterArchivesVersionName"]}"
userOrg = 'doraemonkit'
......
......@@ -6,7 +6,7 @@ if (publishArchivesType == 1) {
mavenDeployer {
pom.project {
groupId "com.didichuxing.doraemonkit"
artifactId "dokit-okhttp-v4"
artifactId "dokitx-okhttp-v4"
version rootProject.ext.android["jcenterArchivesVersionName"]
}
......@@ -42,7 +42,7 @@ if (publishArchivesType == 1) {
mavenDeployer {
pom.project {
groupId "com.didichuxing.doraemonkit"
artifactId "dokit-okhttp-v4"
artifactId "dokitx-okhttp-v4"
version rootProject.ext.android["jcenterArchivesVersionName"]
}
pom.withXml {
......
......@@ -2,7 +2,7 @@ apply plugin: 'com.novoda.bintray-release'
// 配置发布 # script
publish {
def groupProjectID = 'com.didichuxing.doraemonkit'
def artifactProjectID ='dokit-okhttp-v4'
def artifactProjectID ='dokitx-okhttp-v4'
def publishVersionID = "${rootProject.ext.android["jcenterArchivesVersionName"]}"
userOrg = 'doraemonkit'
......
......@@ -17,6 +17,11 @@ import org.gradle.api.Project
object DoKitExtUtil {
//private var mApplicationId: String = ""
/**
* 三方库版本信息
*/
val THIRD_LIB_INFOS = mutableListOf<ThirdLibInfo>()
/**
* dokit 插件开关 字段权限必须为public 否则无法进行赋值
*/
......@@ -29,9 +34,10 @@ object DoKitExtUtil {
var STACK_METHOD_LEVEL = 5
/**
* webview 的全限定名
* 自定义webview全限定名
*/
var WEBVIEW_CLASS_NAME = ""
var WEBVIEW_CLASS_NAME: String = ""
/**
* 慢函数默认关闭
......@@ -114,6 +120,13 @@ object DoKitExtUtil {
for (methodName in dokitEx.slowMethod.stackMethod.enterMethods) {
slowMethodExt.stackMethod.enterMethods.add(methodName)
}
//设置慢函数调用栈策略插装包名黑名单
slowMethodExt.stackMethod.methodBlacklist.clear()
for (blackStr in dokitEx.slowMethod.stackMethod.methodBlacklist) {
slowMethodExt.stackMethod.methodBlacklist.add(blackStr)
}
/**
* ============慢函数stack策略的配置 end==========
*/
......
......@@ -76,13 +76,13 @@ class DoKitPlugin : Plugin<Project> {
val slowMethodSwitch = project.getProperty("DOKIT_METHOD_SWITCH", false)
val slowMethodStrategy = project.getProperty("DOKIT_METHOD_STRATEGY", 0)
val methodStackLevel = project.getProperty("DOKIT_METHOD_STACK_LEVEL", 5)
val webviewClassName = project.getProperty("DOKIT_WEBVIEW_CLASS_NAME", "")
val webViewClassName = project.getProperty("DOKIT_WEBVIEW_CLASS_NAME", "")
DoKitExtUtil.DOKIT_PLUGIN_SWITCH = pluginSwitch
DoKitExtUtil.DOKIT_LOG_SWITCH = logSwitch
DoKitExtUtil.SLOW_METHOD_SWITCH = slowMethodSwitch
DoKitExtUtil.SLOW_METHOD_STRATEGY = slowMethodStrategy
DoKitExtUtil.STACK_METHOD_LEVEL = methodStackLevel
DoKitExtUtil.WEBVIEW_CLASS_NAME = webviewClassName
DoKitExtUtil.WEBVIEW_CLASS_NAME = webViewClassName
"application module ${project.name} is executing...".println()
......
package com.didichuxing.doraemonkit.plugin
import java.io.File
/**
* ================================================
* 作 者:jint(金台)
* 版 本:1.0
* 创建日期:2020/10/20-15:13
* 描 述:
* 修订历史:
* ================================================
*/
object DoKitPluginUtil {
const val BYTE = 1
const val KB = 1024
const val MB = 1048576
const val GB = 1073741824
fun FileSize(file: File): String? {
if (!file.isFile) {
return "0kb"
}
if (file.isDirectory) {
return "0kb"
}
val fileLength = file.length()
return byte2FitMemorySize(fileLength, 2)
}
fun byte2FitMemorySize(byteSize: Long, precision: Int): String? {
require(precision >= 0) { "precision shouldn't be less than zero!" }
return if (byteSize < 0) {
throw IllegalArgumentException("byteSize shouldn't be less than zero!")
} else if (byteSize < KB) {
String.format("%." + precision + "fB", byteSize.toDouble())
} else if (byteSize < MB) {
String.format("%." + precision + "fKB", byteSize.toDouble() / KB)
} else if (byteSize < GB) {
String.format("%." + precision + "fMB", byteSize.toDouble() / MB)
} else {
String.format("%." + precision + "fGB", byteSize.toDouble() / GB)
}
}
}
\ No newline at end of file
......@@ -195,7 +195,7 @@ internal class DoKitTransformInvocation(
multiDex = true
jarOutput = true
optimize = false
minSdkVersion = variant.extension.defaultConfig.targetSdkVersion.apiLevel
minSdkVersion = variant.extension.defaultConfig.targetSdkVersion?.apiLevel!!
fileNames = arrayOf(output.absolutePath)
outName = dex.absolutePath
}
......
package com.didichuxing.doraemonkit.plugin
/**
* ================================================
* 作 者:jint(金台)
* 版 本:1.0
* 创建日期:2020/10/20-14:50
* 描 述:
* 修订历史:
* ================================================
*/
data class ThirdLibInfo(val name: String, val fileSize: String? = "0kb")
\ No newline at end of file
......@@ -45,6 +45,11 @@ class MethodStackDepTransformer(private val level: Int = 1) : ClassTransformer {
return klass
}
//命中黑名单则不插桩
if (!notMatchedBlackList(klass.className)) {
return klass
}
val methodStackKeys: MutableSet<String> = MethodStackNodeUtil.METHOD_STACK_KEYS[level - 1]
......@@ -68,18 +73,44 @@ class MethodStackDepTransformer(private val level: Int = 1) : ClassTransformer {
private fun operateMethodInsn(klass: ClassNode, methodNode: MethodNode) {
//读取全是函数调用的指令
methodNode.instructions.asIterable().filterIsInstance(MethodInsnNode::class.java).filter { methodInsnNode ->
methodInsnNode.name != "<init>"
}.forEach { methodInsnNode ->
val methodStackNode = MethodStackNode(level, methodInsnNode.ownerClassName, methodInsnNode.name, methodInsnNode.desc, klass.className, methodNode.name, methodNode.desc)
MethodStackNodeUtil.addMethodStackNode(level, methodStackNode)
}
methodNode.instructions.asIterable().filterIsInstance(MethodInsnNode::class.java)
.filter { methodInsnNode ->
methodInsnNode.name != "<init>"
}.forEach { methodInsnNode ->
val methodStackNode = MethodStackNode(
level,
methodInsnNode.ownerClassName,
methodInsnNode.name,
methodInsnNode.desc,
klass.className,
methodNode.name,
methodNode.desc
)
MethodStackNodeUtil.addMethodStackNode(level, methodStackNode)
}
//函数出入口插入耗时统计代码
//方法入口插入
methodNode.instructions.insert(createMethodEnterInsnList(level, klass.className, methodNode.name, methodNode.desc, methodNode.access))
methodNode.instructions.insert(
createMethodEnterInsnList(
level,
klass.className,
methodNode.name,
methodNode.desc,
methodNode.access
)
)
//方法出口插入
methodNode.instructions.getMethodExitInsnNodes()?.forEach { methodExitInsnNode ->
methodNode.instructions.insertBefore(methodExitInsnNode, createMethodExitInsnList(level, klass.className, methodNode.name, methodNode.desc, methodNode.access))
methodNode.instructions.insertBefore(
methodExitInsnNode,
createMethodExitInsnList(
level,
klass.className,
methodNode.name,
methodNode.desc,
methodNode.access
)
)
}
}
......@@ -87,20 +118,48 @@ class MethodStackDepTransformer(private val level: Int = 1) : ClassTransformer {
/**
* 创建慢函数入口指令集
*/
private fun createMethodEnterInsnList(level: Int, className: String, methodName: String, desc: String, access: Int): InsnList {
private fun createMethodEnterInsnList(
level: Int,
className: String,
methodName: String,
desc: String,
access: Int
): InsnList {
val isStaticMethod = access and ACC_STATIC != 0
return with(InsnList()) {
if (isStaticMethod) {
add(FieldInsnNode(GETSTATIC, "com/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil", "INSTANCE", "Lcom/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil;"))
add(
FieldInsnNode(
GETSTATIC,
"com/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil",
"INSTANCE",
"Lcom/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil;"
)
)
add(IntInsnNode(BIPUSH, DoKitExtUtil.STACK_METHOD_LEVEL))
add(IntInsnNode(BIPUSH, thresholdTime))
add(IntInsnNode(BIPUSH, level))
add(LdcInsnNode(className))
add(LdcInsnNode(methodName))
add(LdcInsnNode(desc))
add(MethodInsnNode(INVOKEVIRTUAL, "com/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil", "recodeStaticMethodCostStart", "(IIILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V", false))
add(
MethodInsnNode(
INVOKEVIRTUAL,
"com/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil",
"recodeStaticMethodCostStart",
"(IIILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V",
false
)
)
} else {
add(FieldInsnNode(GETSTATIC, "com/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil", "INSTANCE", "Lcom/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil;"))
add(
FieldInsnNode(
GETSTATIC,
"com/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil",
"INSTANCE",
"Lcom/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil;"
)
)
add(IntInsnNode(BIPUSH, DoKitExtUtil.STACK_METHOD_LEVEL))
add(IntInsnNode(BIPUSH, thresholdTime))
add(IntInsnNode(BIPUSH, level))
......@@ -108,7 +167,15 @@ class MethodStackDepTransformer(private val level: Int = 1) : ClassTransformer {
add(LdcInsnNode(methodName))
add(LdcInsnNode(desc))
add(VarInsnNode(ALOAD, 0))
add(MethodInsnNode(INVOKEVIRTUAL, "com/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil", "recodeObjectMethodCostStart", "(IIILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V", false))
add(
MethodInsnNode(
INVOKEVIRTUAL,
"com/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil",
"recodeObjectMethodCostStart",
"(IIILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V",
false
)
)
}
this
}
......@@ -119,31 +186,77 @@ class MethodStackDepTransformer(private val level: Int = 1) : ClassTransformer {
/**
* 创建慢函数退出时的指令集
*/
private fun createMethodExitInsnList(level: Int, className: String, methodName: String, desc: String, access: Int): InsnList {
private fun createMethodExitInsnList(
level: Int,
className: String,
methodName: String,
desc: String,
access: Int
): InsnList {
val isStaticMethod = access and ACC_STATIC != 0
return with(InsnList()) {
if (isStaticMethod) {
add(FieldInsnNode(GETSTATIC, "com/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil", "INSTANCE", "Lcom/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil;"))
add(
FieldInsnNode(
GETSTATIC,
"com/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil",
"INSTANCE",
"Lcom/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil;"
)
)
add(IntInsnNode(BIPUSH, thresholdTime))
add(IntInsnNode(BIPUSH, level))
add(LdcInsnNode(className))
add(LdcInsnNode(methodName))
add(LdcInsnNode(desc))
add(MethodInsnNode(INVOKEVIRTUAL, "com/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil", "recodeStaticMethodCostEnd", "(IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V", false))
add(
MethodInsnNode(
INVOKEVIRTUAL,
"com/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil",
"recodeStaticMethodCostEnd",
"(IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V",
false
)
)
} else {
add(FieldInsnNode(GETSTATIC, "com/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil", "INSTANCE", "Lcom/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil;"))
add(
FieldInsnNode(
GETSTATIC,
"com/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil",
"INSTANCE",
"Lcom/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil;"
)
)
add(IntInsnNode(BIPUSH, thresholdTime))
add(IntInsnNode(BIPUSH, level))
add(LdcInsnNode(className))
add(LdcInsnNode(methodName))
add(LdcInsnNode(desc))
add(VarInsnNode(ALOAD, 0))
add(MethodInsnNode(INVOKEVIRTUAL, "com/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil", "recodeObjectMethodCostEnd", "(IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V", false))
add(
MethodInsnNode(
INVOKEVIRTUAL,
"com/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil",
"recodeObjectMethodCostEnd",
"(IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V",
false
)
)
}
this
}
}
private fun notMatchedBlackList(className: String): Boolean {
for (strBlack in DoKitExtUtil.slowMethodExt.stackMethod.methodBlacklist) {
if (className.contains(strBlack)) {
return false
}
}
return true
}
}
......@@ -9,9 +9,12 @@ package com.didichuxing.doraemonkit.plugin.extension
* 修订历史:
* ================================================
*/
open class CommExt(var gpsSwitch: Boolean = true,
var networkSwitch: Boolean = true,
var bigImgSwitch: Boolean = true) {
open class CommExt(
var gpsSwitch: Boolean = true,
var networkSwitch: Boolean = true,
var bigImgSwitch: Boolean = true,
var webViewSwitch: Boolean = true
) {
fun gpsSwitch(gpsSwitch: Boolean) {
this.gpsSwitch = gpsSwitch
......@@ -26,8 +29,12 @@ open class CommExt(var gpsSwitch: Boolean = true,
this.bigImgSwitch = bigImgSwitch
}
fun webViewSwitch(webViewSwitch: Boolean) {
this.webViewSwitch = webViewSwitch
}
override fun toString(): String {
return "CommExt(gpsSwitch=$gpsSwitch, networkSwitch=$networkSwitch, bigImgSwitch=$bigImgSwitch)"
return "CommExt(gpsSwitch=$gpsSwitch, networkSwitch=$networkSwitch, bigImgSwitch=$bigImgSwitch, webviewSwitch=$webViewSwitch)"
}
......
......@@ -15,16 +15,17 @@ import java.util.*
*/
open class SlowMethodExt(
//0:打印函数调用栈 1:普通模式 运行时打印某个函数的耗时 全局业务代码函数插入
@Deprecated("已弃用,请在项目根目录的gradle.properties中通过DOKIT_METHOD_STRATEGY=0|1 来控制")
var strategy: Int = STRATEGY_STACK,
//函数功能开关
@Deprecated("已弃用,请在项目根目录的gradle.properties中通过DoKit_METHOD_SWITCH=true|false 来控制")
var methodSwitch: Boolean = false,
//函数调用栈模式
var stackMethod: StackMethodExt = StackMethodExt(),
//普通模式
var normalMethod: NormalMethodExt = NormalMethodExt()) {
//0:打印函数调用栈 1:普通模式 运行时打印某个函数的耗时 全局业务代码函数插入
@Deprecated("已弃用,请在项目根目录的gradle.properties中通过DOKIT_METHOD_STRATEGY=0|1 来控制")
var strategy: Int = STRATEGY_STACK,
//函数功能开关
@Deprecated("已弃用,请在项目根目录的gradle.properties中通过DoKit_METHOD_SWITCH=true|false 来控制")
var methodSwitch: Boolean = false,
//函数调用栈模式
var stackMethod: StackMethodExt = StackMethodExt(),
//普通模式
var normalMethod: NormalMethodExt = NormalMethodExt()
) {
/**
......@@ -47,11 +48,13 @@ open class SlowMethodExt(
}
class StackMethodExt(
//默认阈值为5ms
var thresholdTime: Int = 5,
//入口函集合
var enterMethods: MutableSet<String> = mutableSetOf()) {
//默认阈值为5ms
var thresholdTime: Int = 5,
//入口函集合
var enterMethods: MutableSet<String> = mutableSetOf(),
//插桩黑名单
var methodBlacklist: MutableSet<String> = mutableSetOf()
) {
/**
* 默认值为5ms
......@@ -61,24 +64,29 @@ open class SlowMethodExt(
}
fun normalMethod(enterMethods: MutableSet<String>) {
fun enterMethods(enterMethods: MutableSet<String>) {
this.enterMethods = enterMethods
}
fun methodBlacklist(methodBlacklist: MutableSet<String>) {
this.methodBlacklist = methodBlacklist
}
override fun toString(): String {
return "StackMethodExt(thresholdTime=$thresholdTime, enterMethods=$enterMethods)"
return "StackMethodExt(thresholdTime=$thresholdTime, enterMethods=$enterMethods, methodBlacklist=$methodBlacklist)"
}
}
class NormalMethodExt(
//默认阈值为500ms
var thresholdTime: Int = 500,
//普通函数的插装包名集合
var packageNames: MutableSet<String> = mutableSetOf(),
//插桩黑名单
var methodBlacklist: MutableSet<String> = mutableSetOf()) {
//默认阈值为500ms
var thresholdTime: Int = 500,
//普通函数的插装包名集合
var packageNames: MutableSet<String> = mutableSetOf(),
//插桩黑名单
var methodBlacklist: MutableSet<String> = mutableSetOf()
) {
/**
* 默认值为500ms
*/
......
......@@ -4,21 +4,18 @@ import com.android.build.gradle.AppExtension
import com.android.build.gradle.api.ApplicationVariant
import com.android.build.gradle.api.BaseVariant
import com.android.build.gradle.api.LibraryVariant
import com.didichuxing.doraemonkit.plugin.DoKitExtUtil
import com.didichuxing.doraemonkit.plugin.*
import com.didichuxing.doraemonkit.plugin.extension.DoKitExt
import com.didichuxing.doraemonkit.plugin.isRelease
import com.didichuxing.doraemonkit.plugin.println
import com.didichuxing.doraemonkit.plugin.transform.*
import com.didiglobal.booster.gradle.getAndroid
import com.didiglobal.booster.gradle.isDynamicFeature
import com.didiglobal.booster.gradle.project
import com.didiglobal.booster.gradle.variantData
import com.didiglobal.booster.gradle.*
import com.didiglobal.booster.kotlinx.get
import com.didiglobal.booster.task.spi.VariantProcessor
import com.didiglobal.booster.transform.ArtifactManager
import com.didiglobal.booster.transform.artifacts
import com.didiglobal.booster.transform.util.ComponentHandler
import com.google.auto.service.AutoService
import org.gradle.api.Project
import org.gradle.api.artifacts.result.ResolvedArtifactResult
import javax.xml.parsers.SAXParserFactory
/**
......@@ -40,8 +37,25 @@ class DoKitPluginConfigProcessor : VariantProcessor {
if (variant.isRelease()) {
return
}
//查找application module下的配置
if (variant is ApplicationVariant) {
// if (DoKitExtUtil.OKHTTP_VERSION == "V3") {
// variant.project.dependencies.add(
// "implementation",
// "com.didichuxing.doraemonkit:dokit-okhttp_v3:3.2.0"
// )
// } else if (DoKitExtUtil.OKHTTP_VERSION == "V4") {
// variant.project.dependencies.add(
// "implementation",
// "com.didichuxing.doraemonkit:dokit-okhttp_v4:3.2.0"
// )
// }
//查找AndroidManifest.xml 文件路径
variant.artifacts.get(ArtifactManager.MERGED_MANIFESTS).forEach { manifest ->
val parser = SAXParserFactory.newInstance().newSAXParser()
......@@ -56,8 +70,29 @@ class DoKitPluginConfigProcessor : VariantProcessor {
variant.project.getAndroid<AppExtension>().let { appExt ->
//查找Application路径
val doKitExt = variant.project.extensions.getByType(DoKitExt::class.java)
DoKitExtUtil.init(doKitExt, appExt.defaultConfig.applicationId)
DoKitExtUtil.init(doKitExt, appExt.defaultConfig.applicationId!!)
}
//遍历三方库
val dependencies = variant.dependencies
DoKitExtUtil.THIRD_LIB_INFOS.clear()
for (artifactResult: ResolvedArtifactResult in dependencies) {
//println("三方库信息===>${artifactResult.variant.displayName}____${artifactResult.file.toString()}")
val paths = artifactResult.file.toString().split("/")
var fileName = ""
if (paths.size >= 4) {
fileName = "${paths[paths.size - 4]}/${paths[paths.size - 1]}"
} else {
fileName = paths[paths.size - 1]
}
val thirdLibInfo =
ThirdLibInfo(
fileName,
DoKitPluginUtil.FileSize(artifactResult.file)
)
DoKitExtUtil.THIRD_LIB_INFOS.add(thirdLibInfo)
}
} else {
"${variant.project.name}-不建议在Library Module下引入dokit插件".println()
}
......
......@@ -6,7 +6,7 @@ if (publishArchivesType == 1) {
mavenDeployer {
pom.project {
groupId "com.didichuxing.doraemonkit"
artifactId "doraemonkit-plugin"
artifactId "dokitx-plugin"
version rootProject.ext.android["pluginVersionName"]
}
......@@ -42,7 +42,7 @@ if (publishArchivesType == 1) {
mavenDeployer {
pom.project {
groupId "com.didichuxing.doraemonkit"
artifactId "doraemonkit-plugin"
artifactId "dokitx-plugin"
version rootProject.ext.android["pluginVersionName"]
}
pom.withXml {
......
......@@ -2,7 +2,7 @@ apply plugin: 'com.novoda.bintray-release'
// 配置发布 # script
publish {
def groupProjectID = 'com.didichuxing.doraemonkit'
def artifactProjectID = 'doraemonkit-plugin'
def artifactProjectID = 'dokitx-plugin'
def publishVersionID = "${rootProject.ext.android["pluginVersionName"]}"
userOrg = 'doraemonkit'
......
......@@ -63,6 +63,6 @@ dependencies {
if (rootProject.ext.config["runOrPublish"] == 0) {
api project(':doraemonkit')
} else {
api "com.didichuxing.doraemonkit:doraemonkit:${rootProject.ext.android["jcenterArchivesVersionName"]}"
api "com.didichuxing.doraemonkit:dokitx:${rootProject.ext.android["jcenterArchivesVersionName"]}"
}
}
......@@ -2,6 +2,8 @@ package com.didichuxing.doraemonkit.kit.weaknetwork;
import android.os.SystemClock;
import com.didichuxing.doraemonkit.okhttp_api.OkHttpWrap;
import java.io.IOException;
import didihttp.MediaType;
......@@ -39,7 +41,7 @@ public class RpcSpeedLimitRequestBody extends RequestBody {
if (mBufferedSink == null) {
//mBufferedSink = Okio.buffer(sink(sink));
//默认8K 精确到1K
mBufferedSink = new ByteCountBufferedSink(sink(sink), 1024L);
mBufferedSink = OkHttpWrap.INSTANCE.createByteCountBufferedSink(sink(sink), 1024L);
}
mRequestBody.writeTo(mBufferedSink);
mBufferedSink.close();
......
......@@ -6,7 +6,7 @@ if (publishArchivesType == 1) {
mavenDeployer {
pom.project {
groupId "com.didichuxing.doraemonkit"
artifactId "doraemonkit-rpc"
artifactId "dokitx-rpc"
version rootProject.ext.android["jcenterArchivesVersionName"]
}
......@@ -42,7 +42,7 @@ if (publishArchivesType == 1) {
mavenDeployer {
pom.project {
groupId "com.didichuxing.doraemonkit"
artifactId "doraemonkit-rpc"
artifactId "dokitx-rpc"
version rootProject.ext.android["jcenterArchivesVersionName"]
}
pom.withXml {
......
......@@ -2,7 +2,7 @@ apply plugin: 'com.novoda.bintray-release'
// 配置发布 # script
publish {
def groupProjectID = 'com.didichuxing.doraemonkit'
def artifactProjectID = 'doraemonkit-rpc'
def artifactProjectID = 'dokitx-rpc'
def publishVersionID = "${rootProject.ext.android["jcenterArchivesVersionName"]}"
userOrg = 'doraemonkit'
......
......@@ -46,7 +46,7 @@ dependencies {
if (rootProject.ext.config["runOrPublish"] == 0) {
api project(':doraemonkit')
} else {
api "com.didichuxing.doraemonkit:doraemonkit:${rootProject.ext.android["jcenterArchivesVersionName"]}"
api "com.didichuxing.doraemonkit:dokitx:${rootProject.ext.android["jcenterArchivesVersionName"]}"
}
compileOnly rootProject.ext.dependencies["weex_inspector"]
......
......@@ -6,7 +6,7 @@ if (publishArchivesType == 1) {
mavenDeployer {
pom.project {
groupId "com.didichuxing.doraemonkit"
artifactId "doraemonkit-weex"
artifactId "dokitx-weex"
version rootProject.ext.android["jcenterArchivesVersionName"]
}
......@@ -42,7 +42,7 @@ if (publishArchivesType == 1) {
mavenDeployer {
pom.project {
groupId "com.didichuxing.doraemonkit"
artifactId "doraemonkit-weex"
artifactId "dokitx-weex"
version rootProject.ext.android["jcenterArchivesVersionName"]
}
pom.withXml {
......
......@@ -86,8 +86,13 @@ dependencies {
implementation rootProject.ext.dependencies["ktor-core"]
implementation rootProject.ext.dependencies["ktor-cio"]
implementation rootProject.ext.dependencies["jsoup"]
//okhttp
implementation project(":doraemonkit-okhttp-api")
//okhttp wrap
if (rootProject.ext.config["runOrPublish"] == 0) {
implementation project(":doraemonkit-okhttp-api")
} else {
implementation "com.didichuxing.doraemonkit:dokitx-okhttp-api:${rootProject.ext.android["jcenterArchivesVersionName"]}"
}
//compileOnly project(":doraemonkit-okhttp_v4")
// implementation rootProject.ext.dependencies["mimecraft"]
......
......@@ -6,7 +6,7 @@ if (publishArchivesType == 1) {
mavenDeployer {
pom.project {
groupId "com.didichuxing.doraemonkit"
artifactId "doraemonkit"
artifactId "dokitx"
version rootProject.ext.android["jcenterArchivesVersionName"]
}
......@@ -42,7 +42,7 @@ if (publishArchivesType == 1) {
mavenDeployer {
pom.project {
groupId "com.didichuxing.doraemonkit"
artifactId "doraemonkit"
artifactId "dokitx"
version rootProject.ext.android["jcenterArchivesVersionName"]
}
pom.withXml {
......
......@@ -2,7 +2,7 @@ apply plugin: 'com.novoda.bintray-release'
// 配置发布 # script
publish {
def groupProjectID = 'com.didichuxing.doraemonkit'
def artifactProjectID = 'doraemonkit'
def artifactProjectID = 'dokitx'
def publishVersionID = "${rootProject.ext.android["jcenterArchivesVersionName"]}"
userOrg = 'doraemonkit'
......
/build
\ No newline at end of file
plugins {id 'com.android.application'}
android {
compileSdkVersion rootProject.ext.android["compileSdkVersion"]
defaultConfig {
applicationId rootProject.ext.android["applicationId"]
minSdkVersion rootProject.ext.android["minSdkVersion"]
targetSdkVersion rootProject.ext.android["targetSdkVersion"]
versionCode rootProject.ext.android["versionCode"]
versionName rootProject.ext.android["versionName"]
multiDexEnabled true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.1.0'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
\ No newline at end of file
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
\ No newline at end of file
package com.jin.empey_app
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.Assert.*
/**
* Instrumented test, which will execute on an Android device.
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest {
@Test
fun useAppContext() {
// Context of the app under test.
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
assertEquals("com.jin.empey_app.test", appContext.packageName)
}
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.didichuxing.doraemondemo">
<application
android:allowBackup="false"
android:icon="@mipmap/dk_app_icon"
android:label="@string/app_name"
android:requestLegacyExternalStorage="true"
android:roundIcon="@mipmap/dk_app_icon"
android:supportsRtl="true"
android:theme="@style/AppTheme"
>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
\ No newline at end of file
package com.didichuxing.doraemondemo;
import android.os.Bundle;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
/**
* ================================================
* 作 者:jint(金台)
* 版 本:1.0
* 创建日期:2020/10/27-14:23
* 描 述:
* 修订历史:
* ================================================
*/
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="dokit"
android:textColor="#333333"
android:textSize="36sp" />
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#3F51B5</color>
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
</resources>
<resources>
<string name="app_name">DoKitJavaDemo</string>
</resources>
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
</resources>
package com.jin.empey_app
import org.junit.Test
import org.junit.Assert.*
/**
* Example local unit test, which will execute on the development machine (host).
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
class ExampleUnitTest {
@Test
fun addition_isCorrect() {
assertEquals(4, 2 + 2)
}
}
\ No newline at end of file
//include ':empey-app'
include ':app'
include ':doraemonkit'
//include ':doraemonkit-rpc'
//include ':doraemonkit-no-op'
include ':doraemonkit-rpc'
include ':doraemonkit-no-op'
include ':doraemonkit-okhttp-v3'
include ':doraemonkit-okhttp-v4'
include ':doraemonkit-okhttp-api'
include ':doraemonkit-weex'
include ':doraemonkit-leakcanary'
//include ':doraemonkit-leakcanary'
include ':doraemonkit-plugin'
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册