代码混淆+反编译

在module下的build.gradle文件里把minifyEnabled 改成 true并加以下几行代码
buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            android.applicationVariants.all { variant ->
                variant.outputs.all {
                    outputFileName = "EveryWhereTrip_${defaultConfig.versionName}_${releaseTime()}.apk"
                }
            }
        }
    }
releaseTime()的代码,放在module下的build.gradle文件里的dependencies上面
// 获取当前系统时间
def releaseTime() {
    return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}
dependencies {
    ...
}
混淆之后debug就不能运行了,如果想用debug,在module下的build.gradle文件里加以下代码(debug开头的那些)
buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            android.applicationVariants.all { variant ->
                variant.outputs.all {
                    outputFileName = "EveryWhereTrip_${defaultConfig.versionName}_${releaseTime()}.apk"
                }
            }
        }
        debug {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            android.applicationVariants.all { variant ->
                variant.outputs.all {
                    outputFileName = "EveryWhereTrip_${defaultConfig.versionName}_${releaseTime()}.apk"
                }
            }
        }
    }
在proguard-rules.pro文件里(对应需要混淆的module)
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}

# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable

# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

-dontwarn javax.annotation.**
-dontwarn javax.inject.**
# OkHttp3
-dontwarn okhttp3.logging.**
-keep class okhttp3.internal.**{*;}
-dontwarn okio.**
# Retrofit
-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
# RxJava RxAndroid
-dontwarn sun.misc.**
-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
    long producerIndex;
    long consumerIndex;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
    rx.internal.util.atomic.LinkedQueueNode producerNode;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {
    rx.internal.util.atomic.LinkedQueueNode consumerNode;
}

# Gson
-keep class com.google.gson.stream.** { *; }
-keepattributes EnclosingMethod


##---------------Begin: proguard configuration for Gson ----------
 -keep public class com.google.gson.**
 -keep public class com.google.gson.** {public private protected *;}

 -keep public class com.project.mocha_patient.login.SignResponseData { private *; }

 ##---------------End: proguard configuration for Gson ----------


 ############ --------以下通用--------###########
  #指定代码的压缩级别
  -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.support.v7.app.AppCompatActivity
  -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

  ## 自定义控件
  -keep class com.everywhere.trip.widget.**{*;}


  #忽略警告
  -ignorewarning

  ##记录生成的日志数据,gradle build时在本项目根目录输出##
  #apk 包内所有 class 的内部结构
  -dump proguard/class_files.txt
  #未混淆的类和成员
  -printseeds proguard/seeds.txt
  #列出从 apk 中删除的代码
  -printusage proguard/unused.txt
  #混淆前后的映射
  -printmapping proguard/mapping.txt
  ########记录生成的日志数据,gradle build时 在本项目根目录输出-end######

  #如果引用了v4或者v7包
  -dontwarn android.support.**

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



  #保持 native 方法不被混淆
  -keepclasseswithmembernames class * {
      native ;
  }

  #保持自定义控件类不被混淆
  -keepclasseswithmembers class * {
      public (android.content.Context, android.util.AttributeSet);
  }

  #保持自定义控件类不被混淆
  -keepclassmembers class * extends android.app.Activity {
     public void *(android.view.View);
  }

  -keep public class * extends android.view.View {
      public (android.content.Context);
      public (android.content.Context, android.util.AttributeSet);
      public (android.content.Context, android.util.AttributeSet, int);
      public void set*(...);
  }

  #保持 Parcelable 不被混淆
  -keep class * implements android.os.Parcelable {
    public static final android.os.Parcelable$Creator *;
  }

  #保持 Serializable 不被混淆
  -keepnames class * implements java.io.Serializable

  #保持 Serializable 不被混淆并且enum 类也不被混淆
  -keepclassmembers class * implements java.io.Serializable {
      static final long serialVersionUID;
      private static final java.io.ObjectStreamField[] serialPersistentFields;
      !static !transient ;
      !private ;
      !private ;
      private void writeObject(java.io.ObjectOutputStream);
      private void readObject(java.io.ObjectInputStream);
      java.lang.Object writeReplace();
      java.lang.Object readResolve();
  }

  #保持枚举 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 ;
  }

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

  #移除Log类打印各个等级日志的代码,打正式包的时候可以做为禁log使用,这里可以作为禁止log打印的功能使用,另外的一种实现方案是通过BuildConfig.DEBUG的变量来控制
  #-assumenosideeffects class android.util.Log {
  #    public static *** v(...);
  #    public static *** i(...);
  #    public static *** d(...);
  #    public static *** w(...);
  #    public static *** e(...);
  #}

  #############################################################################################
  ########################                 以上通用           ##################################
  #############################################################################################


# 保留实体类和成员不被混淆
-keep public class com.example.lenovo.everywheretravel.bean.** {
    *;
}

# 对WebView的处理
-keepclassmembers class * extends android.webkit.webViewClient {
    public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);
    public boolean *(android.webkit.WebView, java.lang.String);
}
-keepclassmembers class * extends android.webkit.webViewClient {
    public void *(android.webkit.webView, java.lang.String);
}

#自定义View
-keep public class com.everywhere.trip.widget.** {*;}

# 针对android-support-v4.jar的解决方案android.support.v4.app.Fragment
-dontwarn android.support.v4.**
-keep class android.support.v4.**  { *; }
-keep interface android.support.v4.app.** { *; }
-keep public class * extends android.support.v4.**
-keep public class * extends android.app.Fragment


#Glide
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.module.AppGlideModule
-keep public enum com.bumptech.glide.load.ImageHeaderParser$** {
  **[] $VALUES;
  public *;
}


#glide.transformations
-keep class jp.wasabeef.glide.transformations.**

#butterknife
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }
-keepclasseswithmembernames class * {
    @butterknife.* ;
}
-keepclasseswithmembernames class * {
    @butterknife.* ;
}

#com.android.support:design
-keep class com.android.** { *; }




#agentweb
-keep class com.just.agentweb.** {
    *;
}
-dontwarn com.just.agentweb.**
-keepclassmembers class com.just.agentweb.sample.common.AndroidInterface{ *; }

#StatusBarUtil
-keep class com.jaeger.library.**{}

#友盟配置  start
-dontshrink
-dontoptimize
-dontwarn com.google.android.maps.**
-dontwarn android.webkit.WebView
-dontwarn com.umeng.**
-dontwarn com.tencent.weibo.sdk.**
-dontwarn com.facebook.**
-keep public class javax.**
-keep public class android.webkit.**
-dontwarn android.support.v4.**
-keep enum com.facebook.**
-keepattributes Exceptions,InnerClasses,Signature
-keepattributes *Annotation*
-keepattributes SourceFile,LineNumberTable

-keep public interface com.facebook.**
-keep public interface com.tencent.**
-keep public interface com.umeng.socialize.**
-keep public interface com.umeng.socialize.sensor.**
-keep public interface com.umeng.scrshot.**

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


-keep class com.facebook.**
-keep class com.facebook.** { *; }
-keep class com.umeng.scrshot.**
-keep public class com.tencent.** {*;}
-keep class com.umeng.socialize.sensor.**
-keep class com.umeng.socialize.handler.**
-keep class com.umeng.socialize.handler.*
-keep class com.umeng.weixin.handler.**
-keep class com.umeng.weixin.handler.*
-keep class com.umeng.qq.handler.**
-keep class com.umeng.qq.handler.*
-keep class UMMoreHandler{*;}
-keep class com.tencent.mm.sdk.modelmsg.WXMediaMessage {*;}
-keep class com.tencent.mm.sdk.modelmsg.** implements com.tencent.mm.sdk.modelmsg.WXMediaMessage$IMediaObject {*;}
-keep class im.yixin.sdk.api.YXMessage {*;}
-keep class im.yixin.sdk.api.** implements im.yixin.sdk.api.YXMessage$YXMessageData{*;}
-keep class com.tencent.mm.sdk.** {
   *;
}
-keep class com.tencent.mm.opensdk.** {
   *;
}
-keep class com.tencent.wxop.** {
   *;
}
-keep class com.tencent.mm.sdk.** {
   *;
}
-dontwarn twitter4j.**
-keep class twitter4j.** { *; }

-keep class com.tencent.** {*;}
-dontwarn com.tencent.**
-keep class com.kakao.** {*;}
-dontwarn com.kakao.**
-keep public class com.umeng.com.umeng.soexample.R$*{
    public static final int *;
}
-keep public class com.linkedin.android.mobilesdk.R$*{
    public static final int *;
}
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class com.tencent.open.TDialog$*
-keep class com.tencent.open.TDialog$* {*;}
-keep class com.tencent.open.PKDialog
-keep class com.tencent.open.PKDialog {*;}
-keep class com.tencent.open.PKDialog$*
-keep class com.tencent.open.PKDialog$* {*;}
-keep class com.umeng.socialize.impl.ImageImpl {*;}
-keep class com.sina.** {*;}
-dontwarn com.sina.**
-keep class  com.alipay.share.sdk.** {
   *;
}

-keepnames class * implements android.os.Parcelable {
    public static final ** CREATOR;
}

-keep class com.linkedin.** { *; }
-keep class com.android.dingtalk.share.ddsharemodule.** { *; }
-keepattributes Signature
    #友盟配置  end

注意:把 保留实体类和成员不被混淆 中的包名换成需要混淆的module下的bean类的包名

# 保留实体类和成员不被混淆
-keep public class com.example.lenovo.everywheretravel.bean.** {
    *;
}
然后把项目重新打包并运行,看是否能正常运行

反编译

使用 Android逆向助手可以对应用进行反编译,进而得到对应的源码
1.我们将应用的后缀改为.zip,解压后得到如下内容


代码混淆+反编译_第1张图片
35303c61-8d4c-4db3-adf7-8e399498c215.png

可以得到lib,还有资源以及清单文件,java代码以及被打包成了classs.dex文件,那我们怎么得到源码,这时候就需要进行反编译了
2.使用Android逆向助手对应用进行反编译
打开Android逆向助手.exe,然后选中dex2jar,然后将apk包拖拽到要反编译的位置,点击操作即可,完成反编译后会将.dex文件编译未.jar文件,并且自动弹出可视化窗口打开编译后的.jar文件,可以找到对应的包下面的源码

注意:
1.进行过混淆的apk,反编译后里面的内容被混淆过了,类名,方法名,变量名,全部都是a,bc,...一些无实际意义的字符,可以通过反编译查看我们是否混淆成功
2.进行加固过的apk无法获取到里面的源码

android中哪些东西不能做代码混淆

Android系统组件,系统组件有固定的方法被系统调用。

被Android Resource 文件引用到的。名字已经固定,也不能混淆,比如自定义的View 。

Android Parcelable ,需要使用android 序列化的。

其他Anroid 官方建议 不混淆的,如

android.app.backup.BackupAgentHelper
android.preference.Preference
com.android.vending.licensing.ILicensingService
Java序列化方法,系统序列化需要固定的方法。

枚举 ,系统需要处理枚举的固定方法。

本地方法,不能修改本地方法名

annotations 注释

数据库驱动

有些resource 文件

用到反射的地方

你可能感兴趣的:(代码混淆+反编译)