公司有个项目需要以库的形式提供给第三方使用,但是java代码又不想别人知道,还有资源文件也需要一起打包,很常见的需求,下面就是解决此事的过程。

1、直接将库工程提供给第三方,android库工程引用方式

被老板pass,代码客户都可以看到,不行。

2、将库工程TestLib的src导出成jar,把res目录直接发给第三方

失败。导出的jar依然是引用库工程的R文件(com.test.lib.R),但是资源提供给第三方后,生成的R为com.test.R,因此运行时找不到com.test.lib.R,引用资源报错。

3、新建一个库工程MyLib,包名和TestLib工程相同(com.test.lib),然后将MyLib的res删除,将TestLib的res全部复制到新工程,同时将TestLib中bin下生成的TestLib.jar复制到MyLib的libs文件夹下,然后第三方再引用MyLib,成功!

中间有个小插曲,我们没有使用bin下面生成的jar,二是类似第二部直接导入jar文件,其他和步骤三相同,但是运行时还是报错——知道的朋友希望告诉我为什么。

4、步骤三解决了java源码没有直接提供给第三方的问题,但是如果用jar查看器,还是可以看到源码,也就是步骤三生成的jar是没有混淆的,那么我们就要混淆jar了。


jar混淆相信步骤

4.1  找到sdk下面的混淆运行文件目录(*\android-sdk-windows\tools\proguard\bin),打开其中的proguardgui.bat;

java 混淆代码类名包名如何还原 jar 混淆_android

4.2  出现如下画面,点击加载按钮,加载*\android-sdk-windows\tools\proguard\proguard-android-optimize.txt文件,点击next。

java 混淆代码类名包名如何还原 jar 混淆_android_02


4.3 出现如下画面,点击红框所示三个按钮,分别选择要加密的jar,加密输出的jar,以及项目引用到的jar(android.jar)。点击下一步。


java 混淆代码类名包名如何还原 jar 混淆_android_03


4.4 在下图中红框打勾,点击下一步;

java 混淆代码类名包名如何还原 jar 混淆_Android_04

4.5 一直点击下一步,直到出现如下画面,点击process:

java 混淆代码类名包名如何还原 jar 混淆_Android_05

4.6 ,就会出现如上日志,可以看到和R有关的都报错了,找不到R相关的内容,因为R在jar里面没有,那么我们之间忽略就可以了(dontwarn),因为我们要把mylib提供给第三方,可以获取到R相关内容,这也是第二种方法不能凑效的原因。如下图,我们打开proguard-android-optimize.txt,天津红框里面的2句话,忽略R相关的内容。

java 混淆代码类名包名如何还原 jar 混淆_android_06

4.7 再次重复步骤2~6,出现下图:

java 混淆代码类名包名如何还原 jar 混淆_Android_07

4.8 找到我们设置的输出目录,我们就可以看到对应的*after文件了,我们用jar查看器打开看看,让老板放心,让码农恶心的混淆后的代码出来了,妈妈再也不用担心第三方知道我们的业务流程和接口了:

java 混淆代码类名包名如何还原 jar 混淆_jar_08


4.9 至此,任务完成。