代码混淆

代码混淆

    <div class="article_manage clearfix">
    <div class="article_r">
        <span class="link_postdate">2017-01-05 15:00</span>
        <span class="link_view" title="阅读次数">39人阅读</span>
        <span class="link_comments" title="评论次数"> <a href="#comments" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_pinglun'])">评论</a>(0)</span>
        <span class="link_collect tracking-ad" data-mod="popu_171"> <a href="javascript:void(0);" onclick="javascript:collectArticle('%e4%bb%a3%e7%a0%81%e6%b7%b7%e6%b7%86','54093291');return false;" title="收藏">收藏</a></span>
         <span class="link_report"> <a href="#report" onclick="javascript:report(54093291,2);return false;" title="举报">举报</a></span>

    </div>
</div>
<div class="embody" style="display:none" id="embody">
    <span class="embody_t">本文章已收录于:</span>
    <div class="embody_c" id="lib" value="{&quot;err&quot;:0,&quot;msg&quot;:&quot;ok&quot;,&quot;data&quot;:[]}"></div>
</div>
<style type="text/css">        
        .embody{
            padding:10px 10px 10px;
            margin:0 -20px;
            border-bottom:solid 1px #ededed;                
        }
        .embody_b{
            margin:0 ;
            padding:10px 0;
        }
        .embody .embody_t,.embody .embody_c{
            display: inline-block;
            margin-right:10px;
        }
        .embody_t{
            font-size: 12px;
            color:#999;
        }
        .embody_c{
            font-size: 12px;
        }
        .embody_c img,.embody_c em{
            display: inline-block;
            vertical-align: middle;               
        }
         .embody_c img{               
            width:30px;
            height:30px;
        }
        .embody_c em{
            margin: 0 20px 0 10px;
            color:#333;
            font-style: normal;
        }
</style>
<script type="text/javascript">
    $(function () {
        try
        {
            var lib = eval("("+$("#lib").attr("value")+")");
            var html = "";
            if (lib.err == 0) {
                $.each(lib.data, function (i) {
                    var obj = lib.data[i];
                    //html += '<img src="' + obj.logo + '"/>' + obj.name + "&nbsp;&nbsp;";
                    html += ' <a href="' + obj.url + '" target="_blank">';
                    html += ' <img src="' + obj.logo + '">';
                    html += ' <em><b>' + obj.name + '</b></em>';
                    html += ' </a>';
                });
                if (html != "") {
                    setTimeout(function () {
                        $("#lib").html(html);                      
                        $("#embody").show();
                    }, 100);
                }
            }      
        } catch (err)
        { }

    });
</script>
<script type="text/javascript" src="http://static.blog.csdn.net/scripts/category.js"></script>  

代码混淆


首先,在你的工程目录下,找到proguard-rules.pro文件,它就是你要进行编写混淆配置的文件:


光编写该文件还不够哦,你还需要在你module的build.gradle文件中引用该混淆文件:



好了,知道在哪配置混淆文件后,下面开始讲讲如何配置混淆:


混淆文件 proguard-rules.pro 参数详解:

  1. -optimizationpasses 5                                                           # 指定代码的压缩级别  
  2. -dontusemixedcaseclassnames                                                     # 是否使用大小写混合  
  3. -dontskipnonpubliclibraryclasses                                                # 是否混淆第三方jar  
  4. -dontpreverify                                                                  # 混淆时是否做预校验  
  5. -verbose                                                                        # 混淆时是否记录日志  
  6. -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*        # 混淆时所采用的算法  
  7.   
  8. -keep public class * extends android.app.Activity                               # 保持哪些类不被混淆  
  9. -keep public class * extends android.app.Application                            # 保持哪些类不被混淆  
  10. -keep public class * extends android.app.Service                                # 保持哪些类不被混淆  
  11. -keep public class * extends android.content.BroadcastReceiver                  # 保持哪些类不被混淆  
  12. -keep public class * extends android.content.ContentProvider                    # 保持哪些类不被混淆  
  13. -keep public class * extends android.app.backup.BackupAgentHelper               # 保持哪些类不被混淆  
  14. -keep public class * extends android.preference.Preference                      # 保持哪些类不被混淆  
  15. -keep public class com.android.vending.licensing.ILicensingService              # 保持哪些类不被混淆  
  16.   
  17. -keepclasseswithmembernames class * {                                           # 保持 native 方法不被混淆  
  18.     native <methods>;  
  19. }  
  20.   
  21. -keepclasseswithmembers class * {                                               # 保持自定义控件类不被混淆  
  22.     public <init>(android.content.Context, android.util.AttributeSet);  
  23. }  
  24.   
  25. -keepclasseswithmembers class * {  
  26.     public <init>(android.content.Context, android.util.AttributeSet, int);     # 保持自定义控件类不被混淆  
  27. }  
  28.   
  29. -keepclassmembers class * extends android.app.Activity {                        # 保持自定义控件类不被混淆  
  30.    public void *(android.view.View);  
  31. }  
  32.   
  33. -keepclassmembers enum * {                                                      # 保持枚举 enum 类不被混淆  
  34.     public static **[] values();  
  35.     public static ** valueOf(java.lang.String);  
  36. }  
  37.   
  38. -keep class * implements android.os.Parcelable {                                # 保持 Parcelable 不被混淆  
  39.   public static final android.os.Parcelable$Creator *;  
  40. }  
  41.   
  42. -keep class MyClass;                                                            # 保持自己定义的类不被混淆  
-optimizationpasses 5                                                           # 指定代码的压缩级别
-dontusemixedcaseclassnames                                                     # 是否使用大小写混合
-dontskipnonpubliclibraryclasses                                                # 是否混淆第三方jar
-dontpreverify                                                                  # 混淆时是否做预校验
-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.app.backup.BackupAgentHelper               # 保持哪些类不被混淆
-keep public class * extends android.preference.Preference                      # 保持哪些类不被混淆
-keep public class com.android.vending.licensing.ILicensingService              # 保持哪些类不被混淆

-keepclasseswithmembernames class * {                                           # 保持 native 方法不被混淆
    native <methods>;
}

-keepclasseswithmembers class * {                                               # 保持自定义控件类不被混淆
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);     # 保持自定义控件类不被混淆
}

-keepclassmembers class * extends android.app.Activity {                        # 保持自定义控件类不被混淆
   public void *(android.view.View);
}

-keepclassmembers enum * {                                                      # 保持枚举 enum 类不被混淆
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {                                # 保持 Parcelable 不被混淆
  public static final android.os.Parcelable$Creator *;
}

-keep class MyClass;                                                            # 保持自己定义的类不被混淆

以上是最基础的配置,几乎每个项目都需要进行这些地方的混淆(或保持不混淆)。

如果你仔细看过上方的注释,就会了解一些基本代码混淆策略了。 

只是,这还远远不够,因为你在项目中,总会不可避免的引用第三方的library库或是jar包,那,如果你不能够正确的混淆第三方的资源,可能会导致你的应用无法使用。(我就因为忘了配置Gson相关的混淆,导致页面一直没有数据显示,蛋疼的一笔)。

贴出我项目中关于第三方的混淆部分:


  1. #如果有引用v4包可以添加下面这行  
  2. -keep class android.support.v4.** { *; }  
  3. -keep public class * extends android.support.v4.**  
  4. -keep public class * extends android.app.Fragment  
  5.   
  6.   
  7. #如果引用了v4或者v7包,可以忽略警告,因为用不到android.support  
  8. -dontwarn android.support.**  
  9.   
  10.   
  11.    
  12. #保持自定义组件不被混淆  
  13. -keep public class * extends android.view.View {  
  14.     public <init>(android.content.Context);  
  15.     public <init>(android.content.Context, android.util.AttributeSet);  
  16.     public <init>(android.content.Context, android.util.AttributeSet, int);  
  17.     public void set*(…);  
  18. }  
  19.   
  20.    
  21. #保持 Serializable 不被混淆  
  22. -keepnames class * implements java.io.Serializable  
  23.    
  24. #保持 Serializable 不被混淆并且enum 类也不被混淆  
  25. -keepclassmembers class * implements java.io.Serializable {  
  26.     static final long serialVersionUID;  
  27.     private static final java.io.ObjectStreamField[] serialPersistentFields;  
  28.     private void writeObject(java.io.ObjectOutputStream);  
  29.     private void readObject(java.io.ObjectInputStream);  
  30.     java.lang.Object writeReplace();  
  31.     java.lang.Object readResolve();  
  32. }  
  33.    
  34. #保持枚举 enum 类不被混淆 如果混淆报错,建议直接使用上面的 -keepclassmembers class * implements java.io.Serializable即可  
  35. -keepclassmembers enum * {  
  36.   public static **[] values();  
  37.  public static ** valueOf(java.lang.String);  
  38. }  
  39.    
  40. -keepclassmembers class * {  
  41.     public void *ButtonClicked(android.view.View);  
  42. }  
  43.    
  44. #不混淆资源类  
  45. #-keepclassmembers class **.R$* {  
  46. #    public static <fields>;  
  47. #}  
  48.   
  49.   
  50. #xUtils(保持注解,及使用注解的Activity不被混淆,不然会影响Activity中你使用注解相关的代码无法使用)   
  51. -keep class * extends java.lang.annotation.Annotation {*;}  
  52. -keep class com.otb.designerassist.activity.** {*;}  
  53.   
  54.   
  55. #自己项目特殊处理代码(这些地方我使用了Gson类库和注解,所以不希望被混淆,以免影响程序)  
  56. -keep class com.otb.designerassist.entity.** {*;}  
  57. -keep class com.otb.designerassist.http.rspdata.** {*;}  
  58. -keep class com.otb.designerassist.service.** {*;}  
  59.   
  60.    
  61. ##混淆保护自己项目的部分代码以及引用的第三方jar包library(想混淆去掉”#”)  
  62. #-libraryjars libs/umeng-analytics-v5.2.4.jar  
  63. #-libraryjars libs/alipaysecsdk.jar  
  64. #-libraryjars libs/alipayutdid.jar  
  65. #-libraryjars libs/weibosdkcore.jar   
  66.   
  67.   
  68. # 以libaray的形式引用的图片加载框架,不想混淆(注意,此处不是jar包形式,想混淆去掉”#”)  
  69. #-keep class com.nostra13.universalimageloader.** { *; }  
  70.   
  71.   
  72. ###——– Gson 相关的混淆配置——–  
  73. -keepattributes Signature  
  74. -keepattributes *Annotation*  
  75. -keep class sun.misc.Unsafe { *; }  
  76.   
  77.   
  78.   
  79.   
  80. ###——– pulltorefresh 相关的混淆配置———  
  81. -dontwarn com.handmark.pulltorefresh.library.**  
  82. -keep class com.handmark.pulltorefresh.library.** { *;}  
  83. -dontwarn com.handmark.pulltorefresh.library.extras.**  
  84. -keep class com.handmark.pulltorefresh.library.extras.** { *;}  
  85. -dontwarn com.handmark.pulltorefresh.library.internal.**  
  86. -keep class com.handmark.pulltorefresh.library.internal.** { *;}  
  87.   
  88.   
  89. ###———  reservoir 相关的混淆配置——-  
  90. -keep class com.anupcowkur.reservoir.** { *;}  
  91.   
  92.   
  93. ###——– ShareSDK 相关的混淆配置———  
  94. -keep class cn.sharesdk.** { *; }  
  95. -keep class com.sina.sso.** { *; }  
  96.   
  97.   
  98. ###————–umeng 相关的混淆配置———–  
  99. -keep class com.umeng.** { *; }  
  100. -keep class com.umeng.analytics.** { *; }  
  101. -keep class com.umeng.common.** { *; }  
  102. -keep class com.umeng.newxp.** { *; }  
  103.   
  104.   
  105. ###———–MPAndroidChart图库相关的混淆配置————  
  106. -keep class com.github.mikephil.charting.** { *; }  
#如果有引用v4包可以添加下面这行
-keep class android.support.v4.** { *; }
-keep public class * extends android.support.v4.**
-keep public class * extends android.app.Fragment






#如果引用了v4或者v7包,可以忽略警告,因为用不到android.support -dontwarn android.support.**   #保持自定义组件不被混淆 -keep public class * extends android.view.View {     public <init>(android.content.Context);     public <init>(android.content.Context, android.util.AttributeSet);     public <init>(android.content.Context, android.util.AttributeSet, int);     public void set*(...); }   #保持 Serializable 不被混淆 -keepnames class * implements java.io.Serializable   #保持 Serializable 不被混淆并且enum 类也不被混淆 -keepclassmembers class * implements java.io.Serializable {     static final long serialVersionUID;     private static final java.io.ObjectStreamField[] serialPersistentFields;     private void writeObject(java.io.ObjectOutputStream);     private void readObject(java.io.ObjectInputStream);     java.lang.Object writeReplace();     java.lang.Object readResolve(); }   #保持枚举 enum 类不被混淆 如果混淆报错,建议直接使用上面的 -keepclassmembers class * implements java.io.Serializable即可 -keepclassmembers enum * {   public static **[] values();  public static ** valueOf(java.lang.String); }   -keepclassmembers class * {     public void *ButtonClicked(android.view.View); }   #不混淆资源类 #-keepclassmembers class **.R$* { #    public static <fields>; #} #xUtils(保持注解,及使用注解的Activity不被混淆,不然会影响Activity中你使用注解相关的代码无法使用)  -keep class * extends java.lang.annotation.Annotation {*;} -keep class com.otb.designerassist.activity.** {*;} #自己项目特殊处理代码(这些地方我使用了Gson类库和注解,所以不希望被混淆,以免影响程序) -keep class com.otb.designerassist.entity.** {*;} -keep class com.otb.designerassist.http.rspdata.** {*;} -keep class com.otb.designerassist.service.** {*;}   ##混淆保护自己项目的部分代码以及引用的第三方jar包library(想混淆去掉"#") #-libraryjars libs/umeng-analytics-v5.2.4.jar #-libraryjars libs/alipaysecsdk.jar #-libraryjars libs/alipayutdid.jar #-libraryjars libs/weibosdkcore.jar  # 以libaray的形式引用的图片加载框架,不想混淆(注意,此处不是jar包形式,想混淆去掉"#") #-keep class com.nostra13.universalimageloader.** { *; } ###-------- Gson 相关的混淆配置-------- -keepattributes Signature -keepattributes *Annotation* -keep class sun.misc.Unsafe { *; } ###-------- pulltorefresh 相关的混淆配置--------- -dontwarn com.handmark.pulltorefresh.library.** -keep class com.handmark.pulltorefresh.library.** { *;} -dontwarn com.handmark.pulltorefresh.library.extras.** -keep class com.handmark.pulltorefresh.library.extras.** { *;} -dontwarn com.handmark.pulltorefresh.library.internal.** -keep class com.handmark.pulltorefresh.library.internal.** { *;} ###---------  reservoir 相关的混淆配置------- -keep class com.anupcowkur.reservoir.** { *;} ###-------- ShareSDK 相关的混淆配置--------- -keep class cn.sharesdk.** { *; } -keep class com.sina.sso.** { *; } ###--------------umeng 相关的混淆配置----------- -keep class com.umeng.** { *; } -keep class com.umeng.analytics.** { *; } -keep class com.umeng.common.** { *; } -keep class com.umeng.newxp.** { *; } ###-----------MPAndroidChart图库相关的混淆配置------------ -keep class com.github.mikephil.charting.** { *; }


以上的配置,即是对一个项目的混淆配置了,相对比较完整,大家可以依葫芦画瓢,写更多的配置,对于一些第三方项目的使用,一般官方会给出如何配置混淆,大家需要小心,别忘了配置。


好啦,如果你已经写好自己的混淆配置文件,不要忘了在build.gradle文件中再次配置下,打开混淆文件:

  1. buildTypes {  
  2.        debug {  
  3.            // 显示Log  
  4.            buildConfigField “boolean”, “LOG_DEBUG”, “true”  
  5.   
  6.   
  7.            versionNameSuffix ”-debug”  
  8.            minifyEnabled false  
  9.            zipAlignEnabled false  
  10.            shrinkResources false  
  11.            signingConfig signingConfigs.assist  
  12.        }  
  13.   
  14.   
  15.        release {  
  16.            // 不显示Log  
  17.            buildConfigField “boolean”, “LOG_DEBUG”, “false”  
  18.   
  19.            //混淆  
  20.            minifyEnabled true  
  21.   
  22.            //Zipalign优化  
  23.            zipAlignEnabled true  
  24.   
  25.   
  26.            // 移除无用的resource文件  
  27.            shrinkResources true  
  28.            //加载默认混淆配置文件  
  29.            proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’  
  30.            //签名  
  31.            signingConfig signingConfigs.<span style=”font-family: Arial, Helvetica, sans-serif;”>assist</span>  
  32.   
  33.        }  
  34.    }  
 buildTypes {
        debug {
            // 显示Log
            buildConfigField "boolean", "LOG_DEBUG", "true"


            versionNameSuffix "-debug"
            minifyEnabled false
            zipAlignEnabled false
            shrinkResources false
            signingConfig signingConfigs.assist
        }


        release {
            // 不显示Log
            buildConfigField "boolean", "LOG_DEBUG", "false"

            //混淆
            minifyEnabled true

            //Zipalign优化
            zipAlignEnabled true


            // 移除无用的resource文件
            shrinkResources true
            //加载默认混淆配置文件
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            //签名
            signingConfig signingConfigs.<span style="font-family: Arial, Helvetica, sans-serif;">assist</span>

        }
    }


release节点下,minifyEnabled设置为true。


document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js?cdnversion=" + Math.ceil(new Date()/3600000)
    <div id="digg" articleid="54093291">
        <dl id="btnDigg" class="digg digg_enable" onclick="btndigga();">

             <dt>顶</dt>
            <dd>2</dd>
        </dl>


        <dl id="btnBury" class="digg digg_enable" onclick="btnburya();">

              <dt>踩</dt>
            <dd>0</dd>               
        </dl>

    </div>
 <div class="tracking-ad" data-mod="popu_222"><a href="javascript:void(0);">&nbsp;</a>   </div>
<div class="tracking-ad" data-mod="popu_223"> <a href="javascript:void(0);">&nbsp;</a></div>
<script type="text/javascript">
            function btndigga() {
                $(".tracking-ad[data-mod='popu_222'] a").click();
            }
            function btnburya() {
                $(".tracking-ad[data-mod='popu_223'] a").click();
            }
        </script>

<div style="clear:both; height:10px;"></div>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值