android-ProGuard混淆


title: android-ProGuard混淆
categories: Android
tags: [android, unity, ProGuard, 混淆]
date: 2020-03-30 19:05:25
comments: false
mathjax: true
toc: true

android-ProGuard混淆


前篇

  • 官方
    • 縮減、混淆處理和優化您的應用 - https://developer.android.com/studio/build/shrink-code
  • Android混淆(Proguard)詳解 - https://juejin.im/post/5ae7edc7f265da0b776f7a95
  • Android混淆——瞭解這些就夠了 - https://juejin.im/post/5aeae5b6f265da0ba469a265
  • Android 多渠道打包之混淆文件ProGuard技術詳解 - https://blog.csdn.net/javazejian/article/details/50587857

ProGuard 工具是用於壓縮,優化,混淆我們的代碼,主作用是可以移除代碼中的無用類,字段,方法和屬性同時可以混淆(類,字段,方法,屬性的)命名。最終結果可以使我們的 apk 文件體積更加小,也會讓我們的 apk 更加難以被他人逆向工程,這對於那些特別時包含一些安全性功能的apk來說是相當重要的。很抽象,我也這麼覺得,結合其他資料,我們把 ProGuard 技術的功能概括爲以下4項:

  1. 壓縮(shrinks) :檢查並移除代碼中無用的類,字段,方法,屬性。

  2. 優化(optimizes):對字節碼進行優化,移除無用的指令。

  3. 混淆(obfuscates):使用a,b,c,d等簡短而無意義的名稱,對類,字段和方法進行重名,這樣即使代碼被逆向工程,對方也比較難以讀懂。 (就類似 js 裏面的 uglify-js, 壓縮代碼.)

  4. 預檢測(Preveirfy):在java平臺上對處理後的代碼進行再次檢測。

ProGuard 混淆技術是集成到 Android 構建系統,所以我們不需要手動調用它。ProGuard 混淆技術只有當我們構建您的應用程序並準備發佈應用時才需要使用,所以我們在debug模式下沒有必要進行代碼混淆。ProGuard 混淆技術也只是一種可選技術,即使不使用 ProGuard 混淆技術,我們的應用程序也可以進行運行,但是強烈建議在發佈應用程序時使用該技術。

混淆代碼也是防止 app 上傳到 Google Play 後代碼查重.


對代碼進行混淆處理

  • https://developer.android.com/studio/build/shrink-code#obfuscate

混淆處理的目的是通過縮短應用的類、方法和字段的名稱來減小應用的大小

不過,由於混淆處理會對代碼的不同部分進行重命名,因此在執行某些任務(如檢查堆棧軌跡)時需要用到額外的工具。 要了解混淆處理後的堆棧軌跡,請參閱下一個部分

輸出混淆日誌

# 未混淆的類和成員
-printseeds ../../proguard-log/seeds.txt

# 列出從 apk 中刪除的代碼
-printusage ../../proguard-log/unused.txt

# 混淆前後的映射
-printmapping ../../proguard-log/mapping.txt

# R8 在構建項目時應用的所有規則的完整報告
-printconfiguration ../../proguard-log/full-r8-config.txt

解碼經過混淆處理的堆棧軌跡

  • https://developer.android.com/studio/build/shrink-code#decode-stack-trace

R8 對您的代碼進行混淆處理後,理解堆棧軌跡的難度將會極大增加,因爲類和方法的名稱可能已發生變化。 除了重命名之外,R8 還可以更改堆棧軌跡中的行號,以在寫入 DEX 文件時進一步縮減大小。 幸運的是,R8 在每次運行時都會創建一個 mapping.txt 文件,其中列出了經過混淆處理的類、方法和字段名稱與原始名稱的映射關係。此映射文件還包含用於將行號映射回原始源文件行號的信息。R8 會將此文件保存在 /build/outputs/mapping// 目錄中。

注意 :您每次構建項目時都會覆蓋 R8 生成的 mapping.txt 文件,因此您每次發佈新版本時都要注意保存一個該文件的副本。 通過爲每個發佈版本保留一個 mapping.txt 文件的副本,您可以在用戶提交來自舊版應用的經過混淆處理的堆棧軌跡時,調試相關問題。


unity Android 混淆

  1. 打開 混淆

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Bbg2Ulog-1585726911435)(http://yxbl.itengshe.com/20200331164701-1.png)]

  2. 然後生成文件 Assets\Plugins\Android\proguard-user.txt, 在裏面添加 混淆規則 即可.

    需要注意的是跨平臺 (都是 public 方法) 調用方法需要 keep 住, 否則運行時調用 java 會報錯. keep 住 public 方法即可. 如:

    -keep class com.yang.androidaar.MainActivity{
      public <methods>; # 保持該類下所有的共有方法不被混淆
    }
    

    將入口 MainActivity 類 keep 住.

    接入的第三方 sdk 有要求混淆 keep 的規則, 直接丟到裏面即可.

踩坑

在 as 中導出 unity 庫模塊 的 jar 時, 不能在 庫模塊 中開啓混淆. 否則打包時, 主工程有開啓了混淆, 導致二次混淆會報錯

transformClassesAndResourcesWithR8ForRelease FAILED

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章