关闭

Android开发中的代码混淆

标签: android开发反编译逆向助手代码混淆
146人阅读 评论(1) 收藏 举报
分类:

编写不易,如有转载,请声明出处: 梦回河口:http://blog.csdn.net/zxc514257857/article/details/78533913

前言

  代码混淆是在apk功能基本开发完成后进行的代码保护操作,混淆后的apk通过dex转jar进行反编译后,混淆部分的类名、方法名全部为英文字母,使反编译者难以理解代码,达到代码保护的目的

gradle文件配置

  项目的build.gradle文件配置如下:

buildTypes {
    release {
        // 打开混淆
        minifyEnabled true
        // 加载默认混淆配置文件
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        // 签名
        signingConfig signingConfigs.release
        // 移除无用的resourse资源
        shrinkResources true
        // Zipalign优化
        zipAlignEnabled true
    }
    debug {
        // 签名
        signingConfig signingConfigs.release
    }
}

  在打Release包时配置混淆即可,打debug包时打开混淆,时间较慢,降低调试效率

proguard-rules文件配置

  在项目的build.gradle文件配置了加载默认混淆配置文件路径为项目中的proguard-rules.pro。proguard-rules文件配置参考了: 5分钟搞定android混淆 这篇文件,写得简单易懂,值得参考
  以下是我的配置内容:

#-------------------------------------------定制化区域----------------------------------------------
#---------------------------------1.实体类---------------------------------
-keep class com.zhumei.commercialscreen.bean.** { *; }

#-------------------------------------------------------------------------

#---------------------------------2.第三方包-------------------------------
# Okhttputils
-dontwarn com.zhy.http.**
-keep class com.zhy.http.**{*;}

# Okhttp
-dontwarn okhttp3.**
-keep class okhttp3.**{*;}

# Okio
-dontwarn okio.**
-keep class okio.**{*;}

# SwipeRecyclerView
-keepclasseswithmembers class android.support.v7.widget.RecyclerView$ViewHolder {
   public final View *;
}

# Filedownloader
# Percent-support-extends
# IjkPlayer

# 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.resource.bitmap.ImageHeaderParser$** {
  **[] $VALUES;
  public *;
}

# Butterknife
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-dontwarn butterknife.internal.ButterKnifeProcessor.**
-keep class **$$ViewBinder { *; }

-keepclasseswithmembernames class * {
    @butterknife.* <fields>;
}

-keepclasseswithmembernames class * {
    @butterknife.* <methods>;
}

# Gson specific classes
-keep class sun.misc.Unsafe { *; }
#-keep class com.google.gson.stream.** { *; }
# Application classes that will be serialized/deserialized over Gson    Gson需要配置的javaBean目录,在实体类中已经配置
# -keep class com.google.gson.examples.android.model.** { *; }

#-------------------------------------------------------------------------

#---------------------------------3.与js互相调用的类------------------------



#-------------------------------------------------------------------------

#---------------------------------4.反射相关的类和方法-----------------------



#----------------------------------------------------------------------------
#---------------------------------------------------------------------------------------------------

#-------------------------------------------基本不用动区域--------------------------------------------
#---------------------------------基本指令区----------------------------------
# 指定代码的压缩级别,0-7之间
-optimizationpasses 5
# 混淆后类名均为小写
-dontusemixedcaseclassnames
# 不去忽略非公共的库和类
-dontskipnonpubliclibraryclasses
# 不优化输入的类文件
-dontoptimize
# 不去预校验
-dontpreverify
# 生成原类名和混淆后的类名的映射文件
-verbose
-printmapping proguardMapping.txt
# 混淆时所采用的算法
-optimizations !code/simplification/cast,!field/*,!class/merging/*
# 不混淆注解和内部类
-keepattributes *Annotation*,InnerClasses
# 不混淆泛型 如果混淆报错建议关掉
-keepattributes Signature
# 抛出异常时保留代码行号
-keepattributes SourceFile,LineNumberTable
#----------------------------------------------------------------------------

#---------------------------------默认保留区---------------------------------
-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
-keep public class com.android.vending.licensing.ILicensingService
-keep class android.support.** {*;}

-keepclasseswithmembernames class * {
    native <methods>;
}
-keepclassmembers class * extends android.app.Activity{
    public void *(android.view.View);
}
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}
-keep public class * extends android.view.View{
    *** get*();
    void set*(***);
    public <init>(android.content.Context);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}
-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}
-keep class **.R$* {
 *;
}
-keepclassmembers class * {
    void *(**On*Event);
}
#----------------------------------------------------------------------------

#---------------------------------webview------------------------------------
-keepclassmembers class fqcn.of.javascript.interface.for.Webview {
   public *;
}
-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, jav.lang.String);
}
#----------------------------------------------------------------------------
#---------------------------------------------------------------------------------------------------

打包测试

  以上配置完成之后,即可打Release包测试混淆是否成功,在打Release包的时候可能会出现报错情况,比如:

java.io.FileNotFoundException: ...\proguard-rules\release\aapt_rules.txt (系统找不到指定的路径)

  遇到这种情况需在菜单栏选择build –> Clean Project ,然后再build –> Make Project即可,然后就能在这个路径下找到这个aapt_rules.txt文件了,再次混淆就不会报同样错误了

  如果混淆没有报错就可以通过反编译代码,将dex转jar后,查看混淆过的类和方法名是否变为字母来判断是否混淆成功,如图:
这里写图片描述

这里写图片描述

反编译工具下载请移步:http://download.csdn.net/download/zxc514257857/10118640


———-因本人才疏学浅,如博客或Demo中有错误的地方请大家随意指出,与大家一起讨论,共同进步,谢谢!———-

1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Android 项目如何添加代码混淆

在网上搜“代码混淆”关键词,可以看到n多教程。包括本篇博客,大部分重要内容也是从网上各位大神的博客里面看到然后摘取和总结出来的。虽然网上都有,但是对于我个人来说,很难找到一篇博客概括完全的,所以还是总...
  • qq_31712553
  • qq_31712553
  • 2017-04-25 11:13
  • 623

Android Studio实现代码混淆

转至:http://www.bubuko.com/infodetail-987756.html 1,在build.grandle添加,其中规则写在proguard-rules.pro中,也可以自定义...
  • h183288132
  • h183288132
  • 2016-02-02 11:31
  • 2859

Android studio aar 生成 和代码混淆

本文主要讲解如何将一个app模块改造生成一个带界面资源的库,也就是aar。 接着还讲到,如何修改混淆配置,生成混淆后的aar。1. aar 生成1.1 build.gradle 文件 模块是libr...
  • lengqi0101
  • lengqi0101
  • 2016-08-18 16:41
  • 7185

(通用)Android App代码混淆终极解决方案

(通用)Android App代码混淆终极解决方案 2017-03-22 04:14 499人阅读 评论(0) 收藏 举报  分类: Android(108)  ...
  • w690333243
  • w690333243
  • 2017-07-25 14:33
  • 1479

使用Android Studio手把手教你将应用打包+代码混淆

最近几天用Google的Design库写了个App,使用Android Studio将app打包时遇到的几个瓶颈,所以把详细步骤写入下来。 AS中怎么获取应用签名 这和eclipse不...
  • u013378580
  • u013378580
  • 2016-09-21 18:06
  • 854

android sdk 打包混淆

前面文章《Proguard进行源代码混淆》讲解过怎么使用Proguard工具对Android的源代码进行混淆的方法(感兴趣的朋友可以访问:http://blog.csdn.net/p106786860...
  • langwang2
  • langwang2
  • 2015-09-25 11:48
  • 1123

Android代码混淆需要知道以及注意的事情

自古英雄不问出处,奈何我不是英雄! 转载请标明出处: 以前项目中没有做过代码混淆,近期公司项目被安全测试机构检测出安全问题,结果第一个就是混淆问题,木有办法,只有混淆了。没有做过混淆真是一头雾水,前前...
  • u011275767
  • u011275767
  • 2015-06-10 12:24
  • 1054

AndroidStudio中代码混淆以及打包操作

摸索了两天,大概了解了在AndroidStudio中代码混淆和打包发布的过程,在此记录下。代码混淆:关于代码混淆的作用,就不多解释了,整个过程大致如下: 在app下的build.gradle文件中添加...
  • TTCCAAA
  • TTCCAAA
  • 2015-08-15 22:37
  • 15907

Android代码混淆之混淆规则

因为Android是使用Java开发的,所以开发者可以使用ProGuard对代码进行混淆。SDK已经集成了ProGuard工具,开发者可以从SDK目录下的\tools\proguard目录中进行查看。...
  • fengyuzhengfan
  • fengyuzhengfan
  • 2015-02-18 14:51
  • 35691

cordova工程混淆导出时的配置

对cordova项目进行混淆会导致插件无法调起。解决办法是不混淆cordova相关代码,并在proguard文件中添加如下命令: -repackageclasses '' -allowaccess...
  • superk123
  • superk123
  • 2015-04-08 14:17
  • 1277
    博客公告
    个人资料
    • 访问:117313次
    • 积分:2091
    • 等级:
    • 排名:千里之外
    • 原创:118篇
    • 转载:2篇
    • 译文:0篇
    • 评论:33条