一.有關混淆:

什么是代碼混淆

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 ;

}

-keepclasseswithmembers class * { # 保持自定義控件類不被混淆

public (android.content.Context, android.util.AttributeSet);

}

-keepclasseswithmembers class * {# 保持自定義控件類不被混淆

public (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_FULL

at 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 混淆debug版本,在Android Studio中的混淆debug與release相关推荐

  1. 在Android Studio中的混淆debug与release

    一.有关混淆: 什么是代码混淆 Java是一种跨平台的.解释型语言,Java源代码编译成中间"字节码"存储于class文件中.由于跨平台的需要,Java字节码中包含了很多源代码信息 ...

  2. C语言中易混淆的标识符,C语言指针中易混淆的概念

    C语言指针中易混淆的概念 一.数组指针与指针数组的区别 考虑数组的指针的时候我们要同时考虑类型和维数这两个属性.换一句话,就是说一个数组排除在其中存储的数值,那么可以用类型和维数来位置表示他的种类. ...

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

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

  4. android apt最新版本,解决Android studio 2.3升级到Android studio 3.0 后apt报错问题

    解决Android studio 2.3升级到Android studio 3.0 后apt报错问题 发布时间:2020-09-16 19:59:42 来源:脚本之家 阅读:62 作者:哈特中尉 1. ...

  5. android软件多版本共存,Android Studio 多版本共存

    Android Studio 多版本共存 背景 准备 无安装版 背景 假如你现在需要运行一个gradle:2.x的项目,而你目前的AS的版本是3.x,由于2.x项目升级到3.x改动比较大,但你又不想对 ...

  6. android sdk所有版本下载,android sdk全平台版本集成

    这是android sdk 全平台版本集成下载,谷歌经常被墙,有的同学也不知道如何下载平台环境,所以特意把全平台工具环境打包上来,方便大家下载. 软件介绍 android sdk全平台版本集成是一个管 ...

  7. android各大版本变化,Android总结——各个版本重要变动(一)

    Android4.4 KitKat API级别:19 外部存储空间的读取:具有 READ_EXTERNAL_STORAGE 权限才能使用getExternalStoragePublicDirector ...

  8. Android Killer 高版本卡死,Android Killer反编译卡死的一个解决方案

    半吊子安卓逆向水平,也就会用android killer看看反编译的java源码...玩ctf的时候经常android killer莫名卡死,大致如图: 一般看安卓题就为了换换脑子冷静下,几次碰到这个 ...

  9. 获取android基带版本信息,android手机的基带怎么查看?

    1.以魅族手机为例,在手机桌面点击设置选项. 2.进入设置页面后,下滑点击关于手机选项. 3.进入后下滑,找到基带版本,查看该手机的基带数据和版本. 扩展资料: 关于手机传输 1.基带传输 进行基带传 ...

最新文章

  1. vue实现一个星级打分效果_五分钟用vue实现一个五星打分效果
  2. lua 判断为空的逻辑
  3. java泛型通配符和类型参数的范围
  4. POJ 3735 Training little cats​ 题解 《挑战程序设计竞赛》
  5. 重学java基础第七课:什么是计算机
  6. html列表逆序输出,JS实现倒序输出的几种常用方法示例
  7. php socket keepalive,使用keepalive和fastcgi_keep_conn打开Nginx php-fpm时出错
  8. mysql怎么求平均体重_怎样计算平均身高和平均体重
  9. 如何将网络监控摄像头中的网络流 RTSP 转换成 M3U8 流并嵌入微信公众号
  10. centos7安装apache
  11. 陈洁kiki宠粉节狂欢夜观看破千万!四年磨一剑将宠粉做到极致
  12. 你始终欠自己一个努力的模样
  13. MGC Group大公司已布局区块链食品供应链技术领域
  14. 淘宝授权登录对接文档
  15. node.js的卸载与安装
  16. go 拉取仓库依赖报错:fatal: could not read Username for ‘https://code.byted.org‘: terminal prompts disabled
  17. 虚拟机IC617 REHAT导入工艺库操作
  18. AI ProCon圆满落幕,五大技术专场精彩瞬间不容错过
  19. uni-app:实现H5的录音功能,并上传到服务器
  20. 霍炬:再谈百度:KPI、无人机,以及一个必须给父母看的案例

热门文章

  1. Android 解屏代码
  2. word样式和多级列表设置技巧(二)
  3. word文档多级列表设置
  4. 【腾讯TMQ】MBT探索系列 – PRE/POST 模型在网络接口测试MBT的应用和探索
  5. 基于树莓派4b的ubuntu20.04mate配合思岚科技A1激光雷达读取数据,建图、保存和基于arduino的下位机控制
  6. 【科普】人眼到底等于多少像素
  7. UN Comtrade(联合国商品贸易统计数据库)数据爬取Python代码——使用动态IP
  8. nyoj 83-迷宫寻宝(二) (计算几何, 叉积)
  9. 宝塔面板 linux工具箱,宝塔面板教程大全–宝塔linux面板专业版数据同步插件使用教程...
  10. 树莓派ssh远程连接