使用最新jarjar修改包名,且保留部分类或者包名不做更改

需求

对第三方sdk的jar包包名进行修改,比如将jar包的前缀包名是com.x,需要将其前缀包名改成com.y

实现工具

经过搜索,发现能完成上述要求的工具是jarjar,但是大部分文章引用的jarjar都是比较老旧的版本,在jar包中如果有声明注解的类的时候,包名替换失败
如:

package com.x;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.CLASS)
public @interface A {
}

使用老旧版本的jarjar执行后输出的output文件中,上述的类包名还是com.x.
在github上发现有最新的jarjar仓库,上述的问题也可以处理。
地址:https://github.com/shevek/jarjar


jarjar命令行的使用

生成jarjar.jar

将项目从git仓库clone到本地,我使用的idea是Android studio.

添加slf4j-simple依赖

修改项目的build.gradle文件加入slf4j-simple依赖

subprojects {
        version = '1.1.1'
	apply plugin: 'org.anarres.stdmodule'
	apply plugin: 'eclipse'
	stdmodule {
		description "Jar Jar Links is a utility that makes it easy to repackage Java libraries and embed them into your own distribution."
		author id: 'shevek', name: 'Shevek', email: 'github@anarres.org'
		license 'Apache-2.0'
	}

	group = "org.anarres.jarjar"

	dependencies {
		compile 'com.google.code.findbugs:annotations:3.0.1'
		compile 'org.slf4j:slf4j-api:1.7.12'
		//项目缺少以下依赖,运行会失败,补上即可
		compile 'org.slf4j:slf4j-simple:1.7.25'
	}

	sourceCompatibility = 1.7
}

执行jar任务生成jarjar.jar文件

jarjar-command模块声明了命令行的执行方式,模块中的build.gradle也声明了jar的打包方式
所以我们在gradle 执行以下命令 就能生成 jarjar执行包

gradlew :jarjar-command:jar

执行完毕后,jar包文件路径:/jarjar-command/build/libs/jarjar-command-1.1.1jar

执行jarjar命令行

在上面的步骤中,我们已经生成了jarjar可执行文件jarjar-commond-1-1-1.jar
jarjar-commond-1-1-1.jar的文件位置下打开可执行窗口,在可执行窗口中执行命令行
如:

java -jar jarjar-command-1.1.1.jar --help

执行后会在可执行窗口中输出 jarjar的使用规则.
详细规则请阅读该项目github的说明

jarjar修改包名

为了方便,以下演示需要的文件我们都放在jarjar-commonad-1.1.1.jar的同一目录下
首先,我们需要创建一个rule.txt文件,在此文件中声明替换的规则,这么我们主要用的是rule规则

##关于@的使用说明阅读项目的Readme, k.@0表示的字符是k.com.x.**
rule com.x.** k.@0

包的匹配规则和混淆规则类似.
上面的规则意思是 将输入jar文件com.x包下的类文件包名改成k.com.x

创建好rule规则文件后,准备需要更改包名的原jar文件ori.jar,然后在jarjar-commonad-1.1.1.jar目录下打开可执行窗口执行命令行:

java -jar jarjar-command-1.1.1.jar --mode process --rules ./rule.txt  ./ori.jar --output  ./out.jar

在process后面需要注意的参数:

  1. –rules 创建的规则声明文件的路径 如 --rule ./rule.txt
  2. 输入源jar文件,直接填入路径 如 ./ori.jar
  3. –output 输出修改的jar文件如 --output ./out.jar

执行成功后,生成out.jar,我们可以通过jadx或者jd-gui软件去检测修改是否成功。

保留部分类或者包不更改包名

修改第三方jar的包名,如果里面有相关native方法的声明,那么这种情况下,我们需要保留native所在类的包名结构不能够发生变化,否则调用native方法不能匹配到so文件的原生方法。
所以在这种情况下,需要在更改包名的前提保留部分类文件的包名不做调整,
在此我们还是通过rule规则来实现,修改rule.txt
假设 com.x.NativeUtil.class 中含有native方法,那么rule.txt做如下修改:

##将需要keep的包或者类的规则 声明在前面
rule com.x.NativeUtil @0
##再声明全替换的规则
rule com.x.** k.@0

如上我们就能实现在keep NativeUtil类的情况下还能改变其余类的包名.
要点
将keep的规则先写在前面,如果要keep的类是内部类的话,需要keep外部类的上一级包名才生效

aar修改包名注意事项

Android开发者现在大部分的sdk都是以aar的方式存在,aar的修改需要以下的步骤

  1. 将aar文件解压出来,获取classes.jar文件,用jarjar修改包名后替换掉原classes.jar文件
  2. 如果res/layout下面的layout文件有引用到classes.jar里面的类,需要将所有layout.xml引用到的地方修改成更改包名后的
  3. 修改AndroidManifest.xml中所有涉及classes.jar包名引用的地方,包括manifest节点的package属性
  4. 如果有携带proguard.txt混淆文件的话,也要修改涉及到的声明引用
  5. 重新打包成压缩包,修改文件格式为.aar,修改成功

上面引用的修改可以借助Android studio的Ctrl+Shift+R功能快速替换,将解压后的目录在Android studio打开即可

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Jar包class反编译工具是一种在线工具,可用于将Jar包文件中的class文件进行反编译。 这种工具的主要功能是将编译后的Java字节码文件恢复成可读性较高的Java源代码,方便开发人员进行代码的理解、修改及调试等工作。 在线的Jar包class反编译工具通常通过上传Jar包文件,然后在服务器端进行反编译处理,最后将反编译后的Java源代码以可下载的方式提供给用户。 使用这种工具,用户无需下载和安装额外的软件,只需将需要反编译的Jar包文件上传到在线平台,即可获得相应的Java源代码。 Jar包class反编译工具的优势之一是方便快捷,用户只需几步操作即可获得反编译后的Java源代码,节省了安装配置和学习使用其他反编译工具的时间。 同时,由于是在线工具,也更加适用于需要临时反编译的场景,不需要在本地长期保留相关软件。 然而,需要注意的是,由于涉及源代码的反编译,应确保拥有合法的授权和权限,遵守相关的法律和规定。 另外,Jar包class反编译工具反编译出的Java源代码可能与原始代码存在一定的差异,并且可能不包含原始注释等附加信息。因此,在使用反编译代码时,需要根据具体情况进行审慎分析和验证。 总之,Jar包class反编译工具的在线版本是一种方便快捷的工具,能够帮助开发人员在需要反编译Jar包文件的时候,快速获取Java源代码,提高效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值