android 代码混淆之proguard

时间:2021-04-08 04:38:04

代码混淆(proguard):

4.0后出现的工程目录下的proguard-project.txt 是代码混淆的规则;

 

Project.properties中要填写

 

proguard.config=proguard-project.txt

 

路径是一个相对路径(一开始还在疑惑proguard.config= 后边的东西

自带的混淆地址是

proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt

可以在sdk目录中看到 proguard-android.txt中的文件中的配置;

用:

-libraryjars libs/ksoap2-android-assembly-2.4-jar-with-dependencies.jar

可以引用第三方jar包进行混淆;

打包后正常了;

下一步是运行:

My god:运行时竟然出现 no class found exception的异常;

这个是不能发现第三方jar包中的类;

到底是什么状况导致的呢:

Eclipse中的项目会根据Libs目录下的jar包生成一个Android Dependecies和 References;

 

新版本的ADT修改了第三方jar的导入方式,之前可以在工程里面做关联,会在工程上自动添加ReferenceLibrary
在新版本的ADT环境下,只需要在工程目录下新建libs文件夹,注意是libs不是lib,然后将第三方的jar复制进去,eclipse会自动将这个jar添加到Android Dependencies文件夹下,不必在通过BuildPath自己去修改了,也不需要ReferenceLibrary了。
另外,如果多个工程有关联的话,比如A工程设置为IsLibarayB工程要引入A工程的时候,也会自动将A工程编译生成的jar放到Android Dependencies文件夹下。

ADT16开始,Android项目中多了一个名为“Android Dependencies” 的库应用文件夹,这是ADT的第三方库新的引用方式。

当你需要引用第三方库时,只需在项目中新建一个名为"libs"的文件夹,然后将所有第三方包拷贝到该目录下。当eclipse启动时,ADT就会自动帮你完成库的引用,而不需要像以前一样自己Build Path,也不再需要Referenced Libraries了。

我的eclipse中项目保留了References,用android tools打的包就会出现找不到类的问题;

 

保留了Android Dependencies后,打包过程中出现了异常

类重复或冲突异常,原因是jar包中的类与android.jar冲突了;

 

我采用 -ignorewarnings 把警告去除了后; 

打包成功了,就能运行了;

 

测试:冲突的类没有报异常,不过做好不冲突吧;

 

 

总结: 问题一个接一个的出现,路漫漫;

 

关于混淆:

 

 

Androidproguard混淆第三方jar包及内部类

现在大部分项目都使用第三方的jar包,包括json解析的gson.jar,统计用户信息的umeng.jarsupport-v4.jar等等等等,这些jar包本身基本都做了混淆,如果再用proguard混淆的话会出现错误,所以要通过-keep等方法不混淆这些jar中的内容,把到现在用过的整理下仅供参考~~

 

1.项目中有gsonjar包怎么办?

-keep class sun.misc.Unsafe { *; } 

-keep class com.google.gson.stream.** { *; } 

-keep class com.google.gson.examples.android.model.** { *; } 

-keep class com.google.gson.** { *;}

 

2.项目中有commons-httpclient-3.1.jar怎么办?

-keep public class org.apache.commons.httpclient.** {*;}

-keep public class org.apache.commons.httpclient.auth.** {*;}

-keep public class org.apache.commons.httpclient.cookie.** {*;}

-keep public class org.apache.commons.httpclient.methods.** {*;}

-keep public class org.apache.commons.httpclient.params.** {*;}

-keep public class org.apache.commons.httpclient.util.** {*;}

-keep public class org.apache.commons.codec.net.** {*;}

-keep public class org.apache.commons.logging.** {*;}

-keep public class org.apache.commons.logging.impl.** {*;}

-keep public class org.apache.commons.codec.** {*;}

-keep public class org.apache.commons.codec.binary.** {*;}

 

3.项目中有umeng_sdk.jar怎么办?

-keepclassmembers class * {

   public <init>(org.json.JSONObject);

}

-keep public class [您的应用包名].R$*{

    public static final int *;

}

[您的应用包名替换成您自己的包名,如com.yourcompany.example

如果您使用了双向反馈功能,还需要添加下面代码,以免我们自定义的UI被混淆:

-keep public class com.umeng.fb.ui.ThreadView {

}

 

4.项目中有baidumapapi.jar怎么办?

-keep class com.baidu.mapapi.** {*;}

 

5.项目中有android-support-v4.jar怎么办?

-dontwarn android.support.v4.**  

-keep class android.support.v4.** { *; }  

-keep public class * extends android.support.v4.**  

-keep public class * extends android.app.Fragment 

之前我还这样做过

-dontwarn android.support.v4.**

-keep public class android.support.v4.view.** { *; }

-keep public class android.support.v4.accessibilityservice.** { *; }

-keep public class android.support.v4.os.** { *; }

-keep public class android.support.v4.app.** { *; }

-keep public class android.support.v4.widget.** { *; }

 

6.项目中有ksoap2-android-assembly-2.3-jar-with-dependencies.jar怎么办?

-ignorewarnings

-keep class org.kobjects.** { *; }

-keep class org.ksoap2.** { *; }

-keep class org.kxml2.** { *; }

-keep class org.xmlpull.** { *; }

-ignorewarnings是忽略proguard过程中所有的警告,用了它就不必使用-dontwarn方法啦,但是用它要谨慎!

 

7.项目中的某个Activity中有webviewjs交互的内部类,怎么才能不混淆这个内部类?

-keep class [某个包的包名].[js交互的Activity]$*{

    <methods>;

}

 

-keepclassmembers class [某个包的包名].[js交互的Activity]$*{

    *;

}

例如:

-keep class com.xxx.xx.XxxActivity$*{

    <methods>;

}

 

-keepclassmembers class com.xxx.xx.XxxActivity$*{

    *;

}

 

8.项目中有geronimo-spec-activation-1.0.2-rc2.jar怎么办?

-ignorewarnings

-keep class javax.activation.DataHandler.** { *; }

-keep class javax.activation.ActivationDataFlavor.** { *; }

 

9.项目中有微信分享的jar包怎么办?

-keep class com.tencent.mm.sdk.openapi.WXMediaMessage {*;}

-keep class com.tencent.mm.sdk.openapi.** implements com.tencent.mm.sdk.openapi.WXMediaMessage$IMediaObject {*;}

 

简单混淆项的一些简单说明:

 

-optimizationpasses  //->设置混淆的压缩比率 0 ~ 7 

-dontusemixedcaseclassnames  //Aa aA 

-dontskipnonpubliclibraryclasses //->如果应用程序引入的有jar,并且想混淆jar包里面的class 

-dontpreverify    //

-verbose //->混淆后生产映射文件 map 类名->转化后类名的映射

-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* //->混淆采用的算法.

 

-keep public class * extends android.app.Activity  //->所有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 com.android.vending.licensing.ILicensingService

 

-keepclasseswithmembernames class * {

    native <methods>; //-> 所有native的方法不能去混淆

}

 

-keepclasseswithmembernames class * {

    public <init>(android.content.Context, android.util.AttributeSet);

}

 

-keepclasseswithmembernames class * {

    public <init>(android.content.Context, android.util.AttributeSet, int);

    // -->某些构造方法不能去混淆

}

 

-keepclassmembers enum * { //  -> 枚举类不能去混淆

    public static **[] values();

    public static ** valueOf(java.lang.String);

}

 

-keep class * implements android.os.Parcelable {  //-> aidl文件不能去混淆

  public static final android.os.Parcelable$Creator *;

}

}