安卓代码混淆技术分享

安卓代码混淆技术分享

为什么要进行安卓代码混淆?
1) ProGuard介绍。
ProGuard 是一款免费的Java类文件压缩器、优化器和混淆器。它能发现并删除无用类、字段(field)、方法和属性值(attribute)。它也能优化字节码 并删除无用的指令。最后,它使用简单无意义的名字来重命名你的类名、字段名和方法名。经过以上操作的jar文件会变得更小,并很难进行逆向工程。
在Android应用程序也可以使用ProGuard来进行混洗打包,大大的优化Apk包的大小。但是注意ProGuard对文件路径的名名很有讲究,不支持括号,也不支持空格。在混淆过后,可以在工程目录的proguard中的mapping.txt看到混淆后的类名,方法名,变量名和混淆前的类名,方法名,变量名。
2)ProgGurad的存在路径。
在安卓SDK的tools包下的proguard文件夹。

Progurad官网
3)Project.properties 文件
在使用Eclipse新建一个工程,都会在工程目录下生产配置project.properties和proguard-project.tx。

# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
# Project target.
target=android-10

project.properties用于配置Android工程的一些属性,#号的话表示当前行是注释,这里的proguard.config就用于指定ProGuard的混淆配置文件,并对使用release方式打包应用程序时开启代码混淆功能。对于是否是使用release方式打包,和AndroidManifest.xml中application的android:debuggable属性有很多关系。如果该值为android:debuggable=”true”,那么最终就是debug方式打包。最明智的方式就是在AndroidManifest.xml并不显示的指定它,而是是打包工具在打包时来决定它最终的值。对于ant就是ant release或ant debug。而对于直接在Eclipse中使用run 或debgu来打包的话就是debug,使用export的话就是release.
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
这里的话指定了混淆的基本配置文件proguard-android.txt,和混淆的个性化配置文件proguard-project.txt。
4)build_gradle 文件。
在使用AndroidStudio新建一个项目,都会在工程目录下创建一个app–>build_gradle文件,这个文件可以配置
buildTypes {//build类型
release {//发布
minifyEnabled true//混淆开启
proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-project.txt’//指定混淆规则文件
signingConfig signingConfigs.release//设置签名信息
}
混淆的参数配置。
app–>proguard-android.txt文件,这个文件可以配置混淆参数。

5)常见的不能混淆的androidCode
Android 程序 ,下面这样代码混淆的时候要注意保留。
Android系统组件,系统组件有固定的方法被系统调用。
被Android Resource 文件引用到的。名字已经固定,也不能混淆,比如自定义的View 。
Android Parcelable ,需要使用android 序列化的。
其他Anroid 官方建议 不混淆的,如
android.app.backup.BackupAgentHelper
android.preference.Preference
com.android.vending.licensing.ILicensingService
Java序列化方法,系统序列化需要固定的方法。
枚举 ,系统需要处理枚举的固定方法。
本地方法,不能修改本地方法名
annotations 注释
数据库驱动
有些resource 文件
用到反射的地方

6)通过 Android Studio进行 混淆代码时,默认已经将 lib目录中的 jar 都已经添加到打包脚本中,所以不需要再次手动添加,否则会出现“ java.io.IOException: The same input jar is specified twice” 错误。

7)第三方的混淆代码一定要加。

-optimizationpasses 5                  # 指定代码的压缩级别
-dontusemixedcaseclassnames           # 是否使用大小写混合
-dontobfuscate                         #不混淆输入的类文件
-dontpreverify                         # 混淆时是否做预校验
-verbose                               # 混淆时是否记录日志
-ignorewarnings                     # 忽略警告,避免打包时某些警告出现
-dontskipnonpubliclibraryclasses     # 是否混淆第三方jar
-optimizations !code/simplification/arithmetic,!field/,!class/merging/    # 混淆时所采用的算法

#不被混淆的类文件
-keep public class * extends android.app.Service
-keep public class * extends android.app.Fragment
-keep public class * extends android.app.Activity
-keep public class * extends adnorid.app.Application
-keep public class * extends android.content.BroadcastReceiver

#不混淆系统的网络实体类,不太清除是否有用
-dontwarn android.support.v4.**
-keep class android.support.v4.** { *; }
-keep class android.net.http.** {*;}
-keep class org.apache.http.entity.mime.** {*;}

#不混淆项目的常量
-keep class [项目包名].net.**{
    *;
}
#不混淆项目的常量
-keep class [项目包名].common.**{
    *;
}
#不混淆项目中的所有的Java Bean
-keep class [项目包名].bean.**{
    *;
}
#不混淆项目的自定义控件,因为会在项目的资源文件有引用
-keep class [项目包名].widget.**{
    *;
}
#Android官方建议不被混淆的类
-keep public class * implements java.io.Serializable
-keep public class * extends android.preference.Preference
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class com.android.vending.licensing.ILicensingService
#不混淆R文件
-keep public class [项目包名].R$*{
    public static final int *;
}
#不混淆本地的方法
-keepclasseswithmembernames class * {
native <methods>;
}
#不混淆项目资源文件
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
#不混淆项目中继承Activity的类,系统已经默认不会混淆继承Activity的类
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
#不混淆项目中使用的枚举类
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
#不混淆Java序列方法,系统序列化需要固定的方法
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}

-ignorewarnings
#设置输出文件,路径为app/build/outputs/mapping/_05sun/debug
-dump class_files.txt
-printseeds seeds.txt
-printusage unused.txt
-printmapping mapping.txt

#不混淆第三方的Jar包
-dontwarn com.facebook.rebound.**
-keep class com.facebook.rebound.** {*; }
-dontwarn com.google.gson.**
-keep class com.google.gson.** {*; }
-dontwarn com.nineoldandroids.**
-keep class com.nineoldandroids.** {*; }
-dontwarn com.readystatesoftware.**
-keep class com.readystatesoftware.** {*; }
-dontwarn com.nostra13.universalimageloader.**
-keep class com.nostra13.universalimageloader.** {*; }


#下面是友盟避免混淆的代码
-dontwarn com.umeng.**
-keep class com.umeng.**
-dontwarn com.tencent.**
-dontwarn com.facebook.**
-dontwarn android.webkit.WebView
-dontwarn com.tencent.weibo.sdk.**
-dontwarn org.apache.commons.net.**
-dontwarn com.google.android.maps.**

-keep enum com.facebook.**
-keep public class javax.**
-keep class com.facebook.**
-keep class com.umeng.scrshot.**
-keep public class android.webkit.**
-keep public class com.tencent.** {*;}
-keep public interface com.tencent.**
-keep public interface com.facebook.**
-keepattributes SourceFile,LineNumberTable
-keep class im.yixin.sdk.api.YXMessage {*;}
-keep class com.umeng.socialize.sensor.**
-keep public class com.umeng.socialize.* {*;}
-keep public interface com.umeng.scrshot.**
-keep public interface com.umeng.socialize.**
-keepattributes Exceptions,InnerClasses,Signature
-keep public interface com.umeng.socialize.sensor.**
-keep class com.tencent.mm.sdk.openapi.WXMediaMessage {*;}
-keep class im.yixin.sdk.api.** implements im.yixin.sdk.api.YXMessage$YXMessageData{*;}
-keep class com.tencent.mm.sdk.openapi.** implements com.tencent.mm.sdk.openapi.WXMediaMessage$IMediaObject {*;}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值