我有一个第三方 jar 包,咋们一起修改 class 文件吧

深大村长.jpg

你有遇到适用的场景吗

你有没有遇到需要修改 class 文件重新打包的场景呢?

巧得很,最近刚好遇到需要修改一个已存在的 jar 包,为了满足自己的需求,

不过对于 class 文件修改的是比较简单的字符常量,尚未涉及到比较复杂的逻辑,

用于记录一下如何修改,如何快速修改完成需求,希望可以抛砖引玉,剩下的较为复杂的逻辑修改就交给你们了 😃

比如我有这样一个修改 class 文件的场景:

  • 问题:
    某弹窗文本显示不正确

image.png

  • 描述:

此弹窗代码是在某第三方 jar 包里,显示内容格式是: 客服:配置内容

我的需求是不需要 jar 内置的固定格式(看代码其实就是字符串拼接),我需要去掉 客服: 这个固定前缀,让配置内容更加灵活,

  • 预期:
    比如我想要的显示效果是:客服QQ:2464113103

image.png

那么想要实现这个,我想到的是通过修改 jar 包,去除显示格式 客服: 固定前缀,实现内容灵活配置。

这里简单记录两种修改方式

稍微温故 jar 命令

  • jar 简洁手册:

jar -h

用法: 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' 标记的指定顺序相同。
  • 打包生成 jar
    将两个 class 文件打包为 classes.jar 文件
jar cvf classes.jar Foo.class Bar.class

将 folder/ 目录下的所有文件打包成 classes.jar 文件

jar cvf classes.jar -C folder/ .
  • 查看 jar 文件列表:
jar -tvf classes.jar
  • 解压 jar 文件:
jar -xvf classes.jar

工具下载

方式一:javac 命令

1、使用 JD-GUI 打开 jar 文件并导出 java 代码,对代码进行修改

2、使用 javac 命令把 .java 文件转换为 .class 文件

javac -classpath [待生成的文件名.jar] [已修改的文件.java]

实际操作过程中直接执行该命令可能往往不是自己期望的那么顺利,那么我们要对特殊情况进行特殊处理。

  • 当遇到编码问题时:需要添加额外参数-encoding utf-8

image.png

  • 当遇到程序包找不到时:需要在已修改.java文件同级目录下放置缺失的 jar 包(可以使用分号分隔输入多个 jar 包参数)

image.png

image.png

image.png

注意:

这里有个坑,如果打包过程有依赖 android jar,那么!!!android.jar 必须是 android sdk 目录下的 jar,不能随便找一个,否则编译失败。`

image.png

3、经过上述操作,最后使用的命令可能是这样的

javac -encoding utf-8 -classpath [依赖的1.jar;依赖的2.jar;依赖的3.jar;...] [已修改的单个 .java 文件或者待转换的 .java 文件所在目录]

例如

javac -encoding utf-8 -classpath android.jar;classes-dex2jar.jar GRAppStoreActivity.java

这就成功把 java 代码编译为 class 代码

4、把编译好了的 class 文件替换原先的文件打包成 jar

jar cvf [新文件名.jar] -C [待打包的class文件目录] [输出到指定目录]

例如

jar cvf jsonlili.jar -C primer/ .

到这里就打包成功了,如果遇到什么问题欢迎评论 😃

看起来操作步骤是有点繁琐。那么下面简明介绍可以快速实现的方法。

方式二:jclasslib 工具

1、把 jar 包拖入工具中并打开指定 class 文件【也可以使用 jar 命令先解压获取 class 文件】

image.png

2、代码定位并修改(我们以开头的客服提示弹窗为例)

在原始 classes.all.dex.jar 文件中定位到客服:固定前缀在 MyMainActivity 类的某个匿名方法中。

image.png

我们知道匿名实现经过编译成 class 文件之后生成单独的文件,且文件名往往带有$符号,所以我们解压 jar 文件之后可以缩小范围查找。

一番查阅后定位到 MyMainActivity$2$1.class 文件中,Methods -》onClick -》Code

image.png

ldc:是 JVM 指令,将从常量池中取出值

JVM 相关知识我自己也要加强,不过多介绍,这里推荐一个学习地址 字节码指令

3、修改并保存
从刚才的 ldc #61 <客服:> 中点击 #61 跳转到编辑处

image.png


到这里,其实我们对 class 文件的修改已经完成了,省去了方法一中的 java 代码转换为 class 的操作和 jar 打包操作。

最后的最后

我在想,如果想要修改更复杂的代码满足更大的需求呢?怎么办?

个人总结了一点,那就是:持续学习

比如,我对 JVM 指令掌握的不够,那我需要深入学习;我对反编译相关知识掌握不足,也需要找资源学习…

推荐一个反编译工具的下载地址: 在线破解工具包:

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Maven是一个项目管理工具,它提供了一种简单的方式来管理项目的依赖关系。在使用Maven进行项目开发的过程,我们经常会遇到引入第三方jar包的需求,从而为项目提供所需的功能。 Maven提供了一种批量安装第三方jar包的功能,可以通过在项目的pom.xml文件声明依赖关系来实现。首先,我们需要找到所需的第三方jar包的Maven坐标,这通常括groupId、artifactId和version三个属性。 在pom.xml文件,我们可以通过在dependencies节点下添加多个dependency节点来声明多个第三方jar包的依赖关系。在每个dependency节点内,我们需要填写对应第三方jar包的groupId、artifactId和version属性。 当我们保存并关闭pom.xml文件后,Maven会自动从央仓库或私有仓库下载并安装所需的第三方jar包。这样,我们就可以在项目直接引用这些jar包,并使用其的类和方法。 除了在pom.xml文件声明第三方jar包的依赖关系外,我们还可以使用Maven命令进行批量安装。通过执行"mvn install"命令,Maven会按照pom.xml文件所声明的依赖关系,自动下载并安装所有的第三方jar包。 总之,Maven是一个非常方便的批量安装第三方jar包工具,通过在项目的pom.xml文件声明依赖关系,我们可以轻松地管理和安装所需的第三方jar包。这样,我们可以快速、高效地开发自己的项目,节省了手动下载和安装第三方jar包的时间和努力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值