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

作者 Mr_冯先生 关注

2016.08.21 01:10 字数 1040 阅读 734评论 5喜欢 34

注:本文使用的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是否被混淆就需要自己去进行反编译,然后来进行验证了~

Android Studio环境下代码混淆+签名打包的更多相关文章

  1. Android Studio(十一):代码混淆及打包apk

    Android Studio相关博客: Android Studio(一):介绍.安装.配置 Android Studio(二):快捷键设置.插件安装 Android Studio(三):设置Andr ...

  2. Android Studio环境下搭建ReactNative

    1.安装Android Studio首先肯定是 安装Android Studio(包含SDK)(国内推荐)ps:这里有一点要注意,需要为SDK配置环境变量,名称必须为ANDROID_HOME 2.安装 ...

  3. 在Android studio环境下使用EventBus

    EventBus是一个订阅/发布消息总线,实现在应用程序里面,组件之间,线程之间的通信.因为event是任意的类型,所以这个使用起来非常方便. eventbus中的角色: event:当然就是事件啦 ...

  4. 浅谈Android保护技术__代码混淆

    浅谈Android保护技术__代码混淆   代码混淆 代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为.将代码中的各种元 ...

  5. Android Studio如何配置CURL指令一键打包apk上传至蒲公英

    Android Studio如何配置CURL指令一键打包apk上传至蒲公英 第一步:在所需要打包的模块build.gradle文件中加入如下代码: android{ buildTypes { //配置 ...

  6. [转]Android Studio系列教程六--Gradle多渠道打包

    转自:http://www.stormzhang.com/devtools/2015/01/15/android-studio-tutorial6/ Android Studio系列教程六--Grad ...

  7. Android Studio系列教程六--Gradle多渠道打包

    Android Studio系列教程六--Gradle多渠道打包 2015 年 01 月 15 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://stormzh ...

  8. Android Studio快捷键之代码提示

    相信很多人在用Eclipse的时候,很习惯的都会把Content Assist设置成.abcd...z,这样每次敲代码的时候都会有自动提示,写起代码来很方便.具体设置如图: 同时,Eclipse中也有 ...

  9. 【Mac + Android】之Android Studio 环境搭建,AVD模拟器运行(包括:命令行运行AVD,并且Genymotion模拟器插件配置运行)

    目录: 前提.Mac环境下手动配置Android SDK 一. Android Studio下载及配置 二.AVD模拟器配置运行 扩展:命令行运行AVD模拟器 三.在Android Studio 中配 ...

随机推荐

  1. java 逆波兰表达式

    最近想把这破机 装成WIN7 想想还是算了 ...  反正用的机会也不多. 不过 发现了一些 想念的东西 从前的作业. 从前的记忆. package org.lmz; import java.util ...

  2. [置顶] 使用Android OpenGL ES 2.0绘图之五:添加运动

    传送门 ☞ 系统架构设计 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229 传送门 ☞ GoF23种设计模式 ☞ 转载请注明 ☞ http://blog.csd ...

  3. 创建Sdcard

    下载好源码之后编译生成了模拟器,这个时候的模拟器是没有SDcard的.这个时候需要创建需要为虚拟机创建SDcard 我们创建mksdcard 256M <src>/out/target/p ...

  4. C语言之switch

    一 switch的语法 switch(表达式){ case 常量表达式1: 代码块1 break; case 常量表达式2: 代码块2 break; case 常量表达式3: 代码块3 break; ...

  5. python中函数与函数之间的调用,总是晕菜,整理如下,有不对或者补充的请提出来~

    1.python函数基础 函数名: fun 函数体:1~3行 返回值:2 调用函数:fun() ,只有见到这个括号(),程序会根据函数名从内存中找到函数体,然后执行它. 2.函数的执行顺序 下面的fu ...

  6. HTML <dl> 标签

    <html><body><h2>一个定义列表:</h2><dl>   <dt>计算机</dt>   <dd&g ...

  7. Eclipse/MyEclipse 安裝後應該更改的設置

    基本上都通過 Window -> Preferences 進行設置: Java 保存自動格式化: Java:Java -> Editor -> Save Actions,選中 Per ...

  8. 常见IT面试题

    1.爬楼梯问题,有个N阶的楼梯,一个人可以一次爬1阶,也可以爬2阶,求问总计有多少种爬法? F(N)= F(N-1)+F(N-2). N=1时,有1种爬法,N=2时,有2种爬法.该题可以用递归方法求解 ...

  9. 如何关闭tomcat的localhost_access_log?

    Tomcat每处理一个请求就会在{tomcat_home}/logs/下面生成localhost_access_log,日复一日,服务器上面就产生了很多这样的文件,虽然单个文件不大,但是积少成多,一定 ...

  10. 隐藏android中EditText中的下划线以及修改光标颜色

    在android开发中 EditTextText是我们经常用到的,我们使用时会有一些小问题,当我们点击输入文字时,EditText中的光标和下划线会变成粉红色. 解决方法很简单,我们只要在EditTe ...