Proguard是安卓提供的方便开发者对代码和apk进行保护和精简的工具,可在SDK/tools文件夹下找到。
 
proguard的作用 :
1,代码混淆
2,精简代码,删掉没有用到的代码,减小apk的体积。
 
使用场景:
1,对sighed APK进行代码混淆和精简,从而使得发布的代码可以防止被别人反编译解析。(注意,直接build生成的APK是不进行混淆的,必须是signed的apk才会混淆)
2,对jar包进行混淆,方便将自己的代码(jar包)给别人使用并保证关键代码的不可见性。
 
下面分别针对以上两种情况进行说明:
混淆APK:
所谓混淆APK,就是让反编译APK后得到的代码是混淆的。在Android Studio中,可以自动在打包APK的时候代码进行混淆。方法很简单,只需要三步:
  • 在app下的build.gradle中配置:
buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
上面红色的单词由false改成true
  • 在proguard-rules.pro中进行配置,即按照proguard的语法规则对自己工程中的代码进行选择性的混淆。这里给出一个典型的配置如下:
 
-optimizationpasses 5                                             #指定代码压缩级别
-dontusemixedcaseclassnames                                 #混淆时不会产生形形色色的类名
-dontskipnonpubliclibraryclasses                            #指定不忽略非公共类库
-dontpreverify                                              #不预校验,如果需要预校验,是-dontoptimize
-ignorewarnings                                             #屏蔽警告
-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.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
-keep class android.support.v7.** { *; }    #过滤android.support.v7  注意这里v4还是v7要看gradle里面compile了那个扩展包
-keep interface android.support.constraint.** { *; }
-keep class com.alibaba.fastjson.** {*;}    #保持第三方包fastjson不被混淆,否则会报错
 
以上代码中,蓝色基本可以固定不变,绿色部分是为了让引入的第三方包不混淆,如果不添加会报错。比如不添加v7支持包则会导致Studio对整个V7包进行混淆 ,然后就发现它会混淆好久。。。至于对自己创建的包里面那些类需要混淆哪些不混淆,读者可以自己百度这方面的语法规则,数不胜数。
  • 利用Studio中的build-signedAPK发布签名APK,完了以后在app下就会生成app-release.apk,这个就是我们得到的混淆代码后的apk。下图就是反编译APK以后得到的 jar包中的代码,已经被混淆。
 
 
混淆JAR包:
 
jar包的混淆方法我之前试过在Studio中进行,结果愣是没搞定,然后我就采用的proguard自带的GUI界面实现了jar包混淆,方法为:
 
在安卓SDK下找到\tools\proguard\bin文件夹,打开proguardgui.bat(linux下为.sh),出现一个界面,这里其实挺简单,首先按照上面说的proguard-rules.pro里面的规则写一个配置文件,后缀是.txt,然后加载,直接跳到最后一步process即可,这里需要注意的是,配置文件里面跟之前不太一样,主要有两点区别:
 
1,因为是对jar包混淆,所以需要写上injar和outjar的名字,比如我写的:
 
-injars android.jar
-outjars 'confuseDemo.jar'
 
其中android.jar是需要混淆的jar包(放到proguardgui.bat同个目录下),后者为混淆后的 jar包,会自动在该目录下生成。
 
2,被混淆的jar包不包含里面引用到的第三方库,需要在配置文件里面声明它用到的第三方jar包,比如我写的:
 
-libraryjars C:\Users\Machenike-Pc\Desktop\fastjson.jar
-libraryjars C:\Users\Machenike-Pc\Desktop\org.apache.http.legacy.jar
-libraryjars  E:\softneed\Andriod\AndroidSDK\platforms\android-21\android.jar
 
需要注意最后一行,因为安卓工程肯定要用安卓SDK,因此要加上对应版本的sdk中的jar包
其他的写法跟之前的proguard-rules.pro相同。
 
 
最后总结一下:在混淆过程中,如果工程比较大,一次混淆很可能会出现各种问题,这里就需要有耐心逐个排除。在较大的工程中引用的jar包可能会有数十个,各个jar包在官网或使用说明里可能会有说明如何在混淆中使用。如果没有,最好是将整个jar包都不要混淆,即加上规则: -keep class xx.xxx.xxxx.** {*;} ,该方法可以将jar包里面的所有类和子包里面的类都排除不混淆,就不会出现问题。 此外即使所有的包都不混淆,也有报错的可能,主要有两个原因:
1.没有按照规则把系统组件,资源类,枚举等排除,比如我在项目中就忘记了将实现Parcelable接口的类排除,结果导致服务器传来的数据无法获取,app运行时没有正常显示数据。
2.有的jar包中使用了反射技术,此时在调用时就会出现及时jar包没有混淆,但是如果调用的类混淆了,也会产生错误。这种情况下需要通过看log日志,定位到出错的类,将该类混淆去掉。

安卓代码混淆(Android Studio)的更多相关文章

  1. [Unity][安卓]Unity和Android Studio 3.0 交互通讯(1)Android Studio 3.0 设置

    [安卓]Android Studio 3.0 JDK安卓环境配置(2017.10) http://blog.csdn.net/bulademian/article/details/78387052 [ ...

  2. 第四章:重构代码[学习Android Studio汉化教程]

    第四章 Refactoring Code The solutions you develop in Android Studio will not always follow a straight p ...

  3. 第一次作业---安卓开发工具Android studio发展演变

    Android studio2013年由谷歌推出,用于安卓端的开发,我所使用的版本为2015年5月推出的1.3.2. 1.安装.配置.作为麻瓜的我,刚刚接触Android studio时在安装方面走了 ...

  4. linux安装安卓开发工具android studio

    http://www.android-studio.org/ http://android-studio.org/index.php/docs/guide 最近要接触android编程,本来想装ecl ...

  5. 安卓自动化测试:Android studio 自带的 Record Espresso Test || [ Appium & (Android studio || Python|| Eclipse ) ]

    1.Android studio 自带的 Record Espresso Test  https://developer.android.com/studio/test/espresso-test-r ...

  6. React Native安卓代码混淆和打包

    一上午就整了个React Native的打包,中间还遇到各种问题,这里还是记录下吧: 文档链接: http://reactnative.cn/docs/0.45/signed-apk-android. ...

  7. [安卓] 21、android studio 疑难杂症

    目录 1 gradle问题 1.1 gradle版本不匹配导致的错误: . 1 gradle问题 1.1 gradle版本不匹配导致的错误: 背景:在导入telink ble ota安卓源码时遇到an ...

  8. 关于SVN下载代码和Android Studio里面导入别人代码build tools不一致问题总结

    项目build tools的sdk我没有 网络问题没法下载. 解决问题 方法 1.下载对应的SDK.需要VPN,或者FQ 2.将bulid.gradle的内容用下面的内容替换 // Top-level ...

  9. 安卓开发:Android Studio自动import

    我只想说,真好用!哈哈,提高效率的好东西. 参考: [https://blog.csdn.net/pjdd123/article/details/80953669] [https://www.cnbl ...

随机推荐

  1. Django 2.0.1 官方文档翻译: 编写你的第一个 Django app,第七部分(Page 12)

    编写你的第一个 Django app,第七部分(Page 12)转载请注明链接地址 本节教程承接第六部分(page 11)的教程.我们继续开发 web-poll应用,并专注于自定义django的自动生 ...

  2. Java并发编程原理与实战二十六:闭锁 CountDownLatch

    关于闭锁 CountDownLatch 之前在网上看到过一篇举例非常形象的例子,但不记得是出自哪里了,所以这里就当自己再重新写一篇吧: 例子如下: 我们每天起早贪黑的上班,父母每天也要上班,有一天定了 ...

  3. [转载]代码编辑器Sublime Text 3 免费使用方法与简体中文汉化包下载

    http://devework.com/sublime-text-3.html Sublime Text这款代码编辑器是Jeff 一直都在使用的,前段时间转用到版本3,因为感觉Sublime Text ...

  4. CSS中的选择器(笔记)

    1.通配符选择器(*):通配符选择器是用来选择所有元素,也可以选择某个元素下的所有元素.所有浏览器都支持通配符选择器. ;;} .dome *{padding: 2px;} 2.元素选择器(Ele): ...

  5. 【清华集训 2017】小Y的地铁 [模拟退火]

    小Y的地铁 Time Limit: 50 Sec  Memory Limit: 256 MB Description Input Output 对于每组输入数据,输出一行一个整数,表示除掉这 n 个换 ...

  6. linux tar 解压出错

    今天用tar -xzvf php-7.2.3.tar.gz 解压php的tar包时报错 [root@VM_72_37_centos ~]# tar -xzvf php-.tar.gz gzip: st ...

  7. PHP简单爬虫 爬取免费代理ip 一万条

    目标站:http://www.xicidaili.com/ 代码: <?php require 'lib/phpQuery.php'; require 'lib/QueryList.php'; ...

  8. ip_local_deliver && ip_local_deliver_finish

    当ip包收上来,查路由,发现是发往本地的数据包时,会调用ip_local_deliver函数: ip_local_deliver中对ip分片进行重组,经过LOCAL_IN钩子点,然后调用ip_loca ...

  9. USB descriptor【转】

    struct usb_device_descriptor { __u8 bLength;//设备描述符的字节数大小,为0x12 __u8 bDescriptorType;//描述符类型编号,为0x01 ...

  10. 我看到的最棒的Twisted入门教程!

    http://www.douban.com/note/232204441/ http://www.cnblogs.com/sevenyuan/archive/2010/11/18/1880681.ht ...