代码混淆(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工程设置为IsLibaray,B工程要引入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 把警告去除了后;
打包成功了,就能运行了;
测试:冲突的类没有报异常,不过做好不冲突吧;
总结: 问题一个接一个的出现,路漫漫;
关于混淆:
现在大部分项目都使用第三方的jar包,包括json解析的gson.jar,统计用户信息的umeng.jar,support-v4.jar等等等等,这些jar包本身基本都做了混淆,如果再用proguard混淆的话会出现错误,所以要通过-keep等方法不混淆这些jar中的内容,把到现在用过的整理下仅供参考~~
1.项目中有gson的jar包怎么办?
-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中有webview与js交互的内部类,怎么才能不混淆这个内部类?
-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 *;
}
}