一切从需求出发:公司选定了用阿里云旺作为客服IM系统,但是这个SDK(Android端)是2016年12月更新的,后面官方就没动作了。问题出在:不兼容Android8.0,因为notification没有channel的问题。所以接下来的动作就是修改源码使其兼容8.0+
步骤:
- 解压
.aar
文件 - 使用
jd-gui
查看源码并定位到代码再修改 - 解压
.aar
文件解压后产生的classes.jar
文件 - 打包源码为
classes.jar
- 打包所有文件(
res文件、classes.jar、AndroidManifest.xml
等)为xxx.aar
解压.aar
文件
$ unzip myLib.aar -d tempFolder
使用jd-gui
查看源码并定位到代码再修改
- 进入
tempFolder
把里面的classes.jar
复制出来 - 再使用jd-gui(mac版下载地址:https://github.com/parcool/resources/blob/master/jd-gui-1.4.0.jar windows自行下载)打开
classes.jar
找到需要修改的地方,把这个类的代码copy出来,在android studio中新建项目,把这个.aar
放到新建libs
文件夹里再引用它,把之前copy出来的代码新建一个.java
后粘贴到里面(注意包名也得一样,部分报错的代码需要手动修改一下。比如:this
关键字之类的删掉),改好后build一下,从/build/intermediates/classes/debug/对应包名
找到修改的.class
文件。
注:新版(没研究过具体哪个版本开始)的android studio
生成的.class
位置变了,在/build/intermediates/javac/debug/对应包名
下。
解压.aar
文件解压后产生的classes.jar
文件
- 解压
classes.jar
。命令:$ unzip classes.jar -d tempFolderClasses
- 把第二步生成的
.class
文件放到tempFolderClasses
文件夹下对应的地方替换掉以前的.class
文件(大功即将告成)
打包源码为classes.jar
$ jar cvf newClasses.jar -C tempFolderClasses/ .
(注意斜杠后面加空格与.)
再把这个newClasses.jar
放回tempFolder
并删除之前的,修改文件名为classes.jar
打包所有文件(res文件、classes.jar、AndroidManifest.xml
等)为xxx.aar
$ jar cvf newAAR.aar -C tempFolder/ .
完成!!!!
没配图啥的,不明白的再交流吧。。。
ps:附一个我重新编译后的阿里云旺安卓包:https://github.com/parcool/resources/blob/master/MyIMCore2.0.2.1.aar
更新:
在再次另一个aar需要修改后重新打包的需求中,发现通过如上解压
的方式来解压出现了一个问题:因为它有其他module混淆过,导致出现同名但大小写不同的.class
文件(比如:a.class
和A.class
),如上方式解压后会提示重命名或覆盖等操作。在mac下我没解决得了这个问题,需要把硬盘格式化为区分大小写,放弃了。。。然后我搞了个Parallels Desktop
来装了windows
,把上面替换class
的步骤换成了用7-zip
来替换:改classes.jar
为classes.zip
,再用7-zip
打开,把改好后的class
文件拖进去,再执行最后一步打包aar操作就ok了。