1
bunnyblueair 1 天前
ProGuard
|
2
4ra1n OP ProGuard 主要是两个问题,第一个配置非常麻烦,不是容易上手的方式
另外一个问题是,它应该是静态分析的引用关系,而不是动态决定的,比如反射问题,某些功能如果是运行时候决定是否调用某个类的,是无法处理的 |
3
foolishcrab 1 天前
可行,不需要考虑对应用性能影响的时候这个是很简单的东西。
叫 reachability analysis, native image 就有一个专门的 agent 来收集 runtime reflection metadata 之类的东西。 其实这个方案最大的问题在于你帖子里的第二步,对于一个大型软件而言这是很难的,所以一般要在生产上挂着用真实流量收集,这样的话就需要考虑 agent 的性能影响。这里就不展开了 |
4
sagaxu 1 天前
java --verbose:class 找出用到的所有 class 和 jar 包,删掉没用的 jar 包,甚至 jar 包内部删掉无用的 class
|
5
chendy 1 天前
fat jat 解压开,依赖的 jar 包放某个共享目录
所有项目挂在这个共享目录,然后配好 classpath 比较丑陋,但是确实能用 |
6
4ra1n OP 已经实现了,大概是:
capabilities.can_generate_all_class_hook_events = 1; (*jvmti)->AddCapabilities(jvmti, &capabilities); callbacks.ClassFileLoadHook = &ClassLoadHook; 在 ClassLoadHook 函数中做收集 java 启动参数 -agentpath:/path/to/agent.dll 可以收集所有加载的 class 信息,动态地 |
7
4ra1n OP 我发现不能对 ClassFile 做操作,有时候取到的 name 是 null
callbacks.ClassFileLoadHook = &ClassLoadHook; 使用 ClassLoad 会更靠谱 callbacks.ClassLoad = &ClassLoadHook; void JNICALL ClassLoadHook( jvmtiEnv *jvmti_env, JNIEnv *jni_env, jthread thread, const jclass klass) { char *classSignature; char *genericPtr; const jvmtiError err = (*jvmti_env)->GetClassSignature( jvmti_env, klass, &classSignature, &genericPtr); if (err != JVMTI_ERROR_NONE) { LOG_JVM(jni_env,"ERROR GET CLASS SIGNATURE"); return; } DoAnalyze(jni_env,classSignature); (*jvmti_env)->Deallocate(jvmti_env, (unsigned char *) classSignature); if (genericPtr != NULL) { (*jvmti_env)->Deallocate(jvmti_env, (unsigned char *) genericPtr); } } |