修改Jar文件中代码

2021-07-07  本文已影响0人  放羊娃华振

一、为何要修改Jar文件中代码?

假如项目中用了一个很老的版本的jar包,现在发现有问题,但是🈶联系不到原作者修改。这种情况下,如果我嫩看懂里面的代码逻辑,也知道怎么修改,我们就可以在没有源码的情况下对jar里面的代码进行修改。
又或者自己就是个小项目,用了牛逼哄哄的大公司的sdk,人家也不会针对你的需求进行定制化开发,这时候也可以尝试修改jar来满足我能的需求。

二、如何操作?

2.1、熟悉需要修改的jar的代码逻辑,可以看代码打断点啥的。
2.2、使用jd-gui反编译jar包,通过file->Save all Sources把原始的jar代码保存成zip文件。
2.3、解压zip文件,可以看到反编译之后的java文件代码了。
2.4、这里的代码直接运行是有问题,你需要使用java编译器新建一个跟需要修改的jar结构一样的工程,并且修改里面的所有报错信息。
2.5、修改你要改的的类的逻辑,假如有个方法需要修改,你就可以重新这个方法。
2.6、重新编译修改后的工程,生成.class文件。
2.7、切换到原始文件解压后的目录中,用2.6生成的class文件覆盖老的class文件。
2.8、把老的jar文件、和解压的目录文件放在一起


image.png

2.9、执行打包成jar的命令:

//命令的意思就是把lib_test目录下的文件归档到lib_test.jar中
jar cvfm lib_test.jar lib_test/META-INF/MANIFEST.MF -C lib_test/ .

当这个指令没有报错,就可以看到生成的新的jar了,之后反编译下,可以发现已经有新的代码了。
最后加上jar命令的用法:

用法: jar {ctxui}[vfmn0PMe] [jar-file] [manifest-file] [entry-point] [-C dir] files ...
选项:
    -c  创建新档案
    -t  列出档案目录
    -x  从档案中提取指定的 (或所有) 文件
    -u  更新现有档案
    -v  在标准输出中生成详细输出
    -f  指定档案文件名
    -m  包含指定清单文件中的清单信息
    -n  创建新档案后执行 Pack200 规范化
    -e  为捆绑到可执行 jar 文件的独立应用程序
        指定应用程序入口点
    -0  仅存储; 不使用任何 ZIP 压缩
    -P  保留文件名中的前导 '/' (绝对路径) 和 ".." (父目录) 组件
    -M  不创建条目的清单文件
    -i  为指定的 jar 文件生成索引信息
    -C  更改为指定的目录并包含以下文件
如果任何文件为目录, 则对其进行递归处理。
清单文件名, 档案文件名和入口点名称的指定顺序
与 'm', 'f' 和 'e' 标记的指定顺序相同。

示例 1: 将两个类文件归档到一个名为 classes.jar 的档案中: 
       jar cvf classes.jar Foo.class Bar.class 
示例 2: 使用现有的清单文件 'mymanifest' 并
           将 foo/ 目录中的所有文件归档到 'classes.jar' 中: 
       jar cvfm classes.jar mymanifest -C foo/ .

三、##AAR如何修改?
大致分文修改classes.jar文件和布局文件,jar文件修改同上。布局文件文件修改可以参考有个大哥总结的文章:https://www.jianshu.com/p/bdb62f36bc62

上一篇下一篇

猜你喜欢

热点阅读