Android開發(fā)ProGuard使用技巧掌握
前言
在構建 Android 應用程序時,我們可能在項目中使用了 ProGuard。在這篇文章中,我們將了解所有功能以及如何在 Android 中有效地使用 ProGuard。
因此,讓我們將其分解為以下幾點:
什么是 ProGuard?
ProGuard 是 Android 中的免費 java 工具,它可以幫助我們執(zhí)行以下操作,
- 縮?。s?。┐a:刪除項目中未使用的代碼。
- 混淆代碼:重命名類、字段等的名稱。
- 優(yōu)化代碼:做內聯函數之類的事情。
簡而言之,ProGuard 對我們的項目產生了以下影響,
- 它減小了應用程序的大小。
- 它刪除了導致 Android 應用程序的 64K 方法計數限制的未使用類和方法。
- 它通過混淆代碼使應用程序難以進行逆向工程。
它對我們的應用程序有什么用處?
在 Android 中,proguard 對于制作可用于生產的應用程序非常有用。它可以幫助我們減少代碼并使應用程序更快。默認情況下,Proguard 在 Android Studio 中是開箱即用的,它在很多方面都有幫助,下面提到的很少,
- 它混淆了代碼,這意味著它將名稱更改為一些較小的名稱,例如MainViewModel它可能會將名稱更改為A。在混淆應用程序之后,您的應用程序的逆向工程現在成為一項艱巨的任務。
- 它縮小了資源,即忽略了我們的類文件沒有調用的資源,沒有在我們的android應用程序中使用,比如drawables中的圖像等。這將大大減少應用程序的大小。您應該始終縮小您的應用程序以使其重量輕且速度快。
如何在我們的項目中使用它?
要在您的項目中啟用 Proguard,請在應用程序的 build.gradle 添加,
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
在這里,我們minfyEnabled確實如此,它激活了從文件中獲取的proguard,
proguard-android.txt
它在發(fā)布塊下,這意味著它只會應用于我們生成的構建的發(fā)布。
但有時當 proguard 刪除太多代碼時它可能太多了,它可能會破壞你的代碼流。
因此,配置代碼我們必須添加一些自定義規(guī)則,以確保我們從混淆中刪除代碼集。我們可以通過在我們的 proguard 中編寫自定義規(guī)則來解決這個問題,它會在生成構建時遵守。
現在,讓我們看看如何在 proguard 中編寫自定義規(guī)則。
1. 保存類文件假設我們有一個數據類,某些 API 需要它來執(zhí)行它,但它會生成我們對類進行混淆的構建。例如,我們有一個用戶數據類,
data class User(val id: String = "")
我們不想混淆生成構建的類,然后忽略它的混淆,我們使用@Keep注釋并更新代碼,例如,
@Keep data class User(val id: String = "")
此注釋有助于在縮小時使用 proguard 來忽略該類。這將保留類及其成員函數,即使它們不被使用。
我們還可以使用,
-keep
在生成構建時保留類的選項。使用-keep而不是@Keep,我們可以更好地控制要保留的內容和不保留的內容。
但是,我們也可以通過使用@SerializedName(當使用 Gson 庫時)來保留數據模型類中id字段的鍵,例如,
data class User(@SerializedName("id")
val id: String = "")
如果你注意到這里,我們沒有使用@Keep。
2. 為班級保留成員假設我們想在收縮時只保留類成員而不是類,然后我們使用,
-keepclassmembers
在 proguard 規(guī)則文件中。這將幫助我們忽略特定類的成員。
考慮上面的 User 類,我們希望保留其中的所有公共方法。我們這樣寫規(guī)則,
-keepclassmembers class com.mindorks.sample.User{
public *;
}
在這里,類 User 保留所有具有公共修飾符的成員。
3. 保留班級和成員的名字假設我們希望在代碼中使用類和類成員的所有相同名稱,即如果未使用該類,它將被 proguard 縮小但不會混淆,因為它已經被縮小了,所以沒有需要混淆。
要完成我們使用的上述任務,
-keepnames
它的實際使用看起來像,
-keepnames class com.mindorks.sample.GlideModule
在這里,如果 GlideModule 將保留其所有的類名稱和成員函數。
4.在Android中使用任何庫在使用任何庫時,我們可能希望為 proguard 編寫一些自定義規(guī)則。庫可能會在 logcat 中引發(fā)警告,或者他們甚至可能沒有自己的 proguard 規(guī)則!
為了解決這個問題,我們需要在應用程序端添加自定義規(guī)則。例如,如果我們開始從任何庫中收到警告,那么我們添加,
-dontwarn com.somelibrary.annotations.*
在我們的 proguard 規(guī)則中,然后我們不會在日志中看到任何警告。
要為庫編寫自定義規(guī)則,您可以像為自己的類編寫任何其他規(guī)則一樣編寫它。
5. 只混淆你的代碼考慮一個非常罕見的用例,您只想混淆代碼而不壓縮任何資源。這是一個非常罕見的用例,但可能對一些小型庫有用,然后我們編寫如下標志,
-dontshrink -dontoptimize
這將幫助我們不縮小和優(yōu)化代碼而只是混淆。
6. 維護注解在構建應用程序時,ProGuard 會刪除所有注釋,它可能仍然適用于您項目中的某些代碼集。但是假設我們需要不刪除注釋,那么我們可以選擇,
-keepattributes *Annotation*
在這里,它將所有注釋的屬性保留在您的應用程序中。它默認出現在我們的規(guī)則中。
7.優(yōu)化在 ProGuard 中編寫了這么多規(guī)則之后,我們可能需要為我們的應用程序提供額外的優(yōu)化層。首先,我們更新build.gradle文件,例如,
android {
buildTypes {
release {
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt')
}
}
}
現在,一般來說,我們不使用此選項,但這里的用例是我們必須執(zhí)行額外級別的優(yōu)化。
為了增加優(yōu)化的周期數,例如我們想檢查優(yōu)化是否正確完成,如果沒有完成,它將再次優(yōu)化它直到我們使用一定次數,
-optimizationpasses 5
在這里,它將運行優(yōu)化多達 5 次以使其更加優(yōu)化。
現在,考慮一個示例,與以前相比,我們希望更細粒度地優(yōu)化最終類,我們使用,
-optimizations class/marking/final
在這里,最終的類將被優(yōu)化最多 5 倍,或者如果優(yōu)化已經完成,它甚至可能提前結束。
現在,如果我們想優(yōu)化我們現在使用的私有字段,
-optimizations field/marking/private
大多數情況下,優(yōu)化是第一次完成。
如果我們根本不想優(yōu)化我們使用,
-dontoptimize
這就是我們如何以不同的方式使用 proguard 使我們的應用程序更安全和更輕便的工作方式。
需要注意的重要事項:
- 不要使用MainFragment.class.getSimpleName() 之類的東西作為片段標簽。Proguard 可能會在混淆時為不同包中的兩個不同片段分配相同的名稱(A.class)。在這種情況下,兩個片段將具有相同的 TAG。這將導致您的應用程序中的錯誤。
- 保留 Proguard 的映射文件以追溯到原始代碼。您可能必須將其上傳到 PlayStore 控制臺等不同的地方才能查看崩潰的原始堆棧跟蹤。
翻譯鏈接
https://blog.mindorks.com/applying-proguard-in-an-android-application
以上就是Android開發(fā)ProGuard使用技巧掌握的詳細內容,更多關于Android開發(fā)ProGuard使用的資料請關注腳本之家其它相關文章!
相關文章
Android自定義view仿QQ的Tab按鈕動畫效果(示例代碼)
這篇文章主要介紹了Android自定義view仿QQ的Tab按鈕動畫效果(示例代碼),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考價值,需要的朋友可以參考下2021-01-01

