一.有关混淆:

什么是代码混淆

Java是一种跨平台的、解释型语言,Java源代码编译成中间“字节码”存储于class文件中。由于跨平台的需要,Java字节码中包含了很多源代码信息,如变量名、方法名,并且通过这些名称来访问变量和方法,这些符号带有许多语义信息,很容易被反编译成Java源代码。为了防止这种现象,我们可以使用Java混淆器对Java字节码进行混淆。
混淆就是对发布出去的程序进行重新组织和处理,使得处理后的代码与处理前代码完成相同的功能,而混淆后的代码很难被反编译,即使反编译成功也很难得出程序的真正语义。被混淆过的程序代码,仍然遵照原来的档案格式和指令集,执行结果也与混淆前一样,只是混淆器将代码中的所有变量、函数、类的名称变为简短的英文字母代号,在缺乏相应的函数名和程序注释的情况下,即使被反编译,也将难以阅读。同时混淆是不可逆的,在混淆的过程中一些不影响正常运行的信息将永久丢失,这些信息的丢失使程序变得更加难以理解。
混淆器的作用不仅仅是保护代码,它也有精简编译后程序大小的作用。由于以上介绍的缩短变量和函数名以及丢失部分信息的原因,编译后jar文件体积大约能减少25%,这对当前费用较贵的无线网络传输是有一定意义的。

二.在Android Studio中混淆做以下总结:

首先,需要在app/proguard-rules.pro文件中,添加混淆文件;

然后,在build.gradle中去开启混淆:

buildTypes {  debug {  //启用代码混淆  minifyEnabled true  //混淆规则配置文件  proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'  //  signingConfig signingConfigs.debug  }  release {  //是否优化zip  zipAlignEnabled true  // 移除无用的resource文件  shrinkResources true  //启用代码混淆  minifyEnabled true  //混淆规则配置文件  proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'  //  signingConfig signingConfigs.release  }  }

三.混淆模版:

-optimizationpasses 5          # 指定代码的压缩级别
-dontusemixedcaseclassnames   # 是否使用大小写混合
-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    # 保持哪些类不被混淆# 保留support下的所有类及其内部类
-keep class android.support.** {*;}
# 保留R下面的资源
-keep class **.R$* {*;}-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 *;
}
-dontwarn android.net.**  #忽略某个包的警告
-keep class android.net.SSLCertificateSocketFactory{*;}
-keepattributes *Annotation*-keep class xx   #保持自己定义的类不被混淆(如json,model,webview等等)#第三方依赖库不被混淆(部分)
(对于引用第三方库的情况,可以采用下面方式避免打包出错:-dontwarn com.xx.yy.**    -keep class com.xx.yy.** { *;}
《参数来保持第三方库中的类而不乱,-dontwarn和-keep 结合使用,意思是保持com.xx.yy.**这个包里面的所有类和所有方法而不混淆,接着还叫ProGuard不要警告找不到com.xx.yy.**这个包里面的类的相关引用。》)#Gson
#如果有用到Gson解析包的,直接添加下面这几行就能成功混淆,不然会报错。
-keepattributes Signature
# Gson specific classes
-keep class sun.misc.Unsafe { *; }
# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.** { *; }
-keep class com.google.gson.stream.** { *; }#高德定位
-dontwarn com.amap.api.**
-keep class com.amap.api.** {*;}#Fresco
-dontwarn com.facebook.**
-keep class com.facebook.** {*;}#科大讯飞
-dontwarn com.iflytek.**
-keep class com.iflytek.** {*;}

四.在混淆过程中出现的问题:

混淆release打包后,运行出现crach,并报错:

java.lang.SecurityException: Permission Denial: get/set setting for user asks to run as user -2 but is calling from user 0; this requires android.permission.INTERACT_ACROSS_USERS_FULLat com.android.server.am.ActivityManagerService.handleIncomingUser(ActivityManagerService.java:13175)at android.app.ActivityManager.handleIncomingUser(ActivityManager.java:2044)at com.android.providers.settings.SettingsProvider.callFromPackage(SettingsProvider.java:615)at android.content.ContentProvider$Transport.call(ContentProvider.java:279)at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:273)at android.os.Binder.execTransact(Binder.java:388)at dalvik.system.NativeStart.run(Native Method)

百度这个问题许久都没有得出解决办法,后来在同学的帮助下给出思路,先在debug模式下混淆运行,看看有问题否,能不能成功。

结果按此方法,在运行下发现问题,去除错误的混淆,解决掉问题,最终混淆release打包成功。

注意:混淆出错80%是因为你混淆了不该混淆的类!!

在Android Studio中的混淆debug与release相关推荐

  1. android 混淆debug版本,在Android Studio中的混淆debug與release

    一.有關混淆: 什么是代碼混淆 Java是一種跨平台的.解釋型語言,Java源代碼編譯成中間"字節碼"存儲於class文件中.由於跨平台的需要,Java字節碼中包含了很多源代碼信息 ...

  2. Android studio中如何利用Debug模式来调试程序

    众所周知,程序猿肯定会遇到的问题就是Bug,即在开发过程中令程序无法运行,或达不到正确需求的程序漏洞或缺陷.    但是Studio是智能的,我们可以利用Debug模式来调试程序,以解决问题.     ...

  3. android studio debug设置,在Android Studio中使用Flutter进行调试时如何“设置值...”

    问题 使用"New Flutter Project"创建Flutter App时,以下图像和代码是默认设置 . import 'package:flutter/material.d ...

  4. android studio 混淆jar,android studio如何生成混淆代码的jar

    释放双眼,带上耳机,听听看~! 今天,简单讲讲android里如何在生成jar包时,同时对jar包的代码进行混淆,避免别人看到核心代码. 之前,我对领导说我打包生成的SDK,别人使用android s ...

  5. android studio如何生成混淆代码的jar

    今天,简单讲讲android里如何在生成jar包时,同时对jar包的代码进行混淆,避免别人看到核心代码. 之前,我对领导说我打包生成的SDK,别人使用android studio导入后可以看所有的源码 ...

  6. Android Studio 中的 gradle 介绍及build.gradle配置文件详解

    不同于 Eclispse,Android Studio 是采用 Gradle 来构建项目的,Gradle 是一个非常先进强大的项目构建工具,它使用了一种基于 Groovy 领域的特定语言(DSL)来声 ...

  7. android studio字符串转整型,Android Studio 中的FindBugs插件使用,轻松帮你发现Bug (转)...

    在日常开发过程中难免会因为一时疏忽而留下一些Bug,这些Bug就是埋在程序里的定时炸弹,如果不能及时铲除就会导致程序的不稳定,异常或闪退的现象,从而导致用户的体验的下降.那么怎么才能找出这些埋在程序里 ...

  8. Android如何使用so文件和Android studio中导入so

    Android中使用so文件: 做一个PDF阅读的功能,找到一个开源的库,mupdf.下载的是网上编译好的so库,导入到自己项目中的时候一直报错Java.lang.UnsatisfiedLinkErr ...

  9. Android Studio 中的FindBugs插件使用,轻松帮你发现Bug (转)

    在日常开发过程中难免会因为一时疏忽而留下一些Bug,这些Bug就是埋在程序里的定时炸弹,如果不能及时铲除就会导致程序的不稳定,异常或闪退的现象,从而导致用户的体验的下降.那么怎么才能找出这些埋在程序里 ...

最新文章

  1. stick footers布局
  2. electron android编译,Tiny4412_Android编译步骤
  3. 策略模式应用场景和uml_策略模式
  4. jsmin 使用方法
  5. 智能家居语音控制系统项目毕业答辩
  6. UPX3.95程序压缩命令及使用方法
  7. 推荐我看过的几本好书给大家
  8. 微信公众号--生成带参数的二维码 {“errcode“:48001,“errmsg“:“api unauthorized rid: 60520af9-71ff2283-63d36e0d“}
  9. 全球诺贝尔奖得主最多的30所大学排名
  10. postgres关键字、常量和数据类型
  11. 智能网联车载终端渗透率提升之道
  12. web前端面试中常问的问题
  13. 前端剑法第二式————淬焰
  14. APP开发为什么选择云服务器?
  15. 【ubuntu】解决 Certificate verification failed: The certificate is NOT trusted
  16. 【论文排版】参考文献的格式设置
  17. (两百五十六)学习perfetto(一)
  18. 激光抗大气湍流传输研究取得进展
  19. 架构--系统的可扩展性
  20. Manjaro系统更新,wifi用不了,解决方法

热门文章

  1. 杂志风城市夜景PPT模板
  2. 原生JavaScript实现连缀调用
  3. 动态规划的最优原理与无后效性解析
  4. 静态页面和动态页面中的静态和动态到底指的是什么
  5. 大数据繁荣生态圈组件之实时大数据Druid小传(三)Druid入门实操
  6. HTML5的绘图步骤——示例绘制火柴人
  7. 物料分类帐环境下:物料下一期间标准价的维护及批准发布时点
  8. 怎么配置环境变量?(保姆级教程)
  9. 微服务入门到入土(07)-分布式搜索ElasticSearch
  10. 华东理工大学pk华东师范大学计算机专业,华东理工大学朱为宏教授和华东师范大学杨海波教授合作在光控手性金属配位自组装体系的研究中取得突破性进展...