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

    有些时候我们希望我们自己的apk包不能被别人反编译而获取自己的源代码。这就需要我们通过Android提供的混淆打包技术来完成。

    一、没有引用外部包的情况:

    这种情况下代码混淆的方式相对简单:

    1)只需要复制一份proguard.cfg文件到项目主目录中(不需要做任何改动)

    2)修改project.properties文件,向文件中加上一段代码:proguard.config=proguard.cfg即可

    到此第一种情况的混淆结束。

    二、再我们引用了外部包的情况下,例如:google的gson.jar,微信,人人,地图等外部引用包时,我们就需要对这些包做特殊处理了。

    1)在proguard.cfg文件中引入这些jar文件。例如:

    -libraryjars libs/activation.jar
    -libraryjars libs/additionnal.jar
    -libraryjars libs/alipay.jar
    -libraryjars libs/android-support-v4.jar
    -libraryjars libs/gson-2.2.4.jar
    -libraryjars libs/libammsdk.jar
    -libraryjars libs/mail.jar

    2)指定这些包中的类不被混淆

    -keep class com.google.**{ *; }
    -keep class com.alipay.android.** { *; }
    -keep class com.sun.activation.registries.** { *; }
    -keep class javax.activation.** { *; }
    -keep class com.tencent.mm.** { *; }
    -keep class com.sum.mail.** { *; }
    -keep class javax.mail.** { *; }
    -keep class myjava.awt.datatransfer.** { *; }
    -keep class org.apache.harmony.** { *; }

    3)去除警告

    -dontwarn com.google.**
    -dontwarn javax.activation.**
    -dontwarn com.alipay.android.**
    -dontwarn com.sun.activation.registries.**
    -dontwarn com.tencent.mm.**
    -dontwarn com.sun.mail.**
    -dontwarn javax.mail.**
    -dontwarn myjava.awt.datatransfer.**
    -dontwarn org.apache.harmony.**

    4)修改project.properties文件,向文件中加上一段代码:proguard.config=proguard.cfg

    5)到此为止任务完成,混淆编译后就是你想要的效果。

    特别说明:当你在用到Google提供的包gson.jar时,除了要对该jar包做特殊处理外还需要对你项目中的JavaBean最特殊处理(保证这些JavaBean不被反编译)

    假如你项目中的JavaBean为com.test.Order.java(订单)、com.test.User(用户)等。

    那么在你的proguard.cfg文件中就需要加上如下代码:

    -keep class com.test.** {*;}


    然后再加上下面的这段代码:

    -keepattributes Signature 
    -keep class sun.misc.Unsafe { *; }
    -keep class com.google.gson.examples.android.model.** { *; }

    具体为什么这样做,下面我将给出解释:

    因为客户端代码中的JavaBean(实体类)的字段名称必须与服务端返回json字符串中的key要一致,才能进行解析,而混淆编
    译之后,客户端代码中的JavaBean(实体类)的类名与其字段名称全部变成了a、b、c、d等等字符串,这与服务端返回的json字符串中的key不一致,导致解析失败。所以,解决的办法是:在进行混淆编译进行打包apk的时候,过滤掉存放所有JavaBean(实体类)的包不进行混淆编译。
     
    下面给出网上查到的一段代码:
    在proguard.cfg文件中添加:
    # removes such information by default, so configure it to keep all of it. 
    -keepattributes Signature 
    # Gson specific classes 
    -keep class sun.misc.Unsafe { *; } 
    #-keep class com.google.gson.stream.** { *; } 
    # Application classes that will be serialized/deserialized over Gson 
    -keep class com.google.gson.examples.android.model.** { *; }
    //这句非常重要,主要是滤掉 com.bgb.scan.model包下的所有.class文件不进行混淆编译
    -keep class com.bgb.scan.model.** {*;}
  • 相关阅读:
    导航控制器生产,push,pop,root,index
    DNSserver内置笔记本
    解决“Dynamic Web Module 3.0 requires Java 1.6 or newer.”错误
    ssh配置连接
    在UITouch事件中画圆圈-iOS8 Swift基础教程
    iOS之UITableViewCell左右滑动效果
    iOS UIView非常用方法及属性详解
    IOS用CGContextRef画各种图形(文字、圆、直线、弧线、矩形、扇形、椭圆、三角形、圆角矩形、贝塞尔曲线、图片)
    UIColor,CGColor,CIColor三者的区别和联系
    iOS中正确的截屏姿势
  • 原文地址:https://www.cnblogs.com/tony-yang-flutter/p/3342930.html
Copyright © 2011-2022 走看看