zoukankan      html  css  js  c++  java
  • Android混淆打包

    在这之前,看了下proguard官网介绍,并搜了下相关资料。



     ProGuard简单介绍

           ProGuard是一个SourceForge上很知名的开源项目。官网网址是:http://proguard.sourceforge.net/。

           Java的字节码通常是非常easy反编译的。为了非常好的保护Java源码,我们往往会对编译好的class文件进行混淆处理。

    ProGuard的主要作用就是混淆。当然它还能对字节码进行缩减体积、优化等,但那些对于我们来说都算是次要的功能。


           引用ProGuard官方的一段话来介绍就是:

           ProGuard is a free Java class file shrinker, optimizer, obfuscator, and preverifier. It detects and removes unused classes, fields, methods, and attributes. It optimizes bytecode and removes unused instructions. It renames the remaining classes, fields, and methods using short meaningless names. Finally, it preverifies the processed code for Java 6 or for Java Micro Edition.


    Android Eclipse开发环境与ProGuard

           在Android 2.3曾经,混淆Android代码仅仅能手动加入proguard来实现代码混淆,很不方便。而2.3以后,Google已经将这个工具加入到了SDK的工具集里。详细路径:SDK oolsproguard。

    当创建一个新的Androidproject时,在project文件夹的根路径下,会出现一个proguard的配置文件proguard.cfg。也就是说。我们能够通过简单的配置,在我们的elipseproject中直接使用ProGuard混淆Androidproject。 集成的ADT如今创建一个新的Androidproject时,在project文件夹的根路径下、会有一个proguard-project.txt。事实上这个文件跟proguard.cfg是一样的。混淆打包的一些配置写在这个文件中即可了。

           搜了下Proguard混淆打包相关信息,搜来搜去都说的都大同小异,仅仅要懂得了主要的一些用法,哪些混淆,哪些不混淆,最常见的就是过滤掉一些android须要注冊的一些组件不混淆,第三方包也不须要混淆,由于有的第三方包已经混淆过了。大致的依照自己须要混淆的需求,写个基本配置即可了。

    在这里我做了个主要的综合、proguard配置例如以下:

    -optimizationpasses 7
    -dontusemixedcaseclassnames
    -dontskipnonpubliclibraryclasses
    -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 <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);
    }
    
    -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*(...);
    }
    
    -keepclassmembers enum * {
        public static **[] values();
        public static ** valueOf(java.lang.String);
    }
    
    -keep class * implements android.os.Parcelable {
        public static final android.os.Parcelable$Creator *;
    }
    
    -keepnames class * implements java.io.Serializable
    
    -keepclassmembers class * implements java.io.Serializable {
        static final long serialVersionUID;
        private static final java.io.ObjectStreamField[] serialPersistentFields;
        !static !transient <fields>;
        private void writeObject(java.io.ObjectOutputStream);
        private void readObject(java.io.ObjectInputStream);
        java.lang.Object writeReplace();
        java.lang.Object readResolve();
    }
    
    -keepattributes *Annotation*
    -keepattributes Exceptions,InnerClasses,Signature
    -keepattributes SourceFile,LineNumberTable
    
    -keep class **.R$* { *; }
    -libraryjars  libs/android-support-v4.jar
    -dontwarn android.support.v4.**    
    -keep class android.support.v4.** { *; }  
    -keep interface android.support.v4.** { *; }
    -keep public class * extends android.support.v4.** 
    -keep public class * extends android.app.Fragment
    
    
    


           它主要保留了继承自Activity、Application、Service、BroadcastReceiver、ContentProvider、BackupAgentHelper、Preference和ILicensingService的子类。由于这些子类,都是可能被外部调用的。

           另外,它还保留了含有native方法的类、构造函数从xml构造的类(一般为View的子类)、枚举类型中的values和valueOf静态方法、继承Parcelable的跨进程数据类和实现Serializable对象序列化。

           若有其它第三方包,可依依加入不混淆配置即可了。可依据要求,去个性配置proguard混淆即可了。


    最后记住把根文件夹路径下的project.properties文件:

    # This file is automatically generated by Android Tools.
    # Do not modify this file -- YOUR CHANGES WILL BE ERASED!
    #
    # This file must be checked in Version Control Systems.
    #
    # To customize properties used by the Ant build system edit
    # "ant.properties", and override values to adapt the script to your
    # project structure.
    #
    # 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 target.
    target=android-17
    


    proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt

    红色的那句凝视(去掉“#”号)的打开放在最以下。就能够签名混淆打包apk去了。




  • 相关阅读:
    学习python -- 第013天 类与对象
    学习python -- 第013天 bug
    学习python -- 第012天 函数(二)
    学习python -- 第012天 函数(一)
    学习python -- 第011天 字符串
    学习python -- 第010天 列表、元组、字典、集合总结
    排序_快速排序
    链表_逆置
    约瑟夫环-链表
    双栈_队列
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/6808570.html
Copyright © 2011-2022 走看看