172 lines
6.8 KiB
Java
172 lines
6.8 KiB
Java
package com.tencent.wework;
|
||
|
||
//import java.lang.management.ManagementFactory;
|
||
//import java.lang.management.RuntimeMXBean;
|
||
|
||
/**
|
||
* @warning: 1. 不要修改成员变量名,native方法内有反射调用
|
||
* 2. 调用本地方法需保持包结构,本工具需放在包com.tencent.wework内
|
||
* 3. 不允许继承,类名和函数名均不可修改,会影响本地方法的引用,详见:javah生成本地方法头文件
|
||
* 4. 使用其他工具打印的日志将无法被查询,如需使用SLF4j风格的日志或性能更好的日志框架,
|
||
* 请自行封装SpecUtil.SpecLog或SpecUtil.SpecLogNative方法
|
||
*
|
||
* @usage: 1. 获取SDK的版本号
|
||
* 2. 打印三个级别的日志
|
||
* 3. 开启调试模式
|
||
*/
|
||
public final class SpecUtil {
|
||
|
||
/**
|
||
* @description SDK版本号
|
||
* @usage 可用于校对不同SDK版本,或后续针对不同的SDK版本添加业务逻辑
|
||
*/
|
||
private static final String SDK_VERSION = "1.4.0";
|
||
|
||
public static String GetSDKVersion() {
|
||
return SDK_VERSION;
|
||
}
|
||
|
||
/**
|
||
* @description 正确的包名,SDK必须存放在"com.tencent.wework"下,否则会影响本地方法的调用
|
||
*/
|
||
private static final String EXPECTED_PACKAGE_NAME = "com.tencent.wework";
|
||
|
||
public static String GetExpectedPackageName() {
|
||
return EXPECTED_PACKAGE_NAME;
|
||
}
|
||
|
||
private static final String LINE_SEPERATOR = System.getProperty("line.separator");
|
||
|
||
public static void WWSpecLogInfo(String... args) {
|
||
SpecLog('I', args);
|
||
}
|
||
|
||
public static void WWSpecLogError(String... args) {
|
||
SpecLog('E', args);
|
||
}
|
||
|
||
public static void WWSpecLogDebug(String... args) {
|
||
SpecLog('D', args);
|
||
}
|
||
|
||
public static void WWSpecLogInfoWithReqId(String reqId, String... args) {
|
||
SpecLogWithReqId(reqId, 'I', args);
|
||
}
|
||
|
||
public static void WWSpecLogErrorWithReqId(String reqId, String... args) {
|
||
SpecLogWithReqId(reqId, 'E', args);
|
||
}
|
||
|
||
public static void WWSpecLogDebugWithReqId(String reqId, String... args) {
|
||
SpecLogWithReqId(reqId, 'D', args);
|
||
}
|
||
|
||
/**
|
||
* @usage 打印标准日志
|
||
* @note 只有使用SpecLog和SpecLogNative函数打印的日志能被调试平台查询,其他框架的日志仅能本地查看
|
||
* @param logLevel 日志级别,使用char传递,目前支持I——INFO、E——ERROR、D——DEBUG
|
||
* @param args 自定义参数
|
||
*/
|
||
public static void SpecLog(char logLevel, String... args) {
|
||
StackTraceElement element = Thread.currentThread().getStackTrace()[3];
|
||
SpecLogNative(
|
||
logLevel,
|
||
element.getFileName(),
|
||
element.getLineNumber(),
|
||
String.join(",", args).replace(LINE_SEPERATOR, " ")
|
||
);
|
||
}
|
||
|
||
/**
|
||
* @usage 打印标准日志
|
||
* @note 只有使用SpecLog和SpecLogNative函数打印的日志能被调试平台查询,其他框架的日志仅能本地查看
|
||
* @param reqid 请求id
|
||
* @param logLevel 日志级别,使用char传递,目前支持I——INFO、E——ERROR、D——DEBUG
|
||
* @param args 自定义参数
|
||
*/
|
||
public static void SpecLogWithReqId(String reqId, char logLevel, String... args) {
|
||
StackTraceElement element = Thread.currentThread().getStackTrace()[3];
|
||
SpecLogNativeWithReqId(
|
||
reqId,
|
||
logLevel,
|
||
element.getFileName(),
|
||
element.getLineNumber(),
|
||
String.join(",", args).replace(LINE_SEPERATOR, " ")
|
||
);
|
||
}
|
||
|
||
/**
|
||
* @usage 打印标准日志
|
||
* @note 只有使用SpecLog和SpecLogNative函数打印的日志能被调试平台查询,其他框架的日志仅能本地查看
|
||
* 如需SLF4J风格的接口或对日志性能有进一步需求,开发者可以自行封装该函数
|
||
* @param logLevel 日志级别,使用char传递,目前支持I——INFO、E——ERROR、D——DEBUG
|
||
* @param fileName 文件名(类名)
|
||
* @param lineNumber 行号
|
||
* @param argsString 自定义参数
|
||
*/
|
||
public static native void SpecLogNative(char logLevel, String fileName, int lineNumber, String argsString);
|
||
|
||
/**
|
||
* @usage 打印标准日志
|
||
* @note 只有使用SpecLog和SpecLogNative函数打印的日志能被调试平台查询,其他框架的日志仅能本地查看
|
||
* 如需SLF4J风格的接口或对日志性能有进一步需求,开发者可以自行封装该函数
|
||
* @param reqid 请求id
|
||
* @param logLevel 日志级别,使用char传递,目前支持I——INFO、E——ERROR、D——DEBUG
|
||
* @param fileName 文件名(类名)
|
||
* @param lineNumber 行号
|
||
* @param argsString 自定义参数
|
||
*/
|
||
public static native void SpecLogNativeWithReqId(String reqId, char logLevel, String fileName, int lineNumber, String argsString);
|
||
|
||
|
||
|
||
/**
|
||
* @usage 开启调试模式,进程级别开关
|
||
* @param debugToken 调试凭证,在管理端获取
|
||
* @param accessToken 应用access token
|
||
* @return 是否开启成功
|
||
*/
|
||
public static boolean SpecOpenDebugMode(String debugToken, String accessToken) {
|
||
return SpecOpenDebugModeNative(debugToken, accessToken);
|
||
}
|
||
|
||
private static native boolean SpecOpenDebugModeNative(String debugToken, String accessToken);
|
||
|
||
/**
|
||
* @usage 生成notify id。用户可调用本接口生成notify id,也可完全自定义生成
|
||
* @return 新的notify id,支持纳秒级隔离,内部异常时会输出日志并返回空串
|
||
* @note 1. 用户可先生成notify id,将其与回调数据关联存储后,再使用该notify id通知应用,
|
||
* 从而保证回调数据被请求时已存储完毕
|
||
*/
|
||
public static String GenerateNotifyId() {
|
||
return GenerateNotifyIdNative();
|
||
}
|
||
|
||
private static native String GenerateNotifyIdNative();
|
||
|
||
static {
|
||
// 检查包名
|
||
String packageName = SpecUtil.class.getPackage().getName();
|
||
if (!EXPECTED_PACKAGE_NAME.equals(packageName)) {
|
||
// 静态代码块内还无法调用native日志函数,这里的日志在管理系统无法查询
|
||
System.out.println("SpecUtil class must be in package com.tencent.wework");
|
||
System.exit(1);
|
||
}
|
||
|
||
// 加载so库
|
||
try {
|
||
System.loadLibrary("WeWorkSpecSDK");
|
||
} catch (UnsatisfiedLinkError e) {
|
||
System.out.println("libWeWorkSpecSDK.so not found in java.library.path");
|
||
e.printStackTrace();
|
||
System.exit(1);
|
||
} catch (Exception e) {
|
||
System.out.println("unexpected exception: " + e.getMessage());
|
||
e.printStackTrace();
|
||
System.exit(1);
|
||
}
|
||
|
||
SpecUtil.WWSpecLogInfo("SDK init done", "packageName=" + packageName, "SDK_VERSION=" + SDK_VERSION);
|
||
}
|
||
}
|