您现在的位置是:网站首页> Android

Android Studio中代码混淆

  • Android
  • 2021-07-21
  • 784人已阅读
摘要

我们辛辛苦苦开发一款app,如果被心怀叵测的人恶意反编译,会让人感到恶心至极!所以考虑到安全性和应用的私密性,在打包的时候,都会进行一些代码混淆处理,Android Studio(以下简称AS)中的其实已经为我们处理到了极致,我们只需要简单的配置就可以,下面就为大家在AS开发中如何完成代码的混淆进行详细介绍:



1.在 buildType中打开混淆的开关和指定混淆文件的路径:


buildTypes {

         release {

             // 不显示Log

             buildConfigField "boolean", "LOG_DEBUG", "false"

             signingConfig signingConfigs.release

             //apk瘦身,移除无用的resource文件

             shrinkResources false



             //是否开启代码混淆

             minifyEnabled true



             //此处是系统默认的混淆文件路径

             //proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

             //指定混淆配置文件的路径

             proguardFile '/Users/xxx/Documents/AndroidStudioworkspace/Project/app/proguard-rules.pro'

         }

     }


2.在项目中app目录下的proguard-rules.pro文件中添加以下内容:

#指定代码的压缩级别

 -optimizationpasses 5

 #包明不混合大小写

 -dontusemixedcaseclassnames

 #不去忽略非公共的库类

 -dontskipnonpubliclibraryclasses

  #优化  不优化输入的类文件

 -dontoptimize

  #预校验

 -dontpreverify

  #混淆时是否记录日志

 -verbose

  # 混淆时所采用的算法

 -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

 #保护注解

 -keepattributes *Annotation*

 # 保持哪些类不被混淆

 -keep public class * extends android.app.Fragment

 -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 com.android.vending.licensing.ILicensingService

 #如果有引用v4包可以添加下面这行

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

 #忽略警告

 -ignorewarning

 #####################记录生成的日志数据,gradle build时在本项目根目录输出################

 #apk 包内所有 class 的内部结构

 -dump class_files.txt

 #未混淆的类和成员

 -printseeds seeds.txt

 #列出从 apk 中删除的代码

 -printusage unused.txt

 #混淆前后的映射

 -printmapping mapping.txt

 #####################记录生成的日志数据,gradle build时 在本项目根目录输出-end################

 ################<span></span>混淆保护自己项目的部分代码以及引用的第三方jar包library#########################

 #-libraryjars libs/umeng-analytics-v5.2.4.jar

 #-libraryjars libs/alipaysd<span></span>k.jar

 #<span></span>-libraryjars libs/alipaysecsdk.jar

 #-libraryjars libs/alipayutdid.jar

 #-libraryjars libs/wup-1.0.0-SNAPSHOT.jar

 #-libraryjars libs/weibosdkcore.jar

 #三星应用市场需要添加:sdk-v1.0.0.jar,look-v1.0.1.jar

 #-libraryjars libs/sdk-v1.0.0.jar

 #-libraryjars libs/look-v1.0.1.jar

 #我是以libaray的形式引用了一个图片加载框架,如果不想混淆 keep 掉

 -keep class com.nostra13.universalimageloader.** { *; }

 #友盟

 -keep class com.umeng.**{*;}

 #支付宝

 -keep class com.alipay.android.app.IAliPay{*;}

 -keep class com.alipay.android.app.IAlixPay{*;}

 -keep class com.alipay.android.app.IRemoteServiceCallback{*;}

 -keep class com.alipay.android.app.lib.ResourceMap{*;}

 #信鸽推送

 -keep class com.tencent.android.tpush.**  {* ;}

 -keep class com.tencent.mid.**  {* ;}

 #自己项目特殊处理代码

 #忽略警告

 -dontwarn com.veidy.mobile.common.**

 #保留一个完整的包

 -keep class com.veidy.mobile.common.** {

     *;

  }

 -keep class  com.veidy.activity.login.WebLoginActivity{*;}

 -keep class  com.veidy.activity.UserInfoFragment{*;}

 -keep class  com.veidy.activity.HomeFragmentActivity{*;}

 -keep class  com.veidy.activity.CityActivity{*;}

 -keep class  com.veidy.activity.ClinikActivity{*;}

 #如果引用了v4或者v7包

 -dontwarn android.support.**

 ############<span></span>混淆保护自己项目的部分代码以及引用的第三方jar包library-end##################

 -keep public class * extends android.view.View {

     public <init>(android.content.Context);

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

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

     public void set*(...);

 }

 #保持 native 方法不被混淆

 -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);

 }

 #保持自定义控件类不被混淆

 -keepclassmembers class * extends android.app.Activity {

     public void *(android.view.View);

 }

 #保持 Parcelable 不被混淆

 -keep class * implements android.os.Parcelable {

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

 }

 #保持 Serializable 不被混淆

 -keepnames class * implements java.io.Serializable

 #保持 Serializable 不被混淆并且enum 类也不被混淆

 #-keepclassmembers enum * {

 #  public static **[] values();

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

 #}

 -keepclassmembers class * {

     public void *ButtonClicked(android.view.View);

 }

 #不混淆资源类

 -keepclassmembers class **.R$* {

     public static <fields>;

 }

 #避免混淆泛型 如果混淆报错建议关掉

 #–keepattributes Signature

 #移除log 测试了下没有用还是建议自己定义一个开关控制是否输出日志

 #-assumenosideeffects class android.util.Log {

 #    public static boolean isLoggable(java.lang.String, int);

 #    public static int v(...);

 #    public static int i(...);

 #    public static int w(...);

 #    public static int d(...);

 #    public static int e(...);

 #}


3.解压apk,获取到classes.dex文件(如果解压不了,先把apk后缀名改成zip。我用好压可以直接解压);


4.下载dex2jar, 链接:http://pan.baidu.com/s/1qX80c36 密码:dvbb ,把classes.dex文件放到 dex2jar 根目录,用dos定位到该目录,windows执行dos 命令:dex2jar.bat calsses.dex (Mac执行:sh dex2jar.sh classes.dex) 生成classes_dex2jar文件;


5. 下载并安装反编译工具jd-gui,链接:http://pan.baidu.com/s/1qY7uxwK密码:rk1h;


6.下载jd-gui并且安装,用jd-gui打开classes_dex2jar,点击列表类,如果出现abc等等类名表示混淆成功!


Top