您的位置:首页 > 移动开发 > Android开发

Android混淆代码打包实践总结

2015-02-27 21:16 363 查看
转载 点击打开链接

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生成如下图所示

解决方案, Android, 工程
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: