前言:
总共三步走:1. native 代码;2. 编译打包so;3. java 层 attach。
具体监听可以得到什么数据,数据怎么用不在该篇的叙述范围之内。
写 native 代码
随便找个地方创建一个 jni 文件夹
关键的代码如下:
# Application.mk
APP_ABI := arm64-v8a # armeabi-v7a x86 # 你需要生成什么版本的 so
# Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := monitor_agent # 唯一的模块名,默认生成为 lib<name>.so
LOCAL_LDLIBS := -llog # 依赖 native 的日志 lib
LOCAL_SRC_FILES := agentlib.cpp # 自己的资源文件
include $(BUILD_SHARED_LIBRARY)
/*** jvmti.h ***/
直接去 JDK 里面 CV 一个 jvmti.h 出来。MAC 中的位置见下图。
/*** agentlib.cpp ***/
void JNICALL
objectAlloc(jvmtiEnv
*jvmti_env,
JNIEnv *jni_env, jthread
thread,
jobject object, jclass
object_klass,
jlong size
) {
// 对象创建,这里可以记录一下
}
void JNICALL
objectFree(jvmtiEnv *jvmti_env,jlong tag) {
// 对象释放
}
extern "C"
JNIEXPORT void JNICALL
Java_com_tencent_qjvmti_Monitor_agent_1init(JNIEnv *env, jclass clazz
) {