Android Studio相关博客:

Android Studio(一):介绍、安装、配置

Android Studio(二):快捷键设置、插件安装

Android Studio(三):设置Android Studio编码 Android Studio(四):Android Studio集成Genymotion Android Studio(五):修改Android Studio项目包名 Android Studio(六):Android Studio添加注释模板 Android Studio(七):项目从Eclipse到Android Studio迁移 Android Studio(八):Android Studio设置教程 Android Studio(九):引用jar及so文件 Android Studio(十):添加assets目录 Android Studio(十一):代码混淆及打包apk Android Studio(十二):打包多个发布渠道的apk文件

最近终于把项目做完了,天天加班,累成狗了。 而昨日又忽闻慕和网络CEO吴波猝然离世的消息,深感互联网行业在高薪(其实好多人并不高薪哇)的同时,也是高压力高风险的啊,也在此希望广大同行可以珍惜生命,远离代码,啊呸,是远离加班熬夜!

好啦,继续今天的话题,当项目做完之后,作为一个称职的开发者,接下来任务自然是打包测试发布了。

而打包之前,你必须要混淆你的代码,前提是你不希望别人看到你的代码!


如果你不混淆你的代码,会有怎样的后果呢?知道不?

通过反编译你的apk文件,你的源代码和资源文件都将暴漏无疑,就像光着屁股在别人眼瞎乱晃一样,我觉得它们一定不好受。 作为一手造就它的你来说,怎么能让它不好受呢?

嘿,说到这里,我想有些初学的开发者已经会有所好奇了:如何反编译apk文件擦查看源码呢?再此,给大家推荐两篇博客,很精简很易懂《android 代码 混淆- 原来如此简单》和《 Android APK反编译就这么简单 详解》; 相信你看完这两篇博客(能跟着做一遍更佳),一定会觉得蛋疼: 尼玛老子辛辛苦苦搞了几个月的项目,你几分钟就把源码给我搞到了,当我开源的啊!


好啦,知道不去混淆代码会有怎样的影响之后,那我们来看看如何在Android Studio上混淆你的工程代码吧。


代码混淆


首先,在你的工程目录下,找到proguard-rules.pro文件,它就是你要进行编写混淆配置的文件:


光编写该文件还不够哦,你还需要在你module的build.gradle文件中引用该混淆文件:



好了,知道在哪配置混淆文件后,下面开始讲讲如何配置混淆:


混淆文件 proguard-rules.pro 参数详解:

-optimizationpasses 5                                                           # 指定代码的压缩级别-dontusemixedcaseclassnames                                                     # 是否使用大小写混合-dontskipnonpubliclibraryclasses                                                # 是否混淆第三方jar-dontpreverify                                                                  # 混淆时是否做预校验-verbose                                                                        # 混淆时是否记录日志-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*        # 混淆时所采用的算法-keep public class * extends android.app.Activity                               # 保持哪些类不被混淆-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              # 保持哪些类不被混淆-keepclasseswithmembernames class * {                                           # 保持 native 方法不被混淆    native <methods>;}-keepclasseswithmembers class * {                                               # 保持自定义控件类不被混淆    public <init>(android.content.Context, android.util.AttributeSet);}-keepclasseswithmembers class * {    public <init>(android.content.Context, android.util.AttributeSet, int);     # 保持自定义控件类不被混淆}-keepclassmembers class * extends android.app.Activity {                        # 保持自定义控件类不被混淆   public void *(android.view.View);}-keepclassmembers enum * {                                                      # 保持枚举 enum 类不被混淆    public static **[] values();    public static ** valueOf(java.lang.String);}-keep class * implements android.os.Parcelable {                                # 保持 Parcelable 不被混淆  public static final android.os.Parcelable$Creator *;}-keep class MyClass;                                                            # 保持自己定义的类不被混淆

以上是最基础的配置,几乎每个项目都需要进行这些地方的混淆(或保持不混淆)。

如果你仔细看过上方的注释,就会了解一些基本代码混淆策略了。

只是,这还远远不够,因为你在项目中,总会不可避免的引用第三方的library库或是jar包,那,如果你不能够正确的混淆第三方的资源,可能会导致你的应用无法使用。(我就因为忘了配置Gson相关的混淆,导致页面一直没有数据显示,蛋疼的一笔)。

贴出我项目中关于第三方的混淆部分:


#如果有引用v4包可以添加下面这行-keep class android.support.v4.** { *; }-keep public class * extends android.support.v4.**-keep public class * extends android.app.Fragment#如果引用了v4或者v7包,可以忽略警告,因为用不到android.support-dontwarn android.support.**#保持自定义组件不被混淆-keep public class * extends android.view.View {  public <init>(android.content.Context);  public <init>(android.content.Context, android.util.AttributeSet);  public <init>(android.content.Context, android.util.AttributeSet, int);  public void set*(...);}#保持 Serializable 不被混淆-keepnames class * implements java.io.Serializable#保持 Serializable 不被混淆并且enum 类也不被混淆-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();}#保持枚举 enum 类不被混淆 如果混淆报错,建议直接使用上面的 -keepclassmembers class * implements java.io.Serializable即可-keepclassmembers enum * { public static **[] values();public static ** valueOf(java.lang.String);}-keepclassmembers class * {  public void *ButtonClicked(android.view.View);}#不混淆资源类#-keepclassmembers class **.R$* {#  public static <fields>;#}#xUtils(保持注解,及使用注解的Activity不被混淆,不然会影响Activity中你使用注解相关的代码无法使用)-keep class * extends java.lang.annotation.Annotation {*;}-keep class com.otb.designerassist.activity.** {*;}#自己项目特殊处理代码(这些地方我使用了Gson类库和注解,所以不希望被混淆,以免影响程序)-keep class com.otb.designerassist.entity.** {*;}-keep class com.otb.designerassist.http.rspdata.** {*;}-keep class com.otb.designerassist.service.** {*;}##混淆保护自己项目的部分代码以及引用的第三方jar包library(想混淆去掉"#")#-libraryjars libs/umeng-analytics-v5.2.4.jar#-libraryjars libs/alipaysecsdk.jar#-libraryjars libs/alipayutdid.jar#-libraryjars libs/weibosdkcore.jar# 以libaray的形式引用的图片加载框架,不想混淆(注意,此处不是jar包形式,想混淆去掉"#")#-keep class com.nostra13.universalimageloader.** { *; }###--------Gson 相关的混淆配置---------keepattributes Signature-keepattributes *Annotation*-keep class sun.misc.Unsafe { *; }###--------pulltorefresh 相关的混淆配置----------dontwarn com.handmark.pulltorefresh.library.**-keep class com.handmark.pulltorefresh.library.** { *;}-dontwarn com.handmark.pulltorefresh.library.extras.**-keep class com.handmark.pulltorefresh.library.extras.** { *;}-dontwarn com.handmark.pulltorefresh.library.internal.**-keep class com.handmark.pulltorefresh.library.internal.** { *;}###--------- reservoir 相关的混淆配置--------keep class com.anupcowkur.reservoir.** { *;}###--------ShareSDK 相关的混淆配置----------keep class cn.sharesdk.** { *; }-keep class com.sina.sso.** { *; }###--------------umeng 相关的混淆配置------------keep class com.umeng.** { *; }-keep class com.umeng.analytics.** { *; }-keep class com.umeng.common.** { *; }-keep class com.umeng.newxp.** { *; }###-----------MPAndroidChart图库相关的混淆配置-------------keep class com.github.mikephil.charting.** { *; }


以上的配置,即是对一个项目的混淆配置了,相对比较完整,大家可以依葫芦画瓢,写更多的配置,对于一些第三方项目的使用,一般官方会给出如何配置混淆,大家需要小心,别忘了配置。


好啦,如果你已经写好自己的混淆配置文件,不要忘了在build.gradle文件中再次配置下,打开混淆文件:

 buildTypes {        debug {            // 显示Log            buildConfigField "boolean", "LOG_DEBUG", "true"            versionNameSuffix "-debug"            minifyEnabled false            zipAlignEnabled false            shrinkResources false            signingConfig signingConfigs.assist        }        release {            // 不显示Log            buildConfigField "boolean", "LOG_DEBUG", "false"            //混淆            minifyEnabled true            //Zipalign优化            zipAlignEnabled true            // 移除无用的resource文件            shrinkResources true            //加载默认混淆配置文件            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'            //签名            signingConfig signingConfigs.<span style="font-family: Arial, Helvetica, sans-serif;">assist</span>        }    }


release节点下,minifyEnabled设置为true。


导出APK文件


学会了如何混淆你的项目代码之后,接下来,我们看下,如何使用Android Studio导出APK文件吧。

(1)Android Studio菜单Build->Generate Signed APK


(2)弹出签名选择、创建窗口


(3)创建密钥库及密钥,创建后会自动选择刚创建的密钥库和密钥(已拥有密钥库跳过)
点击“Create new...”按钮创建密钥库


Key store path:密钥库文件的地址
Password/Confirm:密钥库的密码
Alias:密钥名称
Password/Confirm:密钥密码
Validity(years):密钥有效时间
First and Last Name:密钥颁发者姓名
Organizational Unit:密钥颁发组织
City or Locality:城市
Country Code(XX):国家


(4)选择已存在密钥库及密钥(在(3)中创建密钥库后跳过此步骤)

点击“Choose existing...”按钮找到密钥库文件
Key store password输入已选择的密钥库文件的密码
点击Key alias后的“...”按钮,选择或者创建一个密钥


(5)点击“Next”按钮,选择保存路径后,点击“Finish”按钮完成



(全章结束)

更多相关文章

  1. [置顶] Android上传文件到Web服务器,PHP接收文件(二)
  2. Android新建项目报错android:icon="@drawable/ic_launcher"
  3. Android(安卓)Studio(七):项目从Eclipse到Android(安卓)Studio迁
  4. Android(安卓)APK瘦身之Android(安卓)Studio Lint (代码审查)
  5. 【Android(安卓)应用开发】 Android(安卓)APK 反编译 混淆 反编
  6. 编译用于Android的FFmpeg&x264
  7. 【Android(安卓)】Prebuilt预编译
  8. RadioButton和CheckBox自定义按钮图片的样式
  9. NPM 和webpack 的基础使用

随机推荐

  1. Android(安卓)网络编程
  2. RotateAniamtion_实现Android简单动画旋
  3. android ListView控件 去上下滑动阴影 选
  4. 【Android开发教程】一、基础概念
  5. [置顶] Android进程间通信AIDL的使用分析
  6. Android并发编程之如何使用ReentrantRead
  7. Android(安卓)imageView 属性知识
  8. 【Android(安卓)应用开发】Android资源文
  9. 转 Android的消息处理机制
  10. Android(安卓)体系结构介绍