android jar包混淆

公司最近开发了一个SDK供第三方调用,如果只是单纯的把代码导出来弄成一个jar包没有混淆的话代码就赤裸的暴露了出来,毕竟是公司项目,要本着为公司保密,为公司着想的态度。。。嗯,就是这样(其实是别人指出来的。。)我去网上看了很多资料,然后自己再做了一些整理,以便下次自己要混淆的时候不用傻逼呵呵的再去到处乱找。。

1、把工程的.class文件导出到指定的目录下:(以ecplise为例)

1)右击工程,选择Export然后选择java下的jar file

然后next选择自己要导出的工程的.class文件,记住,就只有.class文件,其他的文件统统的不要

这样,一个原始的jar包就已经出来了,然后接下来就要进行非常关键的混淆jar包了

2、混淆jar包的话当然需要一个混淆的工具了,我用的是proguard,这个东西是编译器自带的,放在ecplise安装目录下的sdk,里面的tools文件下的proguard,proguard文件下有一个bin目录,目录里面有一个proguardgui.bat文件,找到没有?没有找到再来一遍,找到的就可以愉快的点击了。要是实在找不到的我这里有链接,你可以点击下载。。。,双击后的界面如下:



3、选择Input/Output按钮,然后在那个界面的上半部分选择add input按钮导入自己要混淆的jar包,然后点击add output按钮选择混淆后新生成的jar包位置,接下来在选择第三方jar包的时候非常关键!你要是少导了一个jar包,都会让你的工程出现一些奇怪的问题,就是一些警告啊,警告啊还是警告啊,然后不成功。所以这一步很关键,一定要把工程中遇到的什么jar包都要导进去比如我的工程中用到四个jar包,所以要都导入到那个红色方框里面。然后自带的有一个rt.jar文件要记得删掉

我的工程用到的jar包:

导入成功的后:


4、接下来就是一些混淆工作了然后按照下面设置即可全部混淆代码:

shrinking配置:

obfuscation配置:


optimization配置:

infomation配置(target是可以选择的,我选择的是1.6)


然后就是progress的输出了,如果你下一次觉得再配置麻烦的话记得点击save configuration按钮进行保存,然后保存的格式是.pro,

然后就可以点击progress按钮进行混淆了~如果没有什么警告或者提示错误的话就说明你的配置是没有错误的,如果有什么错误的话可以在网上谷歌一下错误,然后自行进行修改,混洗成功的话界面如下:


因为我是完全混淆的,就是全部的东西都给混淆了,混淆后用解压文件打开看的话都是一些a b c字母啥的。


但是一般jar包的话都是要给外部提供一些接口,或者类什么的,所以还需要keep一些类或者方法,不要全部都给混淆了,上一些步骤中有保存配置文件的话,现在就可以打开Test.pro文件进行编辑,然后手动进行修改部分配置,,也可以在Shrinking配置中点击add进行填写需要保存的类名或者方法:


我自己添加的部分如下:

-keep public class com.xygamesdk.GameSDK.IXYGameSDK

-keep public class com.xygamesdk.GameSDK.XYGameSDK

-keep public class com.xygamesdk.entity.**

就是保留一个对外的接口跟一些实体类。然后保存,继续progress后得到的结果如下:

然后就ok啦。。。,因为我的jar包涉及到webview跟js交互的问题,如果直接这样的话会出错,会提示window.XX.xxx is not function。。。就是无法识别,然后我百度了一下,说是会被混淆了,所以要keep住类跟javascriptinterface这个字段,反正就是加一keep配置进去,我加的配置如下

-keepclassmembers class com.xygamesdk.ui.PersonalWebJsActivity$PayOrder {  
  public *;  
}  
  
-keepattributes *Annotation*  
-keepattributes *JavascriptInterface*  

因为我那个类是内部类,如果不是内部类就不需要加$PayOrder这个了。


其他的说明配置


参数: 
 
-include {filename}    从给定的文件中读取配置参数 
-basedirectory {directoryname}    指定基础目录为以后相对的档案名称 
-injars {class_path}    指定要处理的应用程序jar,war,ear和目录 
-outjars {class_path}    指定处理完后要输出的jar,war,ear和目录的名称 
-libraryjars {classpath}    指定要处理的应用程序jar,war,ear和目录所需要的程序库文件 
-dontskipnonpubliclibraryclasses    指定不去忽略非公共的库类。 
-dontskipnonpubliclibraryclassmembers    指定不去忽略包可见的库类的成员。 


保留选项 


-keep {Modifier} {class_specification}    保护指定的类文件和类的成员 
-keepclassmembers {modifier} {class_specification}    保护指定类的成员,如果此类受到保护他们会保护的更好
-keepclasseswithmembers {class_specification}    保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。 
-keepnames {class_specification}    保护指定的类和类的成员的名称(如果他们不会压缩步骤中删除) 
-keepclassmembernames {class_specification}    保护指定的类的成员的名称(如果他们不会压缩步骤中删除)
-keepclasseswithmembernames {class_specification}    保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后) 
-printseeds {filename}    列出类和类的成员-keep选项的清单,标准输出到给定的文件 
 
压缩 


-dontshrink    不压缩输入的类文件 
-printusage {filename} 
-whyareyoukeeping {class_specification}     
 
优化 


-dontoptimize    不优化输入的类文件 
-assumenosideeffects {class_specification}    优化时假设指定的方法,没有任何副作用 
-allowaccessmodification    优化时允许访问并修改有修饰符的类和类的成员 
 
混淆 


-dontobfuscate    不混淆输入的类文件 
-printmapping {filename} 
-applymapping {filename}    重用映射增加混淆 
-obfuscationdictionary {filename}    使用给定文件中的关键字作为要混淆方法的名称 
-overloadaggressively    混淆时应用侵入式重载 
-useuniqueclassmembernames    确定统一的混淆类的成员名称来增加混淆 
-flattenpackagehierarchy {package_name}    重新包装所有重命名的包并放在给定的单一包中 
-repackageclass {package_name}    重新包装所有重命名的类文件中放在给定的单一包中 
-dontusemixedcaseclassnames    混淆时不会产生形形色色的类名 
-keepattributes {attribute_name,...}    保护给定的可选属性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and InnerClasses. 
-renamesourcefileattribute {string}    设置源文件中给定的字符串常量


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java代码混淆打包通常使用ProGuard工具。ProGuard是一个开源的Java代码优化和混淆工具,它可以对Java字节码进行优化、压缩和混淆,以提高应用程序的性能和安全性。 ProGuard可以删除未使用的类、字段和方法,减小应用程序的大小。它还可以重命名类、字段和方法的名称,使代码更难以理解和逆向工程。此外,ProGuard还提供了其他功能,如优化字节码、移除调试信息和处理异常。 以下是使用ProGuard进行Java代码混淆打包的示例: 1. 首先,确保你已经安装了Java开发工具包(JDK)和ProGuard工具。 2. 创建一个ProGuard配置文件(例如proguard.cfg),并在其中指定要混淆的类和规则。以下是一个简单的示例配置文件: ``` -injars input.jar -outjars output.jar -libraryjars /path/to/android.jar -keep public class com.example.MyClass { public static void main(java.lang.String[]); } ``` 在这个示例中,`input.jar`是输入的jar文件,`output.jar`是输出的混淆后的jar文件。`/path/to/android.jar`是Android SDK中的android.jar文件,用于保留Android框架的类和方法。`-keep`指令用于指定要保留的类和方法。 3. 执行以下命令来运行ProGuard并混淆打包你的Java代码: ``` proguard @proguard.cfg ``` 这将根据配置文件中的规则对代码进行混淆和优化,并生成混淆后的输出jar文件。 请注意,使用ProGuard进行代码混淆打包可能会导致一些问题,如代码错误、依赖关系问题和性能问题。因此,在使用ProGuard之前,建议先备份你的代码,并进行充分的测试和验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值