zoukankan      html  css  js  c++  java
  • android防反编译技术初体验——混淆

    这几天做项目要做混淆,所以搜集资料学习了下,这次主要记录混淆的步骤,如有需要改正和完善的地方,还麻烦能够指出,大家共同进步o(* ̄▽ ̄*)ブ

    1.项目防反编译技术步骤:

    a) 加密、

    b) 混淆、

    c) 加壳(加固);

    2.加密:对信息进行摘要计算,然后摘要值用私钥进行验签,重要数据使用rsa非对称加密;

    3.混淆Android Studio开发工具自身集成了Java语言的ProGuard技术,对java代码有压缩、优化、混淆、预检的功能,AcFlash项目的Android端使用了ProGuard,以下是使用步骤:

    a) modelbuild.gradle配置文件设置minifyEnabledtrue;

     

    b) 设置混淆默认数据,在proguard-rules.pro配置文件中配置:

    #指定代码的压缩级别:0-7

    -optimizationpasses 5

     

    #混淆时不使用大小写混淆,混淆后的类名为小写

    -dontusemixedcaseclassnames

     

    #不去忽略非公共库的类

    -dontskipnonpubliclibraryclasses

    #不优化输入的类文件

    -dontoptimize

     

    #不做预校验,android不需要

    -dontpreverify

     

    #忽略警告

    -ignorewarning

     

    #混淆后产生映射文件:包含有类名->混淆后类名的映射关系

    -verbose

    #混淆时所采用的算法,谷歌推荐,一般不修改

    -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

     

    c) 设置项目中所有数据都混淆后,接下来该设置项目哪些内容不需要混淆;

    i. 四大组件不被混淆

    -keep public class * extends android.app.Activity
    -keep public class * extends android.app.Service
    -keep public class * extends android.content.BroadcastReceiver
    -keep public class * extends android.content.ContentProvider

     

    ii. 被外部调用的类不被混淆

     -keep public class * extends android.app.Fragment
    -keep public class * extends android.app.Application
    -keep public class * extends android.app.backup.BackupAgentHelper
    -keep public class * extends android.preference.Preference
    -keep public class * extends android.support.v7.app.Fragment
    -keep class android.support.** { *; }
    -keep public class * extends android.support.**
    -keep public class * extends android.view.View

     

    iii. 实体类不能混淆

    -keep public class com.leadpcom.acflash.bean.** {
        public void set*(***);
        public *** get*();
        public *** is*();
    }

     

    iv. 自定义控件类不被混淆

    -keepclasseswithmembers class * {
        public <init>(android.content.Context,android.util.AttributeSet);
    }

    -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*(...);
    }

     

    v. 为了防止在布局中设置onClick事件失效,所以保留在Activity中方法参数是view的方法:

    -keepclassmembers class * extends android.app.Activity {
       public void *(android.view.View);
    }

     

    vi. ParcelableSerializable都是为了进行序列化,前者是android所特有的,比后者更高效可以intent传递数据,也可进程间通信(IPC),保持 ParcelableSerializable 不被混淆

    -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 <fields>;
        !private <methods>;
        private void writeObject(java.io.ObjectOutputStream);
        private void readObject(java.io.ObjectInputStream);
        java.lang.Object writeReplace();
        java.lang.Object readResolve();
    }

     

    vii. 资源类不混淆

    -keepclassmembers class **.R$* {
        public static <fields>;
    }

     

    viii. 记录生成的日志数据,gradle build时在本项目根目录输出

    #apk 包内所有 class 的内部结构
    -dump proguard/class_files.txt
    #未混淆的类和成员
    -printseeds proguard/seeds.txt
    #列出从 apk 中删除的代码
    -printusage proguard/unused.txt
    #混淆前后的映射
    -printmapping proguard/mapping.txt

     

     

    ix. 移除Log类打印各个等级日志的代码,除了这种禁止log打印的方法还有一种是通过BuildConfig.DEBUG的变量来控制

    -assumenosideeffects class android.util.Log {
        public static *** v(...);
        public static *** i(...);
        public static *** d(...);
        public static *** w(...);
        public static *** e(...);
    }

     

    x. 引入第三方json解析包不混淆(一般第三方jar包都已混淆过)

    -keep class com.google.gson.** { *; }
    -keep class com.google.gson.stream.** { *; }

     

    xi. proguard会检查每一引用是否正确,但第三方库里常常会有不会用到的类,没有正确引用,如果不配置,会报错

    -dontwarn android.support.**

     

    xii. 枚举enum不被混淆:暂无

    xiii. native方法不被混淆:暂无

    xiv. Jni不被混淆:暂无

    xv. 对含有反射类的处理:暂无

    xvi. 某些功能所涉及到的类及子类不被混淆,如下拉刷新:暂无

    xvii. ......(根据项目功能代码,可再补充混淆)

    4.加壳:混淆之后,利用乐固(腾讯推出)进行加固,生成最终的apk文件。

     

  • 相关阅读:
    SQL server 日期格式转换style 对应码
    postman的使用方法详解!最全面的教程
    港澳台身份证小结
    使用设置自定义对话框的大小,位置,样式以及设置在安卓桌面上弹出对话框
    android自定义Activity窗口大小(theme运用)
    C#调用RabbitMQ实现消息队列
    C# http请求带请求头部分
    Android如何屏蔽home键和recent键
    针对jquery的优化方法,你知道几条
    试图从目录中执行 CGI、ISAPI 或其他可执行程序
  • 原文地址:https://www.cnblogs.com/Sailsail/p/7610761.html
Copyright © 2011-2022 走看看