zoukankan      html  css  js  c++  java
  • 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里有详细说明,大家可以研究一下
     
     
  • 相关阅读:
    JavaScript函数柯里化的一些思考
    Javascript Promise 学习笔记
    ArcGIS加载高德、OSM和谷歌等地图
    抓取“矢量”的实时交通流量数据
    uniapp使用swiper组件做tab切换动态获取高度
    elementui中弹出框不能自动换行的解决方案
    前端面试题总结
    关于nodejs中的增删改查
    关于cookie与本地 存储的区别的问题。
    微信小程序实现如丝顺滑可移动悬浮按钮(超简单)
  • 原文地址:https://www.cnblogs.com/shortboy/p/2936721.html
Copyright © 2011-2022 走看看