Android混淆学习

做Android开发,除了会开发app之外,还得学会对自己APP混淆保护自己的努力成果。Android混淆主要用了谷歌提供的工具proguard,在android sdk中就有了,使用方法如下:

一、基本用法

根据SDK版本不同有2中不同代码混淆方式:在低版本SDK下,项目中同时包含produard.cfg和project.properties文件,则只需在project.properties文件末尾添加proguard.config=proguard.cfg,在将项目Export即可,在高版本SDK下同时包含proguard-project.txt和project.properties文件,这时需要在proguard-project.txt文件中作如下配置,然后在将项目Export即可

# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must be checked in Version Control Systems.
#
# To customize properties used by the Ant build system edit
# "ant.properties", and override values to adapt the script to your
# project structure.
#
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
proguard.config=${sdk.dir}/tools/proguard/proguard-android-optimize.txt:proguard-project.txt


# Project target.

以上是project.properties文件内容,红色为需要添加的内容

二、多个包引用的混淆

混淆语法如何使用不做介绍了,网上很多资料,这里只记录自己本次项目的经验,供自己日后学习用。

1)简单的在工程目录libs下的jar包混淆:


混淆代码为:

-libraryjars libs/httpcore-4.4-beta1.jar
-libraryjars libs/httpmime-4.4-beta1.jar

-keep class org.apache.http.**{*;}
-dontwarn org.apache.http.**

如果libs内还有目录,混淆方法一样的

2)直接依赖library

-libraryjars library路径(这个依赖项路径可以在project.properties中看到,项目中有哪些依赖项都有列出,可直接复制粘贴,也可以使用绝对路径

-keep 包名.**{*;}

-dontwarn 包名.**

如下图是我项目中所有的library

Android混淆学习_第1张图片

引用说明:

本项目

a)直接引用SlideMenuLib(暂且成为直接依赖)(源码),SlideMenuLib依赖于第三方开源项目actionbarsherlock(暂且成为二级依赖)(源码)

b)直接依赖项目ImageLoaderLib(源码)

c)直接依赖项目MultiColumnListView(源码)

d)直接依赖项目OneKeyShare(源码),二级依赖项目ShareSDK(全是libs下的jar包)

e)直接依赖项目LoginWebViewActivity(全是libs下的jar包)(该依赖项在工作空间以外)

直接依赖项目可在上图中显示,其他非直接依赖项在项目目录Android Dependencies下可看到其作为jar包包含在项目中


在project.properties文件末尾可以看到如下图所示:

Android混淆学习_第2张图片

其中,前面4个都是工作空间里的项目,第五个我放在工作空间外,路径表示方式会不一样,详细参考java路径表示法淆代码如下:

直接依赖项需要用如下形式申明下:

-libraryjars ..\\SlidingMenu-master\\library
-libraryjars ..\\..\\AndroidDownloadDemo\\PinterestLikeAdapterView-master
-libraryjars ..\\ImageLoaderLib
-libraryjars ..\\OneKeyShare

-libraryjars ../../The_third_Utils/taobaosdk/signed_sdk/TaeSDK-1.0.1

非直接依赖项和libs中jar包一样,参考下文第2)点

然后在使用

-keep 包名.**{*;}

-dontwarn 包名.**

对这些依赖项做混淆(某些第三方包已经给出混淆规则的可以套用过来)。

ImageLoaderLib就是和本项目在同一个eclipse工作空间下的第三方开源项目library

library中还有其他library请看3)

3)非直接依赖项library

二级依赖项可能全是jar包(其libs中的jar包,没有源码)也可能是源码没有jar包,有可能是前两者都有,两者都有混淆和前两者一样


3.1)全是jar包的话,会在项目目录Android Private Library目录下看到所有jar包,比如2)中的淘宝sdk TaeSDK,这个library里面没有源码,都是jar包,一样的混淆规则,假如不知道路径,可以使用绝对路径表示,如下是这个依赖项中的SDK

-libraryjars E:\The_third_Utils\taobaosdk\signed_sdk\TaeSDK-1.0.1\libs\securityguard-1.0.6.jar

-libraryjars E:\The_third_Utils\taobaosdk\signed_sdk\TaeSDK-1.0.1\libs\MobileSecSdk.jar

-libraryjars E:\The_third_Utils\taobaosdk\signed_sdk\TaeSDK-1.0.1\libs\utdid4all-1.0.4.jar

-libraryjars E:\The_third_Utils\taobaosdk\signed_sdk\TaeSDK-1.0.1\libs\CloudPush-android-sdk-0.9.2.jar

-libraryjars E:\The_third_Utils\taobaosdk\signed_sdk\TaeSDK-1.0.1\libs\alipaysdk.jar
-libraryjars E:\The_third_Utils\taobaosdk\signed_sdk\TaeSDK-1.0.1\libs\taesdk.jar

然后使用

-keep 包名.**{*;}

-dontwarn 包名.**

进行混淆忽略,这里淘宝给出了自己的混淆规则,我就直接套用过来了

3.2)二级jar包是源码,会在项目目录Android Dependencies下看到以“Library名.jar”形式的引用,如图:

Android混淆学习_第3张图片

不许申明,对这个jar包下的包直接使用

-keep 包名.**{*;}

-dontwarn 包名.**

进行忽略混淆即可,如直接依赖项SlideMenuLib的依赖项actionbarsherlock全是源码的

若二级依赖项是源码还有其libs目录下还有jar的话,jar包会在项目目录Android Private Library下看到,同3.1)混淆一样,如:

-libraryjars E:\Workspace_Android\JakeWharton-ActionBarSherlock-5a15d92\actionbarsherlock\libs\android-support-v13.jar

在使用

-keep 包名.**{*;}

-dontwarn 包名.**

对jar包内的包进行忽略混淆


三、总结

写的有点乱,总结一下

1)在项目目录Android Dependencies下的都是依赖项目,不管是直接依赖项还是多级依赖项,都可以在这里看到

对于这些依赖项,只有在project.properties中有申明的,混淆时使用

-libraryjars 路径(可从project.properties复制过来即可)

申明,然后在使用

-keep 包名.**{*;}

-dontwarn 包名.**

对其内的包混淆

而在project.properties中没看到引用的,都属于非直接依赖项了,直接使用

-keep 包名.**{*;}

-dontwarn 包名.**

进行忽略混淆即可。

2)不管Android Dependencies中的依赖项有多少个jar包,都可以在项目目录Android Private Library下看到所有的

使用如下混淆规则即可

-libraryjars 路径(可使用相对路径也可以使用绝对路径,绝对路径获取:右键Android Private Library 中的某个jar包,在弹出选项中选择Copy即可复制其绝对路径)

-keep 包名.**{*;}

-dontwarn 包名.**



-keep 包名.**{*;}

-dontwarn 包名.**

你可能感兴趣的:(Android学习,JAVA学习)