Android混淆代码打包实践总结

转载 点击打开链接

1.引入默认的打包配置
在project.properties中添加语句 proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt
新建proguard-android.txt
拷贝${sdk.dir}/tools/proguard/proguard-android.txt文件中的配置到你的工程的proguard-android.txt中
如下所示
#系统配置
# This is a configuration file for ProGuard.
# http://proguard.sourceforge.net/index.html#manual/usage.html

-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose

# Optimization is turned off by default. Dex does not like code run
# through the ProGuard optimize and preverify steps (and performs some
# of these optimizations on its own).
-dontoptimize
-dontpreverify
# Note that if you want to enable optimization, you cannot just
# include optimization flags in your own project configuration file;
# instead you will need to point to the
# "proguard-android-optimize.txt" file instead of this one from your
# project.properties file.

-keepattributes *Annotation*
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService

# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native
-keepclasseswithmembernames class * {
    native <methods>;
}

# keep setters in Views so that animations can still work.
# see http://proguard.sourceforge.net/manual/examples.html#beans
-keepclassmembers public class * extends android.view.View {
   void set*(***);
   *** get*();
}

# We want to keep methods in Activity that could be used in the XML attribute onClick
-keepclassmembers class * extends android.app.Activity {
   public void *(android.view.View);
}

# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

-keepclassmembers class **.R$* {
    public static <fields>;
}

# The support library contains references to newer platform versions.
# Don't warn about those in case this app is linking against an older
# platform version.  We know about them, and they are safe.
-dontwarn android.support.**

2.第三方jar包的配置
1)fastjson配置
#fast json相关
-libraryjars libs/json.jar                                 #fastjson的jar包不要混淆
-keep class com.alibaba.fastjson.** { *; }      #fastjson包下的所有类不要混淆,包括类里面的方法
-keepattributes Signature                            #这行一定要加上,否则你的object中含有其他对象的字段的时候会抛出ClassCastException

-dontwarn com.alibaba.fastjson.**              #告诉编译器fastjson打包过程中不要提示警告
2)xutils配置
#xutils相关
-libraryjars libs/xUtils-2.4.7.jar                      #xutils的jar包不要混淆
-keep class com.lidroid.** { *; }                     #xutils包下所有类不要混淆,包括类里面的方法
-keep class * extends java.lang.annotation.Annotation { *; }#注解包下的所有内容不要混淆,ViewUitls有用到

3)新浪微博配置
-libraryjars libs/weibosdkcore.jar                  #微博jar包不要混淆
-keep class com.sina.weibo.sdk.** { *; }         #微博报下所有类及类里面的内容都不要混淆

4)腾讯开放平台配置
-libraryjars libs/mta-sdk-1.6.2.jar                   #腾讯平台jar包不要混淆
-keep class com.tencent.** { *; }                     #腾讯平台jar包中所有类及类里面的内容不要混淆

5)图片异步加载组件universal-image-loader配置
#图片加载
-libraryjars libs/universal-image-loader-1.8.4-with-sources.jar  #imageLoader的jar包不要混淆
-keep class com.nostra13.universalimageloader.** { *; }              #imageLoader包下所有类及类里面的内容不要混淆

6)友盟统计组件配置
#友盟相关
-libraryjars libs/umeng-analytics-v5.2.3.jar     #友盟统计的jar包不要混淆
-keep class com.umeng.** { *; }                        #友盟统计jar包下的所有类及类里面的所有内容不要混淆

7)自定义控件及组件不要打包混淆
如果我们自定了ListView,ScrollView,Gallery这些组件的时候,我们就不能混淆这些自定义的类了,因为在layout里面我们已经引用这个了类,而且已经写死了。同样四大组件也是不能打包混淆的
#四大组件不能混淆
-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 * extends android.view.View {*;}

8)数据适配器adapter不要混淆
#adapter也不能混淆
-keep public class * extends android.widget.BaseAdapter {*;}

如果你使用了CusorAdapter,添加下面这行
-keep public class * extends android.widget.CusorAdapter{*;}
同样如果你觉得麻烦,就直接将BaseAdpater换成Adapter
9)数据模型不要混淆
-keepnames class * implements java.io.Serializable     #比如我们要向activity传递对象使用了Serializable接口的时候,这时候这个类及类里面#的所有内容都不能混淆
-keepclassmembers class * implements java.io.Serializable {
        *;
}

-keep class com.xx.xxx.domain.* {*;}
-keep class com.xx.xxx.vo.* {*;}

-keep class com.xx.xxx.model.* {*;}
这里的包名取决你自己定义的model所在包的名称
10)百度地图组件配置
#百度地图相关
-libraryjars libs/baidumapapi_v2_4_0.jar        #地图相关的jar包不要混淆
-keep class com.baidu.** { *; }                         #地图组件包括图层、定位等接口所有的类及类里面的内容都不要混淆
-keep class vi.com.gdi.bgl.android.**{*;}         #交通实况相关的类及类里面的所有内容不要混淆
-libraryjars libs/locSDK_3.1.jar                         #定位jar包不要混淆
-libraryjars libs/armeabi/libBaiduMapSDK_v2_4_0.so  #地图相关的C++编译的可执行文件(引擎)不要混淆
-libraryjars libs/armeabi/liblocSDK3.so                         #定位相关的C++编译的可执行文件(引擎)不要混淆

这里要特别说明的是百度地图这个apiKey,一定要注意测试的时候与打包发布时候的SHA1是不一样的,所以需要准备两个apiKey。
所以打包的时候一定要把apiKey设置成打包所需的apiKey,否则打包后的apk文件运行后图层无法加载,但是定位功能不受影响
具体的操作是在打包最后一步把你的SHA1码拷贝一份到应用控制台重新生成一个key,如果你使用的是baidumapapi3.0以上的SDK就没有这么多麻烦事了
打包所需key生成如下图所示





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章