Android代码混淆

 代码混淆
     
     1、这么做有什么意义?

      我们开发的App,在第三方软件的辅助下,往往几分钟就能反编译出来,从来得到我们辛苦几个月的源代码成果。不做任何处理     的代码是极度不安全的,这就需要我们去做一些安全措施;最基础的便是代码混淆。然而代码混淆并不能使程序绝对的安全,但 是     用来防止一些非专业的人足够了。

     2、混淆的作用范围

    我们对代码进行混淆的主要作用是对我们的代码加一层防护,使得外部人员无法得知我们的源码内容。所以,           我们混淆的对象设定在编写的源码即可,至于第三方引入的内容,不用做处理。

     3、混淆处理的命令

     1) 保持不混淆 -keep class 或 -keep public class xx.xx.类名,如
            -keep public class * extends android.app.Activity

      2 )第三方jar包引用 -libraryjars libs/xx.jar,如
            -libraryjars libs/volley.jar

      3 )忽略作用域下的警告 -dontwarn xx.xx.xx.类名,如
            -dontwarn android.webkit.WebView

      4 )忽略所有警告
            -ignorewarnings

      5 )保持类不被混淆,并指明作用域,如
            -keep class com.umai.taok.manager.ClientAPI {
                public *;
            }

      6 )保持类对象域不被混淆,如
             -keepclassmembers class com.umai.taok.manager.ClientAPI {
                public *;
            }

     4、混淆步骤

      1) 对于android原生的类,不必做混淆处理 

            -keep public class * extends android.app.Fragment  
            -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.app.backup.BackupAgentHelper
            -keep public class * extends android.preference.Preference
            -keep public class * extends android.support.v4.**
            -keep public class com.android.vending.licensing.ILicensingService

      2) 对于第三方引用的jar包,需要声明

            -libraryjars libs/xUtils-2.6.14.jar
            -libraryjars libs/volley.jar
            -libraryjars libs/umeng-analytics-v5.5.3.jar
            -libraryjars libs/umeng_social_sdk.jar
            -libraryjars libs/sun.misc.BASE64Decoder.jar
            -libraryjars libs/SocialSDK_WeiXin_1.jar
            -libraryjars libs/SocialSDK_WeiXin_2.jar
            -libraryjars libs/SocialSDK_Sina.jar
            -libraryjars libs/SocialSDK_QQZone_1.jar
            -libraryjars libs/SocialSDK_QQZone_2.jar
            -libraryjars libs/SocialSDK_QQZone_3.jar
            -libraryjars libs/jpush-sdk-release1.8.1.jar
            -libraryjars libs/httpmime-4.1.1.jar
            -libraryjars libs/core-3.0.0.jar
            -libraryjars libs/Android_Location_V1.3.2.jar
            -libraryjars libs/Android_2DMapApi_V2.4.1.jar
            -libraryjars libs/AMap_3DMap_V2.4.1.jar

      3) 第三方的jar包源码,不必做混淆处理

              -keep public class com.umeng.socialize.* {*;}
             -keep class com.facebook.**
             -keep class com.amap.api.mapcore.**{*;} 
             -keep class com.amap.api.maps.**{*;} 
             -keep class com.autonavi.amap.mapcore.*{*;}  
             -keep class cn.jpush.** { *; }

      4)WebView相关的混淆处理 
       
           -keepclassmembers class com.umai.taok.manager.JSBridge$AndroidAPI {
                  public *;
            }
           -keepclassmembers class com.umai.taok.manager.ClientAPI {
                 public *;
            }
            -keep class com.umai.taok.manager.JSBridge$AndroidAPI {
                public *;
              }
           -keep class com.umai.taok.manager.ClientAPI {
                public *;
             } 

           -dontwarn bolts.**    

           -keepattributes *Annotation*  
          -keepattributes *JavascriptInterface*  


说明备注:

1、混淆配置的文件proguard-project.txt和project.properties。在 project.properties中系统已经添加了混淆文件的配置(#为注释符)。
# 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
project.properties中红色标注部分的注释放开即可。在proguard-project.txt中,我们可以进行混淆的添加。

2、不同的框架都提供了不同的混淆添加部分,这部分引用我们可以从开发平台copy到代码中。需要我们去添加的有三部分: (1) 第三方jar包的引用声明  (2)WebVIew的相关配置(说明见_3)(3)根据错误信息进行遗漏配置的补全以及警告隐藏

3、WebView的混淆需要进行配置,特别是webview与Js进行交互时,在混淆后有可能会失去效果。首先,我们需要先对进行Js交互的类进行保持处理,(由于我用JSBridge进行交互,所以需要两个Js接口类,如下

-keepclassmembers 包名.类名 { // 该类为Js调用方法的承载类
   public *; // 公共方法
   *; // 所有方法
}
-keepclassmembers class  包名.类名 {
   public *;
}

如果Js调用方法的承载类为内部类,则需要如下添加

-keepclassmembers 包名.类名1$类名2 { // 类1 = 承载类的外部类,类2 = 承载类
   public *; // 公共方法
   *; // 所有方法
}
-keepclassmembers class  包名.类名1$类名2 {
   public *;
}

在进行上述保持不混淆处理后,还需要添加以下配置

-keepattributes *Annotation*  
-keepattributes *JavascriptInterface* 

4、如果代码中使用了Facebook的Fresco框架,为了保证不混淆,需要添加如下配置

 -keep class com.facebook.** { *; }
 -dontwarn com.facebook.**

5、添加之后打包会出现些许的Bug,详见console. 我们可以根据Bug反馈进行进一步处理
    
      1)如果出现找不到引用的情况,我们需要检查该引用是否被混淆,如果是,则需要添加保持
            -keep class com.aps.** { *; }  
      2) 如果出现不必要的警告的提示,我们需要对这些警告设置忽略提示 
           -dontwarn com.aps.**

上述内容皆非原创,为开发过程中对网络资料进行的总结...
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值