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

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

时间: 2024-10-06 20:40:34

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

关于Android studio 怎么使用代码混淆的问题!

为什么要代码混淆? 可以参考:http://www.cnblogs.com/wangcan/p/3477840.html 1,android studio 1.3之前的版本! 以前总以为Intellij idea 和android studio 在proguard-project.txt里面设置以后,在编译的时候就直接把代码给混淆了,后面自己反编译才发现,什么都混淆,原来还有个操作没做, (需要在Generate Signed APK (签名)的时候勾选上Run ProGuard 才行.)重点!

Android studio环境下的 NDK(jni)开发

前言 1.什么是NDK? NDK全称是Native Development Kit,NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk.NDK集成了交叉编译器(交叉编译器需要UNIX或LINUX系统环境),并提供了相应的mk文件隔离CPU.平台.ABI等差异,开发人员只需要简单修改mk文件(指出"哪些文件需要编译"."编译特性要求"等),就可以创建出so. 2.为什么使用NDK? 1.代码的保护.由于ap

android studio环境下创建menu问题(标题栏显示问题)

在创建menu时,在虚拟设备上回显示menu(三个点,如图1),但是在安卓真机上可能会出现不会显示的情况. (图1) 原因是因为安卓系统现在都默认隐藏标题栏,所以menu就不会显示出来. 有两种方法可以解决这一问题: 方法一:在onCreate()函数后面添加显示标题栏代码:setContentView(R.layout.xxx_layout); 如果仍未解决问题,查看自己的活动类的继承问题,如果发现类开头是这样:Public class xxx extends activity(){...}.

在Android studio环境下使用EventBus

EventBus是一个订阅/发布消息总线,实现在应用程序里面,组件之间,线程之间的通信.因为event是任意的类型,所以这个使用起来非常方便. eventbus中的角色: event:当然就是事件啦 subscriber:事件的订阅者,先注册,接收特定的对象,并通过onEventXXX()来回收处理事件. Publisher:事件的发布者,通过post发布信息. 处理过程主要分为5步: 1.定义一个事件(event) 2.注册一个订阅者 3.发布一个事件 4.接收处理一个事件 5.注销一个订阅者

在ANDROID STUDIO环境下使用JUNIT框架进行单元测试

dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcomp

在ANDROID STUDIO环境下使用ESPRESSO 测试框架进行UI测试

package com.example.test; import android.support.test.filters.LargeTest;import android.support.test.rule.ActivityTestRule;import android.support.test.runner.AndroidJUnit4; import org.junit.Rule;import org.junit.Test;import org.junit.runner.RunWith; i

android开发——Eclipse环境下代码编辑最常用快捷键集锦(来了就不能空手而归)

Ctrl+D:删除光标所在行 Ctrl+/ :注释选中行 :Ctrl+\:注销选中行 Ctrl+Shift+/:注释选中的java或xml代码块: Ctrl+Shift+\:注销选中的Java或xml代码块.(形式:/*      */ 或 <!--      -->) shift + alt + j或/**+Enter(回车键):添加javadoc头注释,形如/** * * * * * */(个人更习惯用/**+Enter(回车键)) Ctrl+K:向前查找与当前选定内容相同的代码(如查找与

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

浅谈Android保护技术__代码混淆 代码混淆 代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为.将代码中的各种元素,如变量,函数,类的名字改写成无意义的名字.比如改写成单个字母,或是简短的无意义字母组合,甚至改写成"__"这样的符号,使得阅读的人无法根据名字猜测其用途.对于支持反射的语言,代码混淆有可能与反射发生冲突.代码混淆并不能真正阻止反向工程,只能增大其难度.因此,对于对安全性要求很高的场合,仅仅

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

Android Studio如何配置CURL指令一键打包apk上传至蒲公英 第一步:在所需要打包的模块build.gradle文件中加入如下代码: android{ buildTypes { //配置apk名称 android.applicationVariants.all { variant -> variant.outputs.all { outputFileName = getApkName() } } } } android{ } //------------以下代码用于配置一键上传蒲公