• android程序的代码混淆打包


    混淆前提

    1.首先是你项目起码已经有几个包(指不同路径的),别以为可以在MainActivity中写个Helloworld就能看出效果。。。

    自己用已经完成小demo来试。。。应该也很快的。。。

    2.一定一定要用打包的形式,生成那个apk文件。。。不然dug生成的apk不带有混淆功能(起码我试的时候eclipse死活生成的是没有。不知其他人)。

    切记:以上面两点下面的代码混淆才有用。。。

    下面的都是转载于:http://www.th7.cn/Program/Android/201301/122409.shtml

    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    -keep class com.badlogic.gdx.backends.android.**{ *;} 

    像这样的只是不混淆:这个包下的类(不包括子包里的东西),用到一个第三文的类就要把这个类所在的包,像上面加上
     
    还要注意的是android-support-v4.jar这个包问题,这里加上了对这个jar包的处理
     
    第三方jar的混淆,
     
    -optimizationpasses 5 
    -dontusemixedcaseclassnames  
    -dontskipnonpubliclibraryclasses  
    -dontpreverify  
    -verbose  
    -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 
     
    -keep public class * extends android.app.Activity                          // 继承activity,application,service,broadcastReceiver,contentprovider....不进行混淆
    -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
     
                                                                                                                          // 这里处理第三方的jar包,第三方JAR包处理开始
    -libraryjars /libs/android-support-v4.jar
    -libraryjars /libs/gdx-backend-android.jar
    -libraryjars /libs/gdx.jar
     
                                                                                                                            // 这里不对第三方的jar包的提出WARN     
    -dontwarn com.badlogic.**
    -dontwarn android.support.v4.**
    -dontwarn android.support.v4.view.**
     
                                                                                                                            // 这里对第三方jar包的类不进行混淆
    -keep class com.badlogic.gdx.backends.android.**{ *;} 
    -keep class com.badlogic.gdx.**{ *;}
    -keep class com.badlogic.gdx.graphics.g2d.**{ *;}
    -keep class com.badlogic.gdx.graphics.**{ *;}
    -keep class android.support.v4.view.**{ *;}
     
                                                                                                                                // 这里第三方JAR包处理结束
     
    -keepclasseswithmembernames class * {                                                           // natvie 方法不混淆
        native <methods>;  
    }  
    -keepclasseswithmembers class * {                                                                    // 对于所有类,有这个构造函数不进行混淆,主要是为了在layout中的,自定义的view
        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 {                                   // 这个主要是在layout 中写的onclick方法android:onclick="onClick",不进行混淆
       public void *(android.view.View);  
    }  
    -keepclassmembers enum * {  
        public static **[] values();  
        public static ** valueOf(java.lang.String);  
    }  
    -keep class * implements android.os.Parcelable {  
      public static final android.os.Parcelable$Creator *;  
    }
     ------------------------------------------------------1上面是解析哪些操作----------------------------------------------------------------------------
    如果工程引入了Android-support-v4的jar类库,那么在工程打包混淆时,就会出现报错提示。例如提示你:You may need to specify additional library jars (using '-libraryjars')。
     
    这里先给出解决方案,稍后我们再来解释如何处理类似情况:
     
    在proguard.cfg里的后面,添加如下内容:
     1.-libraryjars /android-support-v4.jar  
     2.-dontwarn android.support.v4.**  
     3.-keep class android.support.v4.** { *; }  
     4.-keep public class * extends android.support.v4.**  
     5.-keep public class * extends android.app.Fragment  
     
    然后你再打包看看,应该可以正常生成apk安装包了。
     
    打包出错:
    情况一:
     "类1 can't find referenced class 类2" 字面上的意思就是类1找不到类2的引用;它会建议你:"You may need to specify additional library jars (using '-libraryjars').";
    需要使用-libraryjars加上项目中使用到的第三方库就OK了。
    例如:-libraryjars /android-support-v4.jar
    注意:这里引用方式是当前工程的根目录(也可以配置其他目录),也就是说,你要把第三方jar放到当前目录下,否则就会警告说找不到jar文件!
     
    情况二:
    例如: can't find superclass or interface android.os.Parcelable$ClassLoaderCreator,碰到这样的情况,可以使用-dontwarn com.xx.yy.**,不对错误提出警告。
    注意:使用这个方式的话,要确保自己没有用到这个库里面的类!否则就会抛ClassNotFoundException!
     
    情况三:
    在工程中确实用到了该类,采用上面方式还是不行。这个时候就要再增加一项:-keep class com.xx.yy.** { *;},让当前类不混淆。
     
    小结:
    对于引用第三方包的情况,可以采用下面方式避免打包出错:
    -libraryjars /aaa.jar
    -dontwarn com.xx.yy.**
    -keep class com.xx.yy.** { *;}
     
    -----------------------------------------------------------------------------------2--------------------------------------------------------------------
     
    proguard.cfg配置
     
    稍微深入想一下混淆后的结果,你就会发现,如果一些提供给外部的类、方法、变量等名字被改变了,那么程序本身的功能就无法正常实现。那么Proguard如何知道哪些东西是可以改名,而哪些是不能改变的呢?
     
    这个是靠proguard.cfg文件来进行配置的。Android工程中默认自动生成的proguard.cfg已经针对Android的一般情况进行了配置,我们打开这个配置文件。内容大概如下:
     1.-optimizationpasses 5  
    2.-dontusemixedcaseclassnames  
    3.-dontskipnonpubliclibraryclasses  
    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 * {  
    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 * {  
    34.    public static **[] values();  
    35.    public static ** valueOf(java.lang.String);  
    36.}  
    37.  
    38.-keep class * implements android.os.Parcelable {  
    39.  public static final android.os.Parcelable$Creator *;  
    40.}  
     
    它主要保留了继承自Activity、Application、Service、BroadcastReceiver、ContentProvider、BackupAgentHelper、Preference和ILicensingService的子类。因为这些子类,都是可能被外部调用的。
     
    另外,它还保留了含有native方法的类、构造函数从xml构造的类(一般为View的子类)、枚举类型中的values和valueOf静态方法、继承Parcelable的跨进程数据类。
     
    在实际的一个工程项目中,可能Google自动生成的配置不能胜任我们的混淆工作。所以,我们往往需要自己编写一些ProGuard配置。这方面的资料在官网的Manual -> Usage里有详细说明,大家可以研究一下
     
     
  • 相关阅读:
    209. Minimum Size Subarray Sum
    208. Implement Trie (Prefix Tree)
    207. Course Schedule
    206. Reverse Linked List
    205. Isomorphic Strings
    204. Count Primes
    203. Remove Linked List Elements
    201. Bitwise AND of Numbers Range
    199. Binary Tree Right Side View
    ArcGIS API for JavaScript 4.2学习笔记[8] 2D与3D视图同步
  • 原文地址:https://www.cnblogs.com/shortboy/p/2936721.html
Copyright © 2020-2023  润新知