代碼混淆的步驟

在 Android 開發中,代碼混淆(ProGuard/R8)是保護代碼安全和縮減應用體積的關鍵步驟。以下是詳細的混淆流程和優化策略:


一、基礎混淆步驟

1. 啟用混淆

build.gradle 中配置:

android {buildTypes {release {minifyEnabled true   // 啟用代碼壓縮和混淆shrinkResources true // 移除無用資源(需配合minifyEnabled)proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}
}
2. 選擇默認規則文件
  • proguard-android.txt:基本優化(保守)
  • proguard-android-optimize.txt:激進優化(可能影響部分代碼)
3. 自定義混淆規則(proguard-rules.pro)
# 保留實體類(避免JSON解析失敗)
-keep class com.example.model.** { *; }# 保留View綁定類
-keep class * extends androidx.viewbinding.ViewBinding { *; }# 保留注解(某些框架依賴注解)
-keepattributes *Annotation*# 保留JNI方法
-keepclasseswithmembernames class * {native <methods>;
}

二、關鍵配置詳解

1. 保留必要的類/方法
# 保留所有Activity(避免被重命名)
-keep public class * extends android.app.Activity# 保留回調方法(如點擊事件)
-keepclassmembers class * {public void onClick(android.view.View);
}# 保留序列化類
-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);
}
2. 第三方庫規則
# Retrofit
-keepattributes Signature
-keepattributes RuntimeVisibleAnnotations
-keep class retrofit2.** { *; }
-dontwarn retrofit2.**# OkHttp
-keep class okhttp3.** { *; }
-keep interface okhttp3.** { *; }
-dontwarn okhttp3.**# Glide
-keep public class * implements com.bumptech.glide.module.GlideModule
3. 避免過度混淆
# 保留R文件資源ID(避免動態獲取資源失敗)
-keepclassmembers class **.R$* {public static <fields>;
}# 保留自定義View的構造方法
-keep public class * extends android.view.View {public <init>(android.content.Context);public <init>(android.content.Context, android.util.AttributeSet);
}

三、高級優化技巧

1. 代碼壓縮策略
# 移除日志代碼(需配合代碼優化)
-assumenosideeffects class android.util.Log {public static *** d(...);public static *** v(...);
}
2. 資源混淆(配合AndResGuard)
// 在app/build.gradle中添加
apply plugin: 'AndResGuard'
buildAndResGuard {mappingFile = file("resource_mapping.txt")use7zip = truekeepRoot = false
}
3. 多模塊配置

在庫模塊中聲明:

# library/proguard-rules.pro
-consumerproguardfiles 'consumer-rules.pro'

四、驗證與調試

1. 檢查混淆結果
  • 查看 build/outputs/mapping/release/mapping.txt
  • 使用 retrace 工具還原堆棧:
    retrace -verbose mapping.txt stacktrace.txt
    
2. 測試關鍵場景
  • 反射調用的類是否保留
  • JNI方法是否正常工作
  • 動態加載的類是否可訪問
3. 常見錯誤處理
錯誤類型解決方案
ClassNotFoundException檢查是否過度混淆,添加-keep規則
NoSuchMethodError保留相關方法:-keepclassmembers class * { public void methodName(); }
JSON解析失敗保留實體類字段:-keepclassmembers class * { *** get*(); void set*(***); }

五、ProGuard vs R8

特性ProGuardR8(Android默認)
速度快(Google優化版)
規則兼容性完全兼容部分特殊規則需調整
DEX處理需配合D8直接輸出DEX
增量編譯不支持支持

從 Android Studio 3.4 開始,R8 已成為默認混淆工具,但仍兼容ProGuard規則。


六、安全增強建議

  1. 字符串加密:使用第三方工具(如DexGuard)加密敏感字符串
  2. Native代碼保護:關鍵邏輯放到JNI中并加固
  3. 反調試檢測:在Application中植入反調試代碼

通過合理配置混淆規則,可實現:

  • 代碼體積減少 20%~50%
  • 反編譯難度大幅提升
  • 運行時性能提升(移除無用代碼)

建議每次發布前進行全量回歸測試,確保混淆不會影響核心功能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/87574.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/87574.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/87574.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

分布式集合通信--學習筆記

分布式集合通信一 基礎概念 分布式系統模型 節點與進程模型 多機多卡、多機多進程通信模式 同步 、異步 集合通信定義 點對點通信 vs 集合通信 點對點通信 定義 &#xff1a;兩個節點之間的直接數據傳輸&#xff0c;通常基于專用鏈路或網絡路徑通信范圍&#xff1a;僅涉及兩…

工業顯示器五大品牌推薦及分析

在智能制造與工業自動化中&#xff0c;工業顯示器扮演著至關重要的角色&#xff0c;最近好多朋友問我有沒有什么賣工業顯示的廠家推薦。那今天我為大家整理了5個工業顯示器廠家品牌推薦&#xff0c;希望可以幫助您挑選到合適的工業顯示器一、佳維視&#xff08;JAWEST&#xff…

ComfyUI工作流:一鍵換背景體驗不同場景

換背景效果展示 在圖像編輯領域&#xff0c;背景替換是提升作品視覺效果與創意表達的重要手段。魔多 AI 社區推出的 “一鍵換背景” ComfyUI 工作流&#xff0c;憑借先進的 AI 技術與極簡操作流程&#xff0c;為用戶提供了高效、精準的背景替換解決方案。本文將從技術原理、功能…

圖像旋轉:從原理到 OpenCV 實踐

在圖像處理領域&#xff0c;圖像旋轉是一項基礎且重要的操作。它不僅可以改變圖像的方向&#xff0c;還在許多計算機視覺任務中發揮著關鍵作用&#xff0c;比如目標檢測、圖像配準等。本文將深入探討圖像旋轉的原理&#xff0c;并結合 OpenCV 庫提供具體的實現代碼。 一、圖像…

微服務架構下的抉擇:Consul vs. Eureka,服務發現該如何選型?

微服務架構下的抉擇&#xff1a;Consul vs. Eureka&#xff0c;服務發現該如何選型&#xff1f; 引言 想象一下&#xff0c;我們正在構建一個大型電商平臺。在“雙十一”大促期間&#xff0c;流量洪峰涌入&#xff0c;訂單服務、商品服務、用戶服務等都需要彈性伸縮&#xff…

基于Java+SpringBoot的寵物愛心組織管理系統

源碼編號&#xff1a;S572 源碼名稱&#xff1a;基于SpringBoot的寵物愛心組織管理系統 用戶類型&#xff1a;雙角色&#xff0c;用戶、管理員 數據庫表數量&#xff1a;15 張表 主要技術&#xff1a;Java、Vue、ElementUl 、SpringBoot、Maven 運行環境&#xff1a;Windo…

數字樣機:改寫衛星物聯網的研制范式

01. 衛星物聯網&#xff1a;技術邊界的自然延伸 隨著物聯網在城市、工業、農業等領域的廣泛部署&#xff0c;萬物互聯的愿景正在不斷逼近技術的邊界。尤其是在海洋、沙漠、高原、邊遠山區等傳統通信網絡難以覆蓋的區域&#xff0c;人們對無盲點物聯網連接的需求日益增強。這一…

springsecurity---使用流程、加密機制、自定義密碼匹配器、token字符串生成

目錄 權限控制 相關框架 SpringSecurity springsecurity使用流程 1、搭建環境實現默認用戶名和密碼登錄 2、使用數據庫表中定義好的用戶名和密碼訪問實現等值密碼匹配 1&#xff09;sql文件 2)搭建jdbc或者mybatis或者mybatis-plus環境 3&#xff09;配置mybatis-plus環…

在 Ubuntu 22.04 上使用 Minikube 部署 Go 應用到 Kubernetes

文章目錄 環境說明目標步驟與問題解決1. 構建 Go 應用和 Docker 鏡像問題 1&#xff1a;Go 依賴下載卡住問題 2&#xff1a;Docker 鏡像拉取失敗 2. 設置 Minikube 集群安裝 Minikube問題 3&#xff1a;Minikube 啟動失敗問題 4&#xff1a;Minikube 鏡像拉取失敗 3. 部署 Kube…

Android Studio-Git的使用指南

一、git的基本使用流程 git clone 克隆遠程資源到本地目錄&#xff0c;作為工作目錄&#xff1b;然后在本地的克隆目錄上添加或修改文件&#xff1b;如果遠程修改了&#xff0c;需要同步遠程的內容&#xff0c;直接git pull就可以更新本地的文件&#xff1b;本地在修改之后&…

【github】想fork的項目變為私有副本

在 GitHub 上&#xff0c;所有的 fork 都會繼承其上游倉庫&#xff08;upstream&#xff09;的可見性&#xff08;visibility&#xff09;設置&#xff1a; 可見性繼承 如果你 fork 的原倉庫是 public&#xff0c;那么你的 fork 也必須是 public。如果原倉庫是 private&#xf…

微軟發布新一代存儲優化型虛擬機:Azure Laosv4、Lasv4 和 Lsv4 系列

微軟宣布&#xff0c;全新一代存儲優化型虛擬機——Azure Laosv4、Lasv4 和 Lsv4 系列已正式面世。 與前一代虛擬機系列相比&#xff0c;全新的 L 系列虛擬機實現了重大突破。它支持高達 23TB 的本地 NVMe SSD&#xff0c;在 CPU、網絡以及遠程存儲性能方面均有顯著提升。該系…

python調用pybind11導出的pyd,出現UnicodeDecodeError

python調用pybind11導出的pyd&#xff0c;出現UnicodeDecodeError 1. 問題描述 舉個例子&#xff0c;當有以下C代碼以及Pybind11的綁定代碼時&#xff0c;在python訪問包含中文的Name和Value會有UnicodeDecodeError的異常&#xff01; class VxUserProp{public:VxUserProp();…

MySQL別名在GROUP BY中的使用規則

-- 設置變量&#xff1a;SET earliest_date ... 用于定義并賦值一個用戶變量 earliest_date。 -- 用戶定義的變量必須以 符號開頭&#xff0c;例如 earliest_date。 -- 符號是MySQL中用戶變量的標識符&#xff0c;用于區分系統變量和用戶變量。 SET earliest_date (SELECT …

2025.7.4總結

感恩環節:感謝今日工作順利度過&#xff0c;明天終于能美美的睡個懶覺了。感謝這周有個美好的雙休。今日去實驗室參觀設備&#xff0c;感謝我的一個同事解答了我關于硬件設備與所做軟件業務之間的關系&#xff0c;通過控制器控制網元等相關設備&#xff0c;同時&#xff0c;雖然…

Prompt 精通之路(五)- 構建你的“AI 指令系統”:超越簡單提問的 CRISPE 與 APE 框架

&#x1f680; Prompt 精通之路&#xff1a;系列文章導航 第一篇&#xff1a;[本文] AI 時代的新語言&#xff1a;到底什么是 Prompt&#xff1f;為什么它如此重要&#xff1f;第二篇&#xff1a;告別廢話&#xff01;掌握這 4 個黃金法則&#xff0c;讓你的 Prompt 精準有效第…

#NFT藝術品哈希值唯一性與《民法典》“網絡虛擬財產”認定的沖突

首席數據官高鵬律師數字經濟團隊創作&#xff0c;AI輔助 一、當區塊鏈的「絕對唯一」遇上法律的「彈性空間」 每個NFT藝術品背后的哈希值&#xff0c;都像用數學密碼刻在區塊鏈上的指紋——世界上沒有任何兩個完全相同的編碼。這種由0和1構筑的「數字DNA」&#xff0c;被技術信…

【arXiv2025】計算機視覺|即插即用|LBMamba:革新視覺模型效率,性能炸裂

論文地址&#xff1a;https://arxiv.org/pdf/2506.15976 代碼地址&#xff1a;https://github.com/CiaoHe/bi-mamba 關注UP CV縫合怪&#xff0c;分享最計算機視覺新即插即用模塊&#xff0c;并提供配套的論文資料與代碼。 https://space.bilibili.com/473764881 摘要 Mamba…

【狂飆AGI】第7課:AGI-行業大模型(系列1)

目錄 &#xff08;一&#xff09;服裝史的GPT時刻&#xff08;二&#xff09;AI多學科診療系統&#xff08;三&#xff09;醫療大模型&#xff08;四&#xff09;生物醫藥大模型&#xff08;五&#xff09;教育大模型&#xff08;六&#xff09;心理大模型&#xff08;七&#…

(LeetCode 每日一題) 3307. 找出第 K 個字符 II (位運算、數學)

題目&#xff1a;3307. 找出第 K 個字符 II 思路&#xff1a;位運算&#xff0c;時間復雜度0(logk)。 當2^(i-1) <k 且 2^i>k &#xff0c;說明k在K2^i的右半段 &#xff0c;k和其前半段的某個字符有關系 即當k>K時&#xff0c;k是由k-K位置上的字符變化而來&#xf…