需求

对第三方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打开即可

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

  1. php全套之七,【独家首发】最新七星修改二开正米酷影视7.2完整版/支持自定义解析/支持PHP7.0及以上...

    [独家首发]最新七星修改二开正米酷影视7.2完整版/支持自定义解析/支持PHP7.0及以上 视频播放页右侧栏图片和文字在后台→系统设置→APP设置修改广告位在后台设置~第一步:上传文件/uplod.z ...

  2. 主题 支持 php 7.2,最新七星修改二开正米酷影视7.2完整版/支持自定义解析/支持PHP7.0及以上...

    [独家首发]最新七星修改二开正米酷影视7.2完整版/支持自定义解析/支持PHP7.0及以上 视频播放页右侧栏图片和文字在后台→系统设置→APP设置修改 广告位在后台设置~ 第一步:上传文件/uplod ...

  3. 安卓修改软件安装时间_Linux软件包(源码包和二进制包)详细介绍

    Linux下的软件包众多,且几乎都是经 GPL 授权.免费开源(无偿公开源代码)的.这意味着如果你具备修改软件源代码的能力,只要你愿意,可以随意修改. GPL,全称 General Public Li ...

  4. 全网最全、最新Maven构建工具核心知识,这篇文章包你这辈子也忘不掉Maven!!

    作者:Java学术趴 仓库:Github.Gitee 博客:CSDN.掘金.InfoQ.云+社区 公众号:Java学术趴 特别声明:原创不易,未经授权不得转载或抄袭,如需转载可联系小编授权 版权声明: ...

  5. android adb apk包名,ADB命令简单使用--查看包名、activity等

    1.连接设备 adb connect ip 2.查看连接的设备 adb devices 3.安装/卸载Android 应用 adb install packagesname adb uninstall ...

  6. 最近在修改statusBar,添加几张图片.编译源码包时,一直提示无法找到R.drawable.xxxx必须手动编译下指定的图片文件生成R.

    最近在修改statusBar,添加几张图片.编译源码包时,一直提示无法找到R.drawable.xxxx  必须手动编译下指定的图片文件生成R.  $touch frameworks/base/pac ...

  7. JavaScript保留关键字及危险变量名

    JavaScript保留关键字及危险变量名 定义变量名需谨慎 在开发过程当中,如果没有必要就尽可能少的使用以下列出的单词作为变量名称或者属性名称,关键字是严格不允许,而浏览器定义的变量名或者类名在使用 ...

  8. 用计算机专业起情侣网名,带对方名字的情侣网名最新精选

    情侣网名是当今QQ网名中最为火爆的网名之一,QQ情侣网名就是网络中2人相互定位的暧昧称呼.QQ情侣网名受到了90后甚至00后情侣的青睐.今天小编在这给大家整理了带对方名字的情侣网名大全,接下来随着小编 ...

  9. “名媛”不只值一个爱马仕包的钱

    在以前,"名媛"是西方人对于贵族妻女的雅称,现在说的名媛,是指具有一定身份和地位的女人."名"就是有名气,"媛"就是指有美好品德的美女.&q ...

最新文章

  1. python编程培训多少钱-python培训费用多少?
  2. IT职场新人第一课:我的吐槽+我学到的
  3. python 接雨水
  4. 剑指offer之题解目录(全)
  5. java akka_用于大型事件处理的Akka Java
  6. docker创建image
  7. Python 测试驱动开发(四)测试及重构的目的(下)
  8. SAP License:SAP应用随想
  9. tensorrt报错 [F] [TRT] Assertion failed: Unsupported SM.
  10. someip协议_汽车以太网SOMEIP协议课件抢先看
  11. coreldraw快速撤回_CorelDRAW操作技巧,教你CDR撤销操作方法与设置技巧
  12. 微信小程序实现datamatrix(dm)码
  13. 鱼跃CMS-轻量开源企业CMS v1.4.6
  14. W3C 标准 较详细
  15. asc18_hpl,hpc,hpcg
  16. 常见的网站攻击以及如何防御自己的网站被恶意攻击
  17. 几种常用的mosfet驱动电路
  18. druid连接池监控
  19. vnc server安装教程,完成vnc server的安装教程只需9步
  20. python可不可以用中文编写_震惊!!!python可以用中文来写代码

热门文章

  1. Piwigo相册系统源码 v13.3.0
  2. mariadb忘记root密码,重设密码
  3. 战歌竞技场服务器维护中,《战歌竞技场》4月13日开启终极测试
  4. HTML CSS JavaScript网页制作从入门到精通 第3版 (刘西杰) pdf完整版
  5. 关于android中的too many open files(error 24)
  6. 激光雷达远距离灰尘扬尘烟雾粉尘检测
  7. 儿童文学超级IP《绽龙家族》:推动“互动教育”和“文化消费升级”
  8. iOS:仿写探探App动画
  9. android测试之adb key问题
  10. Python的with open读写操作后最好加上close才保险