zoukankan      html  css  js  c++  java
  • 安卓代码混淆(Android Studio)

    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下找到 oolsproguardin文件夹,打开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:UsersMachenike-PcDesktopfastjson.jar
    -libraryjars C:UsersMachenike-PcDesktoporg.apache.http.legacy.jar
    -libraryjars  E:softneedAndriodAndroidSDKplatformsandroid-21android.jar
     
    需要注意最后一行,因为安卓工程肯定要用安卓SDK,因此要加上对应版本的sdk中的jar包
    其他的写法跟之前的proguard-rules.pro相同。
     
     
    最后总结一下:在混淆过程中,如果工程比较大,一次混淆很可能会出现各种问题,这里就需要有耐心逐个排除。在较大的工程中引用的jar包可能会有数十个,各个jar包在官网或使用说明里可能会有说明如何在混淆中使用。如果没有,最好是将整个jar包都不要混淆,即加上规则: -keep class xx.xxx.xxxx.** {*;} ,该方法可以将jar包里面的所有类和子包里面的类都排除不混淆,就不会出现问题。 此外即使所有的包都不混淆,也有报错的可能,主要有两个原因:
    1.没有按照规则把系统组件,资源类,枚举等排除,比如我在项目中就忘记了将实现Parcelable接口的类排除,结果导致服务器传来的数据无法获取,app运行时没有正常显示数据。
    2.有的jar包中使用了反射技术,此时在调用时就会出现及时jar包没有混淆,但是如果调用的类混淆了,也会产生错误。这种情况下需要通过看log日志,定位到出错的类,将该类混淆去掉。
  • 相关阅读:
    [Go] golang http下返回json数据
    [Go] Golang练习项目-邮箱imap网页版客户端工具
    [Go] 提供http服务出现两次请求以及处理favicon.ico
    [Go] 转换编码处理网页显示乱码
    [Go] go转换gbk为utf8
    [Go] golang x.(type) 用法
    [GO] go语言中结构体的三种初始化方式
    [PHP] create_function() 代码注入问题已经被弃用
    [Git] 彻底删除github上的某个文件以及他的提交历史
    [javascript] vuejs的elementui实现父子iframe通信
  • 原文地址:https://www.cnblogs.com/jymblog/p/6531955.html
Copyright © 2011-2022 走看看