请尊重别人的劳动成果,转发文章请注明出处


在各种SDK盛行的今天,为了跟上时代发展的步伐,不得不面对SDK的开发,当然今天不是聊如何开发SDK,这里来讲讲java代码如何混淆。

Android 开发者都了解如何混淆apk。不再赘述,现在有这样一个需求:把java代码导出为jar,然后对jar纯代码进行混淆。


1.java代码导出为jar

想必这一步大家都会,项目右键->export->java->jar file(只勾选src文件夹,因为只需要java代码)


2.使用eclipse自带工具混淆代码

2.1.android 代码基本混淆规则

代码的混淆是指使用一定的算法(这个不需要开发者实现)将需要混淆的代码使用一些英文字母代替源代码中开发者定义的方法名或者变量名。也会在一定意义上的打乱代码结构,使得代码的阅读性降低,在被破解的情况下不容易被看清代码逻辑,从而起到保护代码的目的。

混淆代码时,需要注意一些代码是不能混淆的,Android代码有一定的混淆规则,比如Activity一般不混淆等等。比如在SDK代码中,提供给开发者调用的工具类一般不混淆,混淆会使之前定义的方法名字被修改,开发者就不能发正确调用。


2.2混淆jar代码


混淆jar包用到的工具是proguard,可以在android SDK里面找到,在Android SDK 目录例如:E:\XX\android\sdk\tools\proguard\bin\proguardgui.bat




2.2.1创建混淆配置文件

混淆配置文件可以找到android工程里面的proguard.cfg文件,这个文件是用来混淆apk代码的配置文件,现在是要混淆jar包的代码,有所不同,直接导入会报错,之前在整理网上的代码得出下面的配置文件代码,已经找不到文章的相关链接了(跟相关的原作者说声抱歉)


新建一个 test.pro 文件

#---------------------导入需要打包的jar-------------injars 'C:\Users\Administrator\Desktop\paysdk_key\paysdk_v2.0.1.jar'#---------------------指定混淆之后生成的jar-------------outjars 'C:\Users\Administrator\Desktop\paysdk_key\paysdk_v2.0.1_t.jar'#---------------------引入依赖的jar------------#----------以下三个是必须的---------rt.jar--android.jar---android-support-v4.jar-----libraryjars 'C:\Program Files (x86)\Java\jdk1.7.0_13\jre\lib\rt.jar'-libraryjars 'E:\ruffian\android\sdk\platforms\android-19\android.jar'-libraryjars 'E:\ruffian\android_project\paySdk\libs\android-support-v4.jar'#----------这里可以添加开发者项目中用到的其他依赖包--------------# Keep - Applications. Keep all application classes, along with their 'main'# methods.-keepclasseswithmembers public class * {    public static void main(java.lang.String[]);}# Also keep - Enumerations. Keep the special static methods that are required in# enumeration classes.-keepclassmembers enum  * {    public static **[] values();    public static ** valueOf(java.lang.String);}# Also keep - Database drivers. Keep all implementations of java.sql.Driver.-keep class * extends java.sql.Driver# Also keep - Swing UI L&F. Keep all extensions of javax.swing.plaf.ComponentUI,# along with the special 'createUI' method.-keep class * extends javax.swing.plaf.ComponentUI {    public static javax.swing.plaf.ComponentUI createUI(javax.swing.JComponent);}# Keep names - Native method names. Keep all native class/method names.-keepclasseswithmembers,allowshrinking class * {    native <methods>;}#------------------Android基本混淆设置----------------optimizationpasses 5-dontusemixedcaseclassnames-dontskipnonpubliclibraryclasses-dontpreverify-verbose-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*-keep public class * extends android.app.Activity-keep public class * extends android.app.Application-keep public class * extends android.app.Service-keep public class * extends android.content.BroadcastReceiver-keep public class * extends android.content.ContentProvider-keep public class * extends android.app.backup.BackupAgentHelper-keep public class * extends android.preference.Preference-keep public class com.android.vending.licensing.ILicensingService#---------------------自定义混淆设置-------------keep public class com.xx..xx.xx.PaySdk{public *;}-keep class com.xx..xx.xx.callback.**{*;}#---------------------自定义混淆设置------------#------------------------以下代码理解为配置文件基本代码------------------------# Remove - System method calls. Remove all invocations of System# methods without side effects whose return values are not used.-assumenosideeffects public class java.lang.System {    public static long currentTimeMillis();    static java.lang.Class getCallerClass();    public static int identityHashCode(java.lang.Object);    public static java.lang.SecurityManager getSecurityManager();    public static java.util.Properties getProperties();    public static java.lang.String getProperty(java.lang.String);    public static java.lang.String getenv(java.lang.String);    public static java.lang.String mapLibraryName(java.lang.String);    public static java.lang.String getProperty(java.lang.String,java.lang.String);}# Remove - Math method calls. Remove all invocations of Math# methods without side effects whose return values are not used.-assumenosideeffects public class java.lang.Math {    public static double sin(double);    public static double cos(double);    public static double tan(double);    public static double asin(double);    public static double acos(double);    public static double atan(double);    public static double toRadians(double);    public static double toDegrees(double);    public static double exp(double);    public static double log(double);    public static double log10(double);    public static double sqrt(double);    public static double cbrt(double);    public static double IEEEremainder(double,double);    public static double ceil(double);    public static double floor(double);    public static double rint(double);    public static double atan2(double,double);    public static double pow(double,double);    public static int round(float);    public static long round(double);    public static double random();    public static int abs(int);    public static long abs(long);    public static float abs(float);    public static double abs(double);    public static int max(int,int);    public static long max(long,long);    public static float max(float,float);    public static double max(double,double);    public static int min(int,int);    public static long min(long,long);    public static float min(float,float);    public static double min(double,double);    public static double ulp(double);    public static float ulp(float);    public static double signum(double);    public static float signum(float);    public static double sinh(double);    public static double cosh(double);    public static double tanh(double);    public static double hypot(double,double);    public static double expm1(double);    public static double log1p(double);}# Remove - Number method calls. Remove all invocations of Number# methods without side effects whose return values are not used.-assumenosideeffects public class java.lang.* extends java.lang.Number {    public static java.lang.String toString(byte);    public static java.lang.Byte valueOf(byte);    public static byte parseByte(java.lang.String);    public static byte parseByte(java.lang.String,int);    public static java.lang.Byte valueOf(java.lang.String,int);    public static java.lang.Byte valueOf(java.lang.String);    public static java.lang.Byte decode(java.lang.String);    public int compareTo(java.lang.Byte);    public static java.lang.String toString(short);    public static short parseShort(java.lang.String);    public static short parseShort(java.lang.String,int);    public static java.lang.Short valueOf(java.lang.String,int);    public static java.lang.Short valueOf(java.lang.String);    public static java.lang.Short valueOf(short);    public static java.lang.Short decode(java.lang.String);    public static short reverseBytes(short);    public int compareTo(java.lang.Short);    public static java.lang.String toString(int,int);    public static java.lang.String toHexString(int);    public static java.lang.String toOctalString(int);    public static java.lang.String toBinaryString(int);    public static java.lang.String toString(int);    public static int parseInt(java.lang.String,int);    public static int parseInt(java.lang.String);    public static java.lang.Integer valueOf(java.lang.String,int);    public static java.lang.Integer valueOf(java.lang.String);    public static java.lang.Integer valueOf(int);    public static java.lang.Integer getInteger(java.lang.String);    public static java.lang.Integer getInteger(java.lang.String,int);    public static java.lang.Integer getInteger(java.lang.String,java.lang.Integer);    public static java.lang.Integer decode(java.lang.String);    public static int highestOneBit(int);    public static int lowestOneBit(int);    public static int numberOfLeadingZeros(int);    public static int numberOfTrailingZeros(int);    public static int bitCount(int);    public static int rotateLeft(int,int);    public static int rotateRight(int,int);    public static int reverse(int);    public static int signum(int);    public static int reverseBytes(int);    public int compareTo(java.lang.Integer);    public static java.lang.String toString(long,int);    public static java.lang.String toHexString(long);    public static java.lang.String toOctalString(long);    public static java.lang.String toBinaryString(long);    public static java.lang.String toString(long);    public static long parseLong(java.lang.String,int);    public static long parseLong(java.lang.String);    public static java.lang.Long valueOf(java.lang.String,int);    public static java.lang.Long valueOf(java.lang.String);    public static java.lang.Long valueOf(long);    public static java.lang.Long decode(java.lang.String);    public static java.lang.Long getLong(java.lang.String);    public static java.lang.Long getLong(java.lang.String,long);    public static java.lang.Long getLong(java.lang.String,java.lang.Long);    public static long highestOneBit(long);    public static long lowestOneBit(long);    public static int numberOfLeadingZeros(long);    public static int numberOfTrailingZeros(long);    public static int bitCount(long);    public static long rotateLeft(long,int);    public static long rotateRight(long,int);    public static long reverse(long);    public static int signum(long);    public static long reverseBytes(long);    public int compareTo(java.lang.Long);    public static java.lang.String toString(float);    public static java.lang.String toHexString(float);    public static java.lang.Float valueOf(java.lang.String);    public static java.lang.Float valueOf(float);    public static float parseFloat(java.lang.String);    public static boolean isNaN(float);    public static boolean isInfinite(float);    public static int floatToIntBits(float);    public static int floatToRawIntBits(float);    public static float intBitsToFloat(int);    public static int compare(float,float);    public boolean isNaN();    public boolean isInfinite();    public int compareTo(java.lang.Float);    public static java.lang.String toString(double);    public static java.lang.String toHexString(double);    public static java.lang.Double valueOf(java.lang.String);    public static java.lang.Double valueOf(double);    public static double parseDouble(java.lang.String);    public static boolean isNaN(double);    public static boolean isInfinite(double);    public static long doubleToLongBits(double);    public static long doubleToRawLongBits(double);    public static double longBitsToDouble(long);    public static int compare(double,double);    public boolean isNaN();    public boolean isInfinite();    public int compareTo(java.lang.Double);    public <init>(byte);    public <init>(short);    public <init>(int);    public <init>(long);    public <init>(float);    public <init>(double);    public <init>(java.lang.String);    public byte byteValue();    public short shortValue();    public int intValue();    public long longValue();    public float floatValue();    public double doubleValue();    public int compareTo(java.lang.Object);    public boolean equals(java.lang.Object);    public int hashCode();    public java.lang.String toString();}# Remove - String method calls. Remove all invocations of String# methods without side effects whose return values are not used.-assumenosideeffects public class java.lang.String {    public <init>();    public <init>(byte[]);    public <init>(byte[],int);    public <init>(byte[],int,int);    public <init>(byte[],int,int,int);    public <init>(byte[],int,int,java.lang.String);    public <init>(byte[],java.lang.String);    public <init>(char[]);    public <init>(char[],int,int);    public <init>(java.lang.String);    public <init>(java.lang.StringBuffer);    public static java.lang.String copyValueOf(char[]);    public static java.lang.String copyValueOf(char[],int,int);    public static java.lang.String valueOf(boolean);    public static java.lang.String valueOf(char);    public static java.lang.String valueOf(char[]);    public static java.lang.String valueOf(char[],int,int);    public static java.lang.String valueOf(double);    public static java.lang.String valueOf(float);    public static java.lang.String valueOf(int);    public static java.lang.String valueOf(java.lang.Object);    public static java.lang.String valueOf(long);    public boolean contentEquals(java.lang.StringBuffer);    public boolean endsWith(java.lang.String);    public boolean equalsIgnoreCase(java.lang.String);    public boolean equals(java.lang.Object);    public boolean matches(java.lang.String);    public boolean regionMatches(boolean,int,java.lang.String,int,int);    public boolean regionMatches(int,java.lang.String,int,int);    public boolean startsWith(java.lang.String);    public boolean startsWith(java.lang.String,int);    public byte[] getBytes();    public byte[] getBytes(java.lang.String);    public char charAt(int);    public char[] toCharArray();    public int compareToIgnoreCase(java.lang.String);    public int compareTo(java.lang.Object);    public int compareTo(java.lang.String);    public int hashCode();    public int indexOf(int);    public int indexOf(int,int);    public int indexOf(java.lang.String);    public int indexOf(java.lang.String,int);    public int lastIndexOf(int);    public int lastIndexOf(int,int);    public int lastIndexOf(java.lang.String);    public int lastIndexOf(java.lang.String,int);    public int length();    public java.lang.CharSequence subSequence(int,int);    public java.lang.String concat(java.lang.String);    public java.lang.String replaceAll(java.lang.String,java.lang.String);    public java.lang.String replace(char,char);    public java.lang.String replaceFirst(java.lang.String,java.lang.String);    public java.lang.String[] split(java.lang.String);    public java.lang.String[] split(java.lang.String,int);    public java.lang.String substring(int);    public java.lang.String substring(int,int);    public java.lang.String toLowerCase();    public java.lang.String toLowerCase(java.util.Locale);    public java.lang.String toString();    public java.lang.String toUpperCase();    public java.lang.String toUpperCase(java.util.Locale);    public java.lang.String trim();}# Remove - StringBuffer method calls. Remove all invocations of StringBuffer# methods without side effects whose return values are not used.-assumenosideeffects public class java.lang.StringBuffer {    public <init>();    public <init>(int);    public <init>(java.lang.String);    public <init>(java.lang.CharSequence);    public java.lang.String toString();    public char charAt(int);    public int capacity();    public int codePointAt(int);    public int codePointBefore(int);    public int indexOf(java.lang.String,int);    public int lastIndexOf(java.lang.String);    public int lastIndexOf(java.lang.String,int);    public int length();    public java.lang.String substring(int);    public java.lang.String substring(int,int);}# Remove - StringBuilder method calls. Remove all invocations of StringBuilder# methods without side effects whose return values are not used.-assumenosideeffects public class java.lang.StringBuilder {    public <init>();    public <init>(int);    public <init>(java.lang.String);    public <init>(java.lang.CharSequence);    public java.lang.String toString();    public char charAt(int);    public int capacity();    public int codePointAt(int);    public int codePointBefore(int);    public int indexOf(java.lang.String,int);    public int lastIndexOf(java.lang.String);    public int lastIndexOf(java.lang.String,int);    public int length();    public java.lang.String substring(int);    public java.lang.String substring(int,int);}

仔细看配置 混淆文件备注,不明白或者使用过程中遇到问题可以留言。


2.2.2混淆配置操作


1.导入混淆文件test.pro




2.混淆jar


导入混淆文件之后可以查看自己的混淆配置文件内容




最后一步混淆代码,如图所示,表示混淆成功。




混淆过程中,由于每一个开发者自定义的混淆配置不同,可能会出现一些这里没有提到的错误或者警告,这个大家可以自行百度,很多相关的解决办法,或者可以留言,由于我是亲测过来的,过程中也遇到了很多错误,可以留言相互交流一下。




2016-05-13

回过头看看之前写的文章,我的天啊,写的是什么啊。关于混淆的知识简直没讲,好吧,友情连接一个很不错的文章,遇到混淆相关的问题,仔细找,肯定没问题。


http://blog.csdn.net/jjwwmlp456/article/details/44977721




更多相关文章

  1. Android(安卓)开发者和设计师必须了解的颜色知识
  2. Android中广告渠道SDK接入方法
  3. 在android当中MVC模式分别代表什么?
  4. 「「第一行代码(第二版)」」学习笔记 6 广播机制(连载中)
  5. Android(安卓)选择联系人+返回对应手机号码
  6. Nokia同意放人 移交125名Qt核心成员给Digia
  7. 浅析Android中强大的Dialog
  8. Android应用程序权限机制的源代码分析(1)
  9. Android(安卓)开发者 for Flutter (2)如何布局? XML layout 文件跑

随机推荐

  1. Centos 7 安装mysql5.7.24二进制 版本的
  2. MySQL中大对象的多版本并发控制详解
  3. 深入浅析MySQL从删库到跑路_高级(一)——数
  4. 关于mysql 8.0.13zip包安装方法
  5. mysql5.7及mysql 8.0版本修改root密码的
  6. mysql5.7.24 解压版安装步骤及遇到的问题
  7. MySQL5.7中的sql_mode默认值带来的坑及解
  8. CentOS 7 安装Percona Server+Mysql
  9. 解决Windows环境下安装 mysql-8.0.11-win
  10. Windows下通过MySQL Installer安装MySQL