`
ydbc
  • 浏览: 766746 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

日积月累:Proguard进行Android代码混淆

 
阅读更多

在实际的开发成产品apk的发布过程中,我们经常会使用到代码混淆技术。不过在讲解如何进行代码混淆之前,我先跟大家演示一下反编译的过程,这样才能让大家明白为什么需要进行代码混淆。

一、代码反编译

1.准备工作

首先我们准备好一个项目的apk文件(未进行混淆打包)、dex2jar工具(下载地址:http://code.google.com/p/dex2jar/)、jd-gui工具(下载地址http://jd-gui.softpedia.com/)。



2.获取CodeMixTest.apk中的classes.dex文件

将CodeMixTest.apk解压,这里我们为了方便就直接解压到当前文件夹下。在解压出的文件中,我们可以看见有一个classes.dex文件,这就是我们的源代码打包生成的文件。


3.使用dex2jar工具还原jar文件

dex2jar工具的作用就是将class.dex文件还原成.jar文件。先将dex2jar-0.0.9.15.zip解压,然后将上面获得的classes.dex文件拷贝至解压的目录中。


查看解压目录中,有dex2jar.bat文件。


启动cmd,进入到dex2jar工具解压的目录中,运行命令:dex2jar.bat classes.dex,有如下结果


查看dex2jar工具解压的目录中,生成了我们想要得到的classes_dex2jar.jar文件。


4.使用jd-gui工具查看jar文件

jd-gui-0.3.5.windows.zip工具解压,为了方便我们直接解压到当前文件夹,我们会看见一个jd-gui.exe文件。


双击jd-gui.exe,使用工具打开前面我们获得的classes_dex2jar.jar文件。可以清楚的看见源代码。


是企业真实的项目中,如果不经过代码混淆,你的源码就如此赤裸裸的暴露着。这样对于公司来说是非常不安全的,并且不想发生的情况。既然我们已经看见了反编译如此的威力,那么我们有什么办法可以解决这个问题呢?看下面讲解。

二、代码混淆

1.准备工作

首先,我们得将我们的项目源码、proguard工具(放心这个工具Google已经在sdk中为我们提供了,在sdk\tools目录下可以看到)、proguard.cfg文件(该文件定义了混淆的规则,创建2.3以上项目自动生成,或者在网上可以很容易下载到)。


2.在你的项目中添加proguard.cfg文件

该文件Google公司已经为我们准备好了,创建项目时,在项目的根目录下就有了,但是是从2.3开始的。不过我们基于2.2的项目只需要将该文件拷贝到项目根目录下即可。


3.修改项目的default.properties配置文件

Android项目默认在打包的时候是不混淆代码的,所以我们必须得在default.properties文件中,添加该配置:proguard.config=proguard.cfg



4.进行apk打包

好了,一切就绪,接下来我们就按着平常的打包步骤,进行打包操作。打完包后,我们使用上面讲述的反编译方法,查看现在的jar文件


会发现,混淆了许多aa、bb、cc的包、aa、bb、cc的类和方法,这样的代码根本无法阅读,也就达到了我们保护源代码的目的了

三、produard.cfg文件

我们在看看produard.cfg文件,该文件中描述了混淆代码的规则,你如果想根据自己的需求来混淆代码,就可以在本文件中编写你的混淆规则。一般情况下,该文件的内容如下:

-optimizationpasses 5 
-dontusemixedcaseclassnames//混淆时不会产生形形色色的类名 
-dontskipnonpubliclibraryclasses//指定不去忽略非公共的类库 
-dontpreverify//不预校验 
-verbose 
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*//优化 
 
//不进行混淆保持原样 
-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 
 
//保护指定的类和类的成员的名称,如果所有指定的类成员出席 
-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); 
} 
 
-keepclassmembers enum * { 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 
} 
 
//保护指定的类文件和类成员 
-keep class * implements android.os.Parcelable { 
  public static final android.os.Parcelable$Creator *; 
} 

四、可能出现的问题

1.因为使用了升级后使用android-support-v4而发生混淆错误,无法打包出现如下错误:

Unexpectederrorwhileevaluatinginstruction: Class=[android/support/v4/view/AccessibilityDelegateCompat$AccessibilityDelegateJellyBeanImpl] Method=[newAccessiblityDelegateBridge(Landroid/support/v4/view/AccessibilityDelegateCompat;)Ljava/lang/Object;]Instruction=[18]areturn Exception=1(Can'tfindanysuperclassesof[android/support/v4/view/AccessibilityDelegateCompatIcs$1](notevenimmediatesuperclass[android/view/View$AccessibilityDelegate])) Unexpectederrorwhileperformingpartialevaluation: Class=[android/support/v4/view/AccessibilityDelegateCompat$AccessibilityDelegateJellyBeanImpl] Method=[newAccessiblityDelegateBridge(Landroid/support/v4/view/AccessibilityDelegateCompat;)Ljava/lang/Object;] Exception=1(Can'tfindanysuperclassesof[android/support/v4/view/AccessibilityDelegateCompatIcs$1](notevenimmediatesuperclass[android/view/View$AccessibilityDelegate])) java.lang.IllegalArgumentException:Can'tfindanysuperclassesof[android/support/v4/view/AccessibilityDelegateCompatIcs$1](notevenimmediatesuperclass[android/view/View$AccessibilityDelegate]) atproguard.evaluation.value.ReferenceValue.generalize(ReferenceValue.java:287)

你需要在proguard.cfg文件中添加如下代码

-libraryjarslibs/android-support-v4.jar
-dontwarnandroid.support.v4.**
-keepclassandroid.support.v4.**{*;}
-keepinterfaceandroid.support.v4.app.**{*;}
-keeppublicclass*extendsandroid.support.v4.**
-keeppublicclass*extendsandroid.app.Fragment

2.如果你使用了第三方的包,你需要使用一下配置,让ProGuard知道库中的一些类并不是在所有的API中可用:

-libraryjars libs/roboguice-2.0.jar

-dontwarnroboguice.**

3.在打包的过程中,出现如下错误:

Proguardreturned with error code 1. See console
[2012-09-25 09:50:39 - estore3601] Error: @C:\Users\hp\AppData\Local\Temp\android_5192919586673521494.pro (文件名、目录名或卷标语法不正确。)

你需要系在ProGuard最新版本,如v4.8。然后解压produard4.8.zip文件,将bin和lib两个文件夹覆盖sdk目录\tool\proguard目录中同名的文件夹

分享到:
评论

相关推荐

    Android Java代码混淆工具:ProGuard简介及使用.docx

    在Android开发中,ProGuard是最广泛使用的Java代码混淆工具之一,它不仅能够混淆代码,还能够对代码进行优化,减少APK的大小,提高运行效率。 #### ProGuard的工作原理 ProGuard通过对类、方法和字段的名称进行...

    java代码混淆器proGuard

    - 对于Android应用,ProGuard是默认的代码混淆工具,防止恶意用户分析和篡改代码。 - 对于服务器端的Java应用,混淆可以增强代码的保密性,减少知识产权泄露的风险。 - 对于开源项目,混淆可以保护作者的劳动成果...

    SpringBoot + proguard+maven多模块实现代码混淆

    基于SpringBoot+Maven多模块工程利用proguard组件实现代码混淆的代码demo,代码清晰完整,导入idea或eclipse即可运行。 使用 proguard 混淆代码只能增加阅读和理解的难度, 并不能百分百保证代码安全。常用的应用...

    springboot工程(单个maven工程)利用proguard实现代码混淆

    基于springboot搭建一个简单案例,利用proguard插件实现代码混淆,增加源代码的阅读和理解的难度, 并不能百分百保证代码安全。常用的应用场景是项目需要部署到客户机器上,一定程度上防止代码泄露。 ProGuard 是一个...

    Android 4.0及以上版本 ProGuard 代码混淆

    ### Android 4.0 及以上版本 ProGuard 代码混淆详解 #### 一、ProGuard 简介 ProGuard 是一款广泛应用于 Android 开发中的代码混淆工具,它能够通过删除未使用的类、字段、方法等,从而缩小 APK 的体积,并提高...

    ProGuard工具包,Java代码混淆

    5. **预校验**:对于Android应用,ProGuard会进行Dalvik字节码的预校验,确保混淆后的代码能在Android设备上正确运行。 ### 3. ProGuard配置 ProGuard的配置文件通常为`proguard.cfg`或`proguard-project.txt`,...

    proguard(java代码混淆器)v5.3.3官方版

    proguard是一个java代码混淆工具,并提供了图形化用户界面,它也可以结合Ant或J2ME Wireless Toolkit使用。通过ProGuard得到的更精简的jar文件意味着只需要更小的存储空间混淆环节会用无意义的短变量去重命名类、...

    proguard,代码混淆

    在Android开发中,ProGuard还可以进行预校验,检查混淆后的代码是否符合Dalvik虚拟机的要求,避免因混淆导致的运行时错误。 **6. 使用流程:** 在Android Studio中,ProGuard的集成使得混淆变得简单。只需在build....

    proguard5.2.1java代码混淆工具

    proguard5.2.1java代码混淆工具,混淆文档参照 http://download.csdn.net/detail/zysap/9684388

    通过proguard5.2.1代码混淆工具和简单说明

    本实例使用的是把web项目中的源码(src)所有文件打包成jar文件,使用proguard混淆后再把jar文件以及jar解压后的混淆class类文件替换原war项目的相应位置即可。 混淆过程中需要使用keep参数来保持原有一些属性、注解...

    Android代码混淆配置

    本篇文章将深入探讨Android代码混淆配置的细节,帮助开发者理解如何有效地使用这一技术。 混淆是通过重命名类、方法和变量,使得原始代码变得难以理解的过程。在Android中,我们通常使用ProGuard工具进行代码混淆,...

    开源bbs源码java-Android-ProGuard:Android分享:代码混淆那些事

    它可以混淆Android项目里面的java代码,对的,你没看错,仅仅是java代码。它是无法混淆Native代码,资源文件drawable、xml等。 ProGuard作用 压缩: 移除无效的类、属性、方法等 优化: 优化字节码,并删除未使用的...

    Proguard混淆Web项目(Spring+Struts2+Mybatis)

    "Proguard混淆Web项目(Spring+Struts2+Mybatis)"是一个针对这类需求的实践案例,它利用了Proguard这一强大的代码混淆、优化和压缩工具。下面我们将深入探讨Proguard的相关知识点及其在Web项目中的应用。 Proguard...

    springboot工程(单个maven工程)利用proguard实现代码混淆 java demo案例

    Spring Boot作为Java领域广泛使用的微服务框架,其工程结构通常包含敏感信息和业务逻辑,因此,对代码进行混淆处理可以有效防止逆向工程攻击,同时也能优化应用的运行效率。ProGuard是一款强大的Java类文件混淆、...

    java 代码混淆 proguard

    4. **预检查**:在混淆之前,ProGuard会进行一系列的预检查,确保混淆过程不会破坏代码的正确性。 ProGuard的配置文件(通常是`proguard.cfg`或`proguard-project.txt`)允许开发者指定保留哪些类、方法和字段不被...

    android 代码混淆_v2.0

    本文将详细探讨Android代码混淆的原理及其实践方法。 #### 二、代码混淆的目的 1. **保护知识产权**:通过混淆处理后的代码很难被逆向工程,这有助于保护开发者的核心算法和逻辑不被盗用。 2. **减小APK大小**:...

    java代码混淆工具proguard及教程讲解

    java代码混淆工具 简单使用docx 字典文件 生成的配置示例

    Android代码混淆前后分析

    本文将深入探讨Android代码混淆的前因后果、原理以及如何实施。 首先,我们来理解什么是代码混淆。代码混淆是将源代码转换成一种难以理解和阅读的形式,通常通过重命名变量、方法和类名,以及压缩和优化代码结构来...

    介绍了Android代码混淆的三种方法及可能出现的问题

    在这个选项中可对即将执行的混淆进行配置。 jocky 的混淆配置包括四个部分:配置文件名称、混淆的级别、JDK 版本和.class 文件的输出文件夹。混淆的级别可以设置为包可见、protected、public 等不同的级别。 二、...

Global site tag (gtag.js) - Google Analytics