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 中配 ...
随机推荐
- ajax的分页查询(不刷新页面)
既然是分页查询,那么就要有张数据很多的表,可以让它进行分页显示,用普通的方法进行分页查询必然是要刷新页面的,这里要实现不刷新页面进行分页显示数据,就要用到ajax方式.进行编写代码 (1)先写个显示数 ...
- java基础知识拾遗(四)
1.Runnable对象 启动线程:(new Thread(new MyRunnable()).start() 2.jsp中<%@ page language="java" ...
- CoreCLR文档翻译 - GC的设计
此文档来源于CoreCLR的BOTR(The Book of the Runtime), 点击打开原文 一切著作权归微软公司所有 GC的设计 作者: Maoni Stephens (@maoni0) ...
- 百度地图API的自动定位路线查询
功能如下:打开时自动定位到当前位置(浏览器可能会屏蔽自动定位功能,建议手机查看,或直接打开地址:http://1.jingcode.applinzi.com/test2.html),输入目的地点击搜索 ...
- vim 模式基础操作
作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 前言 虽然Emacs已经可以完成大部分的编辑操作,但有时候为了方便也会用到vim.所以记录了 ...
- linux一句话问答(网络无关篇+网络相关篇+程序开发篇+经典图书)
一句话问答(网络无关篇+网络相关篇+程序开发篇+经典图书) --------------------------目录-网络无关篇-目录-------------------------- 0001 修 ...
- 一些常用的操作MySQL数据库的sql语句
创建数据库:create database 数据库名; 删除数据库:drop datebase 数据库名; 查看数据库:show databases;(所有数据库) 使用数据库:use 数据库名;(之 ...
- Gentoo/Arch常用软件配置
## Desktop Environment ### GNOME ### KDE ### LXDE ### Xfce ## Window Managers ### dwm x11-wm/dwm ### ...
- OBIEE接受外部参数
样例: http://192.168.0.99/analytics/saw.dll?Go&Path=/shared/goxiangyibiaopan/SBDW_GSYDL_ZZT&Ac ...
- VM虚拟机的配置文件(.vmx)损坏修复
来源://http://blog.csdn.net/houffee/article/details/18398603 VM虚拟机中使用.vmx文件保存虚拟机的所有软硬件配置,如果意外损坏的话将会出现不 ...