有没有什么思路对 Fat Jar 进行瘦身

1 天前
 4ra1n
考虑到反射或者懒加载等内容,我思路是这样的:

1. 启动时挂一个 java agent 上去,内容是 hook 加载本地 jar 文件的方法
2. 用户尝试自己需要的功能,例如注册/登录/管理后台等等,完全做一遍
3. 然后看整个流程中 java agent 这边记录的,都加载了哪些 jar 文件
4. 对比存在的 jar 得出一个可以删掉的 jar 列表

请教下这个思路是否可行,以及我需要 hook 的类应该是哪些,或者有没有更好的思路
949 次点击
所在节点    Java
7 条回复
bunnyblueair
1 天前
ProGuard
4ra1n
1 天前
ProGuard 主要是两个问题,第一个配置非常麻烦,不是容易上手的方式

另外一个问题是,它应该是静态分析的引用关系,而不是动态决定的,比如反射问题,某些功能如果是运行时候决定是否调用某个类的,是无法处理的
foolishcrab
1 天前
可行,不需要考虑对应用性能影响的时候这个是很简单的东西。
叫 reachability analysis, native image 就有一个专门的 agent 来收集 runtime reflection metadata 之类的东西。

其实这个方案最大的问题在于你帖子里的第二步,对于一个大型软件而言这是很难的,所以一般要在生产上挂着用真实流量收集,这样的话就需要考虑 agent 的性能影响。这里就不展开了
sagaxu
1 天前
java --verbose:class 找出用到的所有 class 和 jar 包,删掉没用的 jar 包,甚至 jar 包内部删掉无用的 class
chendy
1 天前
fat jat 解压开,依赖的 jar 包放某个共享目录
所有项目挂在这个共享目录,然后配好 classpath
比较丑陋,但是确实能用
4ra1n
12 小时 25 分钟前
已经实现了,大概是:

capabilities.can_generate_all_class_hook_events = 1;
(*jvmti)->AddCapabilities(jvmti, &capabilities);
callbacks.ClassFileLoadHook = &ClassLoadHook;

在 ClassLoadHook 函数中做收集

java 启动参数 -agentpath:/path/to/agent.dll

可以收集所有加载的 class 信息,动态地
4ra1n
6 小时 11 分钟前
我发现不能对 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);
}
}

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1100793

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX