Android实战技巧之十四:混淆与反编译

混淆

Android Studio:

只需在build.gradle(Module:app)中的buildTypes中增加release的编译选项即可,如下:

 buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile(‘proguard-android.txt‘), ‘proguard-rules.pro‘
        }
    }

这个proguard-android.txt是sdk中groguard默认的文件,具体地址在:/opt/sdk/tools/proguard/proguard-android.txt

而proguard-rules.pro是AS中专用的proguard配置文件,其实只是后缀名不同,与Eclipse中的proguard-project.txt是一样的,配置规则相同,后面会详细提到。

老版本开启混淆的命令是runProguard,现在统一用minifyEnabled命令了,将其设为true就好了。

编译的时候可以使用命令:

./gradlew assembleRelease

或者用上一篇生成签名apk的办法都可。

Eclipse:

在project.properties文件中开启proguard配置(放开注释),如下:

proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt

同样,生成签名时代码就会被混淆。

混淆语法

请参考${sdk.dir}/tools/proguard/proguard-android.txt文件,需要注意的是文件中虽然有了不混淆Parcelable的语句,如下:

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

但是还是要自己把继承自Parcelable的类写进来避免混淆,否则会出现BadParcelableException异常。

-keep class com.linc.datatype.XXInfo {*;}

为了验证是否混淆成功,可以使用下面的反编译工具验证。


反编译

主要用到三个工具:

dex2jar:将dex文件转为jar文件

jd-gui:反编译jar文件

AXMLPrinter2.jar:反编译xml文件

使用方法参见《反编译apk文件,得到其源代码的方法》

对于Ubuntu64位,运行jd-gui或许会报错:

尝试解决如下:

$ sudo apt-get install libgtk2.0-0:i386 libnss3:i386 libcurl3-gnutls:i386 libidn11:i386 libpango1.0-0:i386 libpangox-1.0-0:i386 libpangoxft-1.0-0:i386 librtmp0:i386 libxft2:i386

又报错:

$ /opt/sdk/tools/jd-gui: error while loading shared libraries: libXxf86vm.so.1: cannot open shared object file: No such file or directory

解决办法如下:

$ sudo apt-get install libgtk2.0-0:i386 libxxf86vm1:i386 libsm6:i386 lib32stdc++6

参考:

http://blog.csdn.net/lincyang/article/details/6333974

时间: 2024-11-05 22:03:54

Android实战技巧之十四:混淆与反编译的相关文章

Android实战技巧之四十四:Hello,Native!

在Android上运行C程序对于做上层App的童鞋来说有些陌生,因为目前的Android应用开发怎么还是绕不过Java. 但对于底层驱动开发者,这就是家常便饭一样,因为Android是Linux分支,底层是C/C++的世界. 有时为了测试一些功能,我们也会编写直接运行在Android终端下的C程序.前提是有Android交叉编译器以及Android系统的root权限. 交叉编译工具 ndk为我们开发native程序做了很多工作,下面我们将Android交叉编译工具从ndk中分离出来. 我的系统是

Android实战技巧之十:获得屏幕物理尺寸、密度及分辨率

大家帮忙喽! 博主参加2014博客之星活动,大家帮忙投票啦!猛击这里! 通过程序去了解硬件情况是一件十分有意思的事情.很早我就研究在WM6.5上获得屏幕物理尺寸,但一直没有成功.后来又想要在Android上有所突破,不过在今天之前得到的尺寸都不准确.虽然很多人认为没必要这么较真,因为貌似很多情况下用不到.不过我就当这是一件很有挑战性的事,一定要做到.对,就是这么任性. 源码中android.view包下的Display类提供了很多方法供程序员获得显示相关的信息,通过此类让我们开启了解设备屏幕之旅

Android实战技巧之三十:人脸检测-静态

最近微软的how-old.net把人脸识别技术又大大的火了一把.通过大数据和复杂的算法,能够神奇的预测出照片中人物的性别和年龄.虽然错误率也不低,但是大家都抱着玩一玩乐一乐的心态把照片传上去让机器来鉴定一下自己的颜龄. 人脸识别算法是高深复杂的,面对着计算机视觉的种种数学公式,我就已经投降了.先来简单的玩玩人脸检测吧.Android早已提供了FaceDetector类,今天就来看看如何使用这个类人脸检测吧. 流程: 1.打开文件夹选择照片 2.将照片加载到bitmap中并缩放到设置的宽高 3.用

Android实战技巧之四十九:Usb通信之USB Host

零 USB背景知识 USB是一种数据通信方式,也是一种数据总线,而且是最复杂的总线之一. 硬件上,它是用插头连接.一边是公头(plug),一边是母头(receptacle).例如,PC上的插座就是母头,USB设备使用公头与PC连接. 目前USB硬件接口分三种,普通PC上使用的叫Type:原来诺基亚功能机时代的接口为Mini USB:目前Android手机使用的Micro USB. Host USB是由Host端控制整个总线的数据传输的.单个USB总线上,只能有一个Host. OTG On The

【转】Android实战技巧之四十九:Usb通信之USB Host

零 USB背景知识 USB是一种数据通信方式,也是一种数据总线,而且是最复杂的总线之一. 硬件上,它是用插头连接.一边是公头(plug),一边是母头(receptacle).例如,PC上的插座就是母头,USB设备使用公头与PC连接. 目前USB硬件接口分三种,普通PC上使用的叫Type:原来诺基亚功能机时代的接口为Mini USB:目前Android手机使用的Micro USB. Host USB是由Host端控制整个总线的数据传输的.单个USB总线上,只能有一个Host. OTG On The

Android实战技巧之十九:android studio导出jar包(Module)并获得手机信息

AS中并没有独立的Module 工程,但是可以在普通的Project中加入Module.所谓的Module就是我们通常所指的模块化的一个单元,并常常以jar包的形式存在.下面以一个获取手机信息的例子演示AS中的模块化. 一.项目中新建Module File->New Module,详细见下图. 二.新建Java类 新建一个PhoneInfo类,内容如下: package com.linc.mylibrary; import android.content.Context; import andr

Android实战技巧之十二:Android Studio导入第三方类库、jar包和so库

第三方类库源码 将一网友的XMPP代码从ADT转到AS时,发现其使用了第三方类库,源码放在了lib下,直接在AS中Import project,第三方类库并没有自动导入进来,看来需要自己动手了. 项目的目录结构如下: XMPP$ ls app build.gradle gradlew import-summary.txt XMPP.iml build gradle gradlew.bat local.properties settings.gradle 1 2 3 1 2 3 将第三方源码qqE

Android实战技巧之三十二:Android Studio中的源代码管理

Android Studio最近经过了两次升级到了Android Studio 1.2.1.1, 用起来是越来越顺手了.AS中加入了主流的源码管理工具,让开发者不用离开AS就可以提交和管理代码. 下面就演示一下在AS中使用git管理代码. 选择要提交的代码 右键->commit 编写commit message 可以选择commit and push一起完成提交的动作 确认后push 查看提交历史和对比文件 总结: 玩git的都知道在命令行下有些版本历史信息的显示是不方便的,我们需要借助gitk

Android实战技巧之十八:adb取出安装在手机中的apk

场景: 朋友看见你Android手机中的游戏或应用很好玩,也想装一个此程序,但限于网络条件不能从网上下载.那么最简单的办法就是直接从你手机中将此apk扣出来给他安装上. pm命令 第一步,找到程序的包名 借助adb shell pm命令,将安装的所有应用包名列出来: $ adb shell pm list packages package:android package:cn.wps.moffice package:com.android.backupconfirm package:com.an