Android Studio环境下代码混淆+签名打包
Android Studio环境下代码混淆+签名打包
注:本文使用的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修改对应内容如下图:
在新建Android Studio项目时默认是会关闭代码混淆开关的,所以我们需要在build.gradle文件中,将minifyEnabled 开关设为true,如上图所示;此时混淆代码的所有准备工作都已完成,在签名打包时才会对代码进行混淆;
二、签名打包:
按照以下步骤进行签名打包:
1、在build下选择签名APK
2、选择新建keystore或者使用已有的keystore:
首次进行签名打包会出现,目前仅仅是随意设置了一个密码,具体还不清楚有什么作用;(如有哪位大神知晓,烦请告知,在此提前谢过~)
选择签名打包APK的输出位置
到此为止代码混淆+签名打包已全部完成,想要验证自己的apk是否被混淆就需要自己去进行反编译,然后来进行验证了~
Android Studio环境下代码混淆+签名打包的更多相关文章
- Android Studio(十一):代码混淆及打包apk
Android Studio相关博客: Android Studio(一):介绍.安装.配置 Android Studio(二):快捷键设置.插件安装 Android Studio(三):设置Andr ...
- Android Studio环境下搭建ReactNative
1.安装Android Studio首先肯定是 安装Android Studio(包含SDK)(国内推荐)ps:这里有一点要注意,需要为SDK配置环境变量,名称必须为ANDROID_HOME 2.安装 ...
- 在Android studio环境下使用EventBus
EventBus是一个订阅/发布消息总线,实现在应用程序里面,组件之间,线程之间的通信.因为event是任意的类型,所以这个使用起来非常方便. eventbus中的角色: event:当然就是事件啦 ...
- 浅谈Android保护技术__代码混淆
浅谈Android保护技术__代码混淆 代码混淆 代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为.将代码中的各种元 ...
- Android Studio如何配置CURL指令一键打包apk上传至蒲公英
Android Studio如何配置CURL指令一键打包apk上传至蒲公英 第一步:在所需要打包的模块build.gradle文件中加入如下代码: android{ buildTypes { //配置 ...
- [转]Android Studio系列教程六--Gradle多渠道打包
转自:http://www.stormzhang.com/devtools/2015/01/15/android-studio-tutorial6/ Android Studio系列教程六--Grad ...
- Android Studio系列教程六--Gradle多渠道打包
Android Studio系列教程六--Gradle多渠道打包 2015 年 01 月 15 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://stormzh ...
- Android Studio快捷键之代码提示
相信很多人在用Eclipse的时候,很习惯的都会把Content Assist设置成.abcd...z,这样每次敲代码的时候都会有自动提示,写起代码来很方便.具体设置如图: 同时,Eclipse中也有 ...
- 【Mac + Android】之Android Studio 环境搭建,AVD模拟器运行(包括:命令行运行AVD,并且Genymotion模拟器插件配置运行)
目录: 前提.Mac环境下手动配置Android SDK 一. Android Studio下载及配置 二.AVD模拟器配置运行 扩展:命令行运行AVD模拟器 三.在Android Studio 中配 ...
随机推荐
- java 逆波兰表达式
最近想把这破机 装成WIN7 想想还是算了 ... 反正用的机会也不多. 不过 发现了一些 想念的东西 从前的作业. 从前的记忆. package org.lmz; import java.util ...
- [置顶] 使用Android OpenGL ES 2.0绘图之五:添加运动
传送门 ☞ 系统架构设计 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229 传送门 ☞ GoF23种设计模式 ☞ 转载请注明 ☞ http://blog.csd ...
- 创建Sdcard
下载好源码之后编译生成了模拟器,这个时候的模拟器是没有SDcard的.这个时候需要创建需要为虚拟机创建SDcard 我们创建mksdcard 256M <src>/out/target/p ...
- C语言之switch
一 switch的语法 switch(表达式){ case 常量表达式1: 代码块1 break; case 常量表达式2: 代码块2 break; case 常量表达式3: 代码块3 break; ...
- python中函数与函数之间的调用,总是晕菜,整理如下,有不对或者补充的请提出来~
1.python函数基础 函数名: fun 函数体:1~3行 返回值:2 调用函数:fun() ,只有见到这个括号(),程序会根据函数名从内存中找到函数体,然后执行它. 2.函数的执行顺序 下面的fu ...
- HTML <dl> 标签
<html><body><h2>一个定义列表:</h2><dl> <dt>计算机</dt> <dd&g ...
- Eclipse/MyEclipse 安裝後應該更改的設置
基本上都通過 Window -> Preferences 進行設置: Java 保存自動格式化: Java:Java -> Editor -> Save Actions,選中 Per ...
- 常见IT面试题
1.爬楼梯问题,有个N阶的楼梯,一个人可以一次爬1阶,也可以爬2阶,求问总计有多少种爬法? F(N)= F(N-1)+F(N-2). N=1时,有1种爬法,N=2时,有2种爬法.该题可以用递归方法求解 ...
- 如何关闭tomcat的localhost_access_log?
Tomcat每处理一个请求就会在{tomcat_home}/logs/下面生成localhost_access_log,日复一日,服务器上面就产生了很多这样的文件,虽然单个文件不大,但是积少成多,一定 ...
- 隐藏android中EditText中的下划线以及修改光标颜色
在android开发中 EditTextText是我们经常用到的,我们使用时会有一些小问题,当我们点击输入文字时,EditText中的光标和下划线会变成粉红色. 解决方法很简单,我们只要在EditTe ...