整理JRE瘦身或精简JRE

http://blog.csdn.net/xiaoping8411/article/details/6973887

版权声明:本文为博主原创文章,未经博主允许不得转载。

前不久给朋友做了一个桌面程序,程序文件没多大,但运行java程序需要jre,但jre足足有80M多,然后在网上搜了如何给给JRE瘦身或精简JRE,整理如下:

打开JRE安装目录.目录包括bin,lib二个文件夹,所以就是将这两个文件进行瘦身了,

1. bin: 可以认为这是Java虚拟机.

2. lib: 执行class文件时,Java虚拟机需要用到的类库及资源文件.

一、bin瘦身主要从两方面考虑

① exe文件,最主要的工具是java.exe,它用来执行class文件,如果只是为了单纯运行Java程序的话,其他可执行文件一般都是用不到的(可剔除).

② DLL文件,是java.exe执行class文件过程中调用的,执行class文件,java.exe需要哪个库文件就加载哪个dll,不需用的可以剔除.

我们要做的就是找到哪些DLL文件是有用?我们运行一个Java文件看看,可以利用360安全卫士得到

1、准备java文件:

[html] view plain copy

  1. /*
  2. @author jarg
  3. @TODO 举例查看当前程序必需的dll文件
  4. */
  5. import java.io.InputStreamReader;
  6. import java.io.IOException;
  7. public class Hello
  8. {
  9. public static void main(String[] args) throws IOException
  10. {
  11. InputStreamReader ir = new InputStreamReader(System.in);
  12. System.out.println("Hello");
  13. ir.read();
  14. }
  15. }

2、编译、运行

3、360安全卫士 -> 功能大全 -> 进程管理器 右上角的显示加载到当前选中进程中的dll

4、这样我们留下java.exe、有用的dll文件和client目录就行

到这里bin的瘦身成功!

二、lib的瘦身

① lib目录最主要的类库是rt.jar,是任意Java程序所必需的类库.
lib目录大约62MB,但是rt.jar类库就占了47MB,可见精简bin目录,最主要是裁剪rt.jar.

② lib目录下一个运行Java程序不可或缺的文件是位于i386下的虚拟机配置文件jvm.cfg.该配置文件用来管理不同版本的jvm.dll.其内容作为java.exe,javac.exe的全局变量,用来加载相应的动态链接库文件.

③ lib目录里面除了包含程序运行所需要的类库及配置文件外,还包含有一些诸如: 鼠标光标,字体等系统资源.简单程序如果未用到这部分资源的话,可以剔除.如果程序除去JRE部分,占用空间较大的话,为了避除资源加载错误带来的麻烦,建议保留这不到20MB的配置文件内容.

主要步骤如下:

1、提取我们需要的类库(jar),借助-verbose命令,查看虚拟机在运行Java程序时所加载的所有类,如:

[plain] view plain copy

  1. @echo off
  2. C:/Java/jdk1.6.0_16/bin/java -jar  -classpath lib/*.jar; -verbose:class printSoft.jar >> class.txt
  3. pause

在class.txt文件中保存如下的信息:

[plain] view plain copy

  1. [Loaded java.lang.Math from shared objects file]
  2. [Loaded java.nio.charset.Charset$3 from C:\Java\jdk1.6.0_16\jre\lib\rt.jar]
  3. [Opened C:\Java\jdk1.6.0_16\jre\lib\charsets.jar]
  4. [Loaded sun.nio.cs.AbstractCharsetProvider from C:\Java\jdk1.6.0_16\jre\lib\rt.jar]
  5. [Loaded sun.nio.cs.ext.ExtendedCharsets from C:\Java\jdk1.6.0_16\jre\lib\charsets.jar]
  6. [Loaded java.lang.Class$1 from shared objects file]
  7. [Loaded sun.reflect.ReflectionFactory$1 from shared objects file]
  8. [Loaded sun.reflect.NativeConstructorAccessorImpl from shared objects file]

我们可以从class.txt中得到我们需要的jar文件和class文件,提交jar很简单,我就不说了,下面我们在看看如何提交我们用到的class文件:

由于class.txt每行都是形同: [Loaded java.lang.System from shared objects file]的一串字符,修改文本以方便获取类完整名java.lang.System,从而获得类似类路径java/lang/System的一串字符,方便后继编写类拷贝程序.
修改方法:
1. 查找并替换[Loaded 为空,达到删除[Loaded 的目的.
2. 使用任意一个具有正则表达式查找替换功能的文本编辑器,查找并替换 from.*为空,达到删除 from及其后面的字符串的目的.
3. 查找并替换.为/
4. 删除以[Opened 开头的行.
5. 删除程序中System.out.println的输出行.
提取之后class.txt就剩下如下信息:

[plain] view plain copy

  1. java/lang/Object
  2. java/io/Serializable
  3. java/lang/Comparable
  4. java/lang/CharSequence
  5. java/lang/String
  6. java/lang/reflect/GenericDeclaration
  7. .......

2、从现有的jar包中提取我们整理的class文件,然后打包成jar,最终取代原有的jar,下面是一个提取class的工具类:

[java] view plain copy

  1. import java.io.BufferedReader;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.io.InputStreamReader;
  7. public class CopyClass
  8. {
  9. private String source = "C:\\Users\\lzp\\Desktop\\printSoft\\jre6\\lib\\";      // 类源目录
  10. private String dest = "C:\\Users\\lzp\\Desktop\\printSoft\\jre6\\lib\\";        // 类拷贝目的目录
  11. String[] jarArr = new String[]{"rt","charsets"};
  12. /***
  13. *
  14. * @param source 类源目录
  15. * @param dest   类拷贝目的目录
  16. * @param jarArr 需要的提取的jar文件
  17. */
  18. public CopyClass(String source,String dest,String[] jarArr){
  19. this.source=source;
  20. this.dest=dest;
  21. this.jarArr=jarArr;
  22. }
  23. public static void main(String[] args)
  24. {
  25. String[] jarArr = new String[]{"rt","charsets"};
  26. CopyClass obj = new CopyClass("C:\\Users\\lzp\\Desktop\\printSoft\\jre6\\lib\\",

[java] view plain copy

  1. "C:\\Users\\lzp\\Desktop\\printSoft\\jre6\\lib\\",jarArr);
  2. obj.readAndCopy("C:\\Users\\lzp\\Desktop\\printSoft\\class.txt");
  3. }
  4. /***
  5. * @param logName 提取class明细
  6. */
  7. public void readAndCopy(String logName)
  8. {
  9. int count = 0;  // 用于记录成功拷贝的类数
  10. try
  11. {
  12. FileInputStream fi = new FileInputStream(logName);
  13. InputStreamReader ir = new InputStreamReader(fi);
  14. BufferedReader br = new BufferedReader(ir);
  15. String string = br.readLine();
  16. while(string != null)
  17. {
  18. if(copyClass(string) == true)
  19. count++;
  20. else
  21. System.out.println("ERROR " + count + ": " + string);
  22. string = br.readLine();
  23. }
  24. }
  25. catch (IOException e)
  26. {
  27. System.out.println("ERROR: " + e);
  28. }
  29. System.out.println("count: " + count);
  30. }
  31. /***
  32. * 从原jar路径提取相应的类到目标路径,如将java/lang/CharSequence类从rt目录提取到rt1目录
  33. * @param string 提取类的全路径
  34. * @return
  35. * @throws IOException
  36. */
  37. public boolean copyClass(String string) throws IOException
  38. {
  39. String classDir = string.substring(0,string.lastIndexOf("/"));
  40. String className = string.substring(string.lastIndexOf("/")+1,string.length()) + ".class";
  41. boolean result =false;
  42. for(String jar : jarArr){
  43. File srcFile = new File(source + "/"+jar+"/" + classDir + "/" + className);
  44. if(!srcFile.exists())
  45. {
  46. continue;
  47. }
  48. byte buf[] = new byte[256];
  49. FileInputStream fin = new FileInputStream(srcFile);
  50. /* 目标目录不存在,创建 */
  51. File destDir = new File(dest + "/"+jar+"1/" + classDir);
  52. if(!destDir.exists())
  53. destDir.mkdirs();
  54. File destFile = new File(destDir + "/" + className);
  55. FileOutputStream fout = new FileOutputStream(destFile);
  56. int len = 0;
  57. while((len = fin.read(buf)) != -1)
  58. {
  59. fout.write(buf,0,len);
  60. }
  61. fout.flush();
  62. result = true;
  63. break;
  64. }
  65. return result;
  66. }
  67. }

然后在将提取的class文件打包成jar文件,利用jar命令进行打包,然后替换以前的jar文件,这样lib就从以前的六十多M到几M多有,如图:

这样我们就完成了jre的瘦身!

时间: 2024-10-20 00:35:41

整理JRE瘦身或精简JRE的相关文章

JRE“瘦身”&桌面程序集成JRE

项目是一个桌面程序,程序文件不大,但运行jre有198 MB,因此需要"瘦身". jre包含bin.lib两部分,分别为93.6 MB.104 MB. 1.精简bin 运行桌面程序,进入bin目录,删除所有能删的:删完之后重新运行,直到正常运行. 过程中发现server目录下的classes.jsa是18.3 MB,删除后程序正常运行. 精简后bin为11.1 MB. 2.精简lib 发现rt.jar包大小60.6 MB,因此首先精简rt.jar包. 精简rt.jar主要步骤如下: (

精简JRE的思路初探

引言: JRE是Java程序赖以运行的基础环境,目前JRE已经非常的庞大;即使为了运行一个简单的Hello World的程序,可能依然需要依赖整个JRE,将近百兆大小的依赖性.是否可以对特定Java程序依赖的JRE进行精简呢? 当然是可以,根据当前代码的需要,动态精简JRE,只依赖需要的class,而非全部. 1.  整体的思路 a.  首先找到当前Java程序依赖的所有class,包括自身类库/第三方类库,以及JRE中的类库. b.   将JRE中不需要的类库文件移除掉,只保留需要的类库. C

win7 系统盘怎样瘦身! 可整理出4-5G。

1.移走虚拟内存文件到非系统盘 大家都知道,为了加快系统的执行,Windows提供了虚拟内存机制,而在Windows7中,默认是开启这项功能的,并且虚拟内存文件在系统盘.比方一台2G内存的机器,虚拟内存文件大小就是2G,我们全然能够将他移走,为系统盘剩下空间. 详细设置过程: 第一步,右键点击桌面上的我的电脑(Computer),选择属性(Properties).大家会看到系统关于界面,在此窗体左上角的系统高级设置(Advanced System settings). 第二步:在新弹窗的设置窗体

为Windows 7的winsxs目录瘦身,谨慎。

刚使用Win7 系统不久,前段时间在清理系统垃圾时发现,win7系统的windows文件夹下的winsxs 文件夹占用空间很大,想清理之,却提示无权限无法清理.随即在网上查了个到底,原来winsxs是一个超大的文件仓库,系统所在分区差点儿全部的系统文件都在那里至少有一个备份.并且随着系统的使用,winsxs的所占的空间还将不断的积累壮大,终于将吞噬整个系统分区的磁盘空间.以下附上搜索来的一篇winsxs的具体描写叙述文摘.winsxs的瘦身方法和一篇关于 DLL Hell问题 的描写叙述文摘和大

Android性能优化系列之apk瘦身

Android性能优化系列之布局优化 Android性能优化系列之内存优化 为什么APK要瘦身.APK越大,在下载安装过程中,他们耗费的流量会越多,安装等待时间也会越长:对于产品本身,意味着下载转化率会越低(因为竞品中,用户有更多机会选择那个体验最好,功能最多,性能最好,包最小的),所以apk的瘦身优化也很重要,本篇博客将讲述apk瘦身的相关内容. 包体分析 在Android Studio工具栏里,打开build–>Analyze APK, 选择要分析的APK包 可以看到占用空间的主要是代码.图

APK瘦身记,如何实现高达53%的压缩效果

作者:非戈@阿里聚安全 1.我是怎么思考这件事情的 APK是Android系统安装包的文件格式,关于这个话题其实是一个老生常谈的题目,不论是公司内部,还是外部网络,前人前辈已经总结出很多方法和规律.不过随着移动端技术近两年的飞速发展,一些新的思维方式和优化方法也逐渐涌现和成熟起来.笔者在实践过程中踩过一些坑,收获了一些经验,在这里做个思考和总结,所以随笔给大家,希望对大家从事相关工作的时候有所帮助和参考,同时也是抛砖引玉,希望大家共同探讨这个开放性的话题. 关于为什么APK要瘦身,这个不多说,只

apk瘦身 提高优化效果

APK瘦身记,如何实现高达53%的压缩效果 我是怎么思考这件事情的 APK是Android系统安装包的文件格式,关于这个话题其实是一个老生常谈的题目,不论是公司内部,还是外部网络,前人前辈已经总结出很多方法和规律.不过随着移动端技术近两年的飞速发展,一些新的思维方式和优化方法也逐渐涌现和成熟起来.笔者在实践过程中踩过一些坑,收获了一些经验,在这里做个思考和总结,所以随笔给大家,希望对大家从事相关工作的时候有所帮助和参考,同时也是抛砖引玉,希望大家共同探讨这个开放性的话题. 关于为什么APK要瘦身

[Android 之美] 那些你不知道的APK 瘦身,让你的APK更小

[Android 之美] APK 瘦身,减少APK的大小 让你的apk文件尽可能小,应该使移除未使用的代码和资源文件.那么本章节介绍了如何做到让APK更小,性能更好,下载转化率会更高,以及如何指定在构建APK过程中保留或移除的代码和资源,在我们还没有分析APK大小之前,项目中存在一些资源放置处理不当,没有统一的规范,依赖管理不合理,资源重叠,dex方法数过多等问题,导致APK文件比较大,公司要求APK体积大小要优化到3M左右.经过我们的努力终于达到要求,然而我们发现还能再小. Android 之

安卓APK瘦身

之前打包的时候直接就用eclipse或者android studio直接生成签名文件,并没有关心大小问题,近期有人问我有没有对APK进行瘦身.对这方面内容一致没有关注过,今天试用了各种方式把项目签名apk降低了1/4大小.这样对用户节省了流量. 1.APK文件分析 APK是Android的安装包. APK文件事实上是zip格式,可是后缀被改动为apk,我们能够直接解压文件夹例如以下: 分析一下各个内容的作用 查看文件/文件夹大小主要针对assets.classes.dex.lib.res内容进行