安卓代码混淆

Proguard是安卓提供的方便开发者对代码和apk进行保护和精简的工具,可在SDK/tools文件夹下找到。linux

 

proguard的做用 :android

1,代码混淆apache

2,精简代码,删掉没有用到的代码,减少apk的体积。json

 

使用场景:服务器

1,对sighed APK进行代码混淆和精简,从而使得发布的代码能够防止被别人反编译解析。(注意,直接build生成的APK是不进行混淆的,必须是signed的apk才会混淆)app

2,对jar包进行混淆,方便将本身的代码(jar包)给别人使用并保证关键代码的不可见性。ide

 

下面分别针对以上两种状况进行说明:工具

混淆APK:gradle

所谓混淆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日志,定位到出错的类,将该类混淆去掉。

相关文章
相关标签/搜索