您的位置:首页 > 移动开发 > Android开发

Android学习系列(8)--App反编译与代码混淆

2016-05-21 14:27 423 查看

混淆

Android Studio:

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

<code class="hljs bash has-numbering"> buildTypes {
release {
minifyEnabled <span class="hljs-literal">true</span>
proguardFiles getDefaultProguardFile(<span class="hljs-string">'proguard-android.txt'</span>), <span class="hljs-string">'proguard-rules.pro'</span>
}
}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li></ul><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li></ul>

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

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

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

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

<code class="hljs  has-numbering">./gradlew assembleRelease</code><ul style="" class="pre-numbering"><li>1</li></ul><ul style="" class="pre-numbering"><li>1</li></ul>

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

Eclipse:

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

<code class="hljs avrasm has-numbering">proguard<span class="hljs-preprocessor">.config</span>=${sdk<span class="hljs-preprocessor">.dir</span>}/tools/proguard/proguard-android<span class="hljs-preprocessor">.txt</span>:proguard-project<span class="hljs-preprocessor">.txt</span></code><ul style="" class="pre-numbering"><li>1</li></ul><ul style="" class="pre-numbering"><li>1</li></ul>

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

混淆语法

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

<code class="hljs php has-numbering">-keep <span class="hljs-class"><span class="hljs-keyword">class</span> * <span class="hljs-keyword">implements</span> <span class="hljs-title">android</span>.<span class="hljs-title">os</span>.<span class="hljs-title">Parcelable</span> {</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> android.os.Parcelable<span class="hljs-variable">$Creator</span> *;
}
</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li></ul><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li></ul>

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

<code class="hljs avrasm has-numbering">-keep class <span class="hljs-keyword">com</span><span class="hljs-preprocessor">.linc</span><span class="hljs-preprocessor">.datatype</span><span class="hljs-preprocessor">.XXInfo</span> {*<span class="hljs-comment">;}</span></code><ul style="" class="pre-numbering"><li>1</li></ul><ul style="" class="pre-numbering"><li>1</li></ul>

微信分享而引入的jar包,我们不需要对其进行混淆,也需要在proguard-android.txt中注明,如下:

<code class="hljs avrasm has-numbering">-keep class <span class="hljs-keyword">com</span><span class="hljs-preprocessor">.tencent</span>.** { *<span class="hljs-comment">; }</span>
-keep class <span class="hljs-keyword">com</span><span class="hljs-preprocessor">.tencent</span><span class="hljs-preprocessor">.mm</span><span class="hljs-preprocessor">.sdk</span><span class="hljs-preprocessor">.openapi</span><span class="hljs-preprocessor">.WXMediaMessage</span> {*<span class="hljs-comment">;}</span>
-keep class <span class="hljs-keyword">com</span><span class="hljs-preprocessor">.tencent</span><span class="hljs-preprocessor">.mm</span><span class="hljs-preprocessor">.sdk</span><span class="hljs-preprocessor">.openapi</span>.** implements <span class="hljs-keyword">com</span><span class="hljs-preprocessor">.tencent</span><span class="hljs-preprocessor">.mm</span><span class="hljs-preprocessor">.sdk</span><span class="hljs-preprocessor">.openapi</span><span class="hljs-preprocessor">.WXMediaMessage</span>$IMediaObject {*<span class="hljs-comment">;}</span></code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul>

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

反编译

主要用到三个工具:

dex2jar:将dex文件转为jar文件

jd-gui:反编译jar文件

AXMLPrinter2.jar:反编译xml文件

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

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

尝试解决如下:

<code class="hljs css has-numbering">$ <span class="hljs-tag">sudo</span> <span class="hljs-tag">apt-get</span> <span class="hljs-tag">install</span> <span class="hljs-tag">libgtk2</span><span class="hljs-class">.0-0</span><span class="hljs-pseudo">:i386</span> <span class="hljs-tag">libnss3</span><span class="hljs-pseudo">:i386</span> <span class="hljs-tag">libcurl3-gnutls</span><span class="hljs-pseudo">:i386</span> <span class="hljs-tag">libidn11</span><span class="hljs-pseudo">:i386</span> <span class="hljs-tag">libpango1</span><span class="hljs-class">.0-0</span><span class="hljs-pseudo">:i386</span> <span class="hljs-tag">libpangox-1</span><span class="hljs-class">.0-0</span><span class="hljs-pseudo">:i386</span> <span class="hljs-tag">libpangoxft-1</span><span class="hljs-class">.0-0</span><span class="hljs-pseudo">:i386</span> <span class="hljs-tag">librtmp0</span><span class="hljs-pseudo">:i386</span> <span class="hljs-tag">libxft2</span><span class="hljs-pseudo">:i386</span>
</code><ul style="" class="pre-numbering"><li>1</li><li>2</li></ul><ul style="" class="pre-numbering"><li>1</li><li>2</li></ul>

又报错:

<code class="hljs vhdl has-numbering">$ /opt/sdk/tools/jd-gui: error <span class="hljs-keyword">while</span> loading <span class="hljs-keyword">shared</span> libraries: libXxf86vm.so<span class="hljs-number">.1</span>: cannot <span class="hljs-keyword">open</span> <span class="hljs-keyword">shared</span> object <span class="hljs-keyword">file</span>: No such <span class="hljs-keyword">file</span> <span class="hljs-keyword">or</span> directory</code><ul style="" class="pre-numbering"><li>1</li></ul><ul style="" class="pre-numbering"><li>1</li></ul>

解决办法如下:

<code class="hljs css has-numbering">$ <span class="hljs-tag">sudo</span> <span class="hljs-tag">apt-get</span> <span class="hljs-tag">install</span> <span class="hljs-tag">libgtk2</span><span class="hljs-class">.0-0</span><span class="hljs-pseudo">:i386</span> <span class="hljs-tag">libxxf86vm1</span><span class="hljs-pseudo">:i386</span> <span class="hljs-tag">libsm6</span><span class="hljs-pseudo">:i386</span> <span class="hljs-tag">lib32stdc</span>++6

</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul>

参考:
http://blog.csdn.net/lincyang/article/details/6333974
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: