• Android Studio环境下代码混淆+签名打包


    Android Studio环境下代码混淆+签名打包

    144 
    作者 Mr_冯先生 
    2016.08.21 01:10 字数 1040 阅读 734评论 5

    注:本文使用的Android Studio版本是 2.1.2。

    做公司项目,需要对项目进行代码混淆+签名打包,然后就各种搜集查看资料,算是小有成果吧。周末无事就想着总结一下以后再用可做参考。如有不对的地方烦请各位大神指导……

    一、代码混淆

    android studio进行代码混淆需要在两个地方做配置:1、添加自己的混淆规则到对应Module下的proguard-rules.pro文件;2、修改对应Module下的build.gradle;

    1、添加混淆规则

    已下是我代码中添加的混淆规则(仅供参考)

    #--------------------------1.实体类---------------------------------

    -keepclasscom.package.bean.**{*;}

    #--------------------------2.第三方包-------------------------------

    #Gson
    -keepattributes Signature
    -keepattributes *Annotation*
    -keep class sun.misc.Unsafe { *; }
    -keep class com.google.gson.stream.** { *; }
    -keep class com.google.gson.examples.android.model.** { *; }
    -keep class com.google.gson.* { *;}
    -dontwarncom.google.gson.**

    #umeng
    -dontwarncom.umeng.**
    -keepclasscom.umeng.**{*;}
    -keepclassu.aly.**{*;}
    -keepclasscom.google.**{*;}

    #nineoldandroids
    -dontwarncom.nineoldandroids.*
    -keepclasscom.nineoldandroids.**{*;}

    #weixin
    -dontwarncom.tencent.mm.**
    -keepclasscom.tencent.mm.**{*;}

    #JGPUSH
    -dontwarn cn.jpush.**
    -keep class cn.jpush.** { *; }
    -dontwarn com.google.**
    -keep class com.google.protobuf.** {*;}
    -keep class com.google.gson.** {*;}

    #-------------------------3.与js互相调用的类------------------------

    #-------------------------4.反射相关的类和方法----------------------

    #-------------------------5.基本不用动区域--------------------------

    #指定代码的压缩级别
    -optimizationpasses5

    #不去忽略非公共的库类
    -dontskipnonpubliclibraryclasses
    -dontskipnonpubliclibraryclassmembers

    # 是否使用大小写混合
    -dontusemixedcaseclassnames

    #预校验
    -dontpreverify

    #混淆时是否记录日志
    -verbose

    #忽略警告,避免打包时某些警告出现
    -ignorewarning

    # 混淆时所采用的算法
    -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

    #保护注解
    -keepattributes *Annotation*

    #记录生成的日志数据,gradle build时在本项目根目录输出
    #apk 包内所有 class 的内部结构
    -dump class_files.txt
    #未混淆的类和成员
    -printseeds seeds.txt
    #列出从 apk 中删除的代码
    -printusage unused.txt
    #混淆前后的映射
    -printmapping mapping.txt

    #-----------------------------6.默认保留区-----------------------

    # 保持哪些类不被混淆
    -keep public class * extends android.app.Activity
    -keep public class * extends android.app.Fragment
    -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

    #如果有引用v4、v7包可以添加下面这行
    -keep publicclass*extendsandroid.support.*

    -keepclasseswithmembersclass*{ 
             public(android.content.Context,android.util.AttributeSet); 
             public(android.content.Context,android.util.AttributeSet,int);
    }

    -keepclassmembers class * implements java.io.Serializable {
            static final long serialVersionUID;
            private static final java.io.ObjectStreamField[] serialPersistentFields;
            private void writeObject(java.io.ObjectOutputStream);
            private void readObject(java.io.ObjectInputStream);
            java.lang.Object writeReplace();
            java.lang.Object readResolve();
    }

    # 保持 native 方法不被混淆
    -keepclasseswithmembernamesclass*{
            native;
    }

    # 保持自定义控件类不被混淆
    -keepclasseswithmembersclass*{
           public(android.content.Context,android.util.AttributeSet);
    }
    # 保持自定义控件类不被混淆
    -keepclasseswithmembersclass*{
           public(android.content.Context,android.util.AttributeSet,int);
    }
    # 保持自定义控件类不被混淆
    -keepclassmembersclass*extendsandroid.app.Activity{
           publicvoid*(android.view.View);
    }

    # 保持枚举 enum 类不被混淆
    -keepclassmembersenum*{
           publicstatic**[]values();
           publicstatic**valueOf(java.lang.String);
    }

    # 保持 Parcelable 不被混淆
    -keepclass*implementsandroid.os.Parcelable{
           publicstaticfinalandroid.os.Parcelable$Creator *;
    }

    #---------------------------7.webview-----------------------

    -keepclassmembersclassfqcn.of.javascript.interface.for.webview{
           public*;
    }

    -keepclassmembersclass*extendsandroid.webkit.webViewClient{
           publicvoid*(android.webkit.WebView,java.lang.String,android.graphics.Bitmap);
           publicboolean*(android.webkit.WebView,java.lang.String);
    }

    -keepclassmembersclass*extendsandroid.webkit.webViewClient{
           publicvoid*(android.webkit.webView,jav.lang.String);
    }

    #-----------------------------end-------------------------------

    2、修改gradle文件

    在即将打包的Module下找到对应的build.gradle文件如下图:


    对应gradle

    打开gradle修改对应内容如下图:


    gradle内对应混淆配置文件

    在新建Android Studio项目时默认是会关闭代码混淆开关的,所以我们需要在build.gradle文件中,将minifyEnabled 开关设为true,如上图所示;此时混淆代码的所有准备工作都已完成,在签名打包时才会对代码进行混淆;

    二、签名打包:

    按照以下步骤进行签名打包:

    1、在build下选择签名APK


    选择签名打包

    2、选择新建keystore或者使用已有的keystore:


    新建keystore

    选择已有keystore

    首次进行签名打包会出现,目前仅仅是随意设置了一个密码,具体还不清楚有什么作用;(如有哪位大神知晓,烦请告知,在此提前谢过~)


    Master Password

    选择签名打包APK的输出位置


    选择输出APK位置

    到此为止代码混淆+签名打包已全部完成,想要验证自己的apk是否被混淆就需要自己去进行反编译,然后来进行验证了~

  • 相关阅读:
    DVS6446教程链接
    今晚做的二值化和分割
    Sybase ETL
    QR码的结构
    cannot open file Default/configPkg/linker.cmd 错误
    QR 码的位置检测符
    QR Code
    C6000 OMAP DAVINCI的关系
    Davinci笔记 DSP子系统 VS ARM子系统
    ETL简介
  • 原文地址:https://www.cnblogs.com/changyiqiang/p/6275000.html
Copyright © 2020-2023  润新知