Proguard中optimize設置不當引起SimException

今天來講一下Proguard中關於optimize的問題。先上一張異常圖片android

最近項目重構,從新調整了各個組件之間的依賴關係。過程當中,在項目Proguard這塊卡住了,最開始還好,Proguard只是提示警告,項目構建失敗。因而我根據提示的警告信息,把先關的一些依賴所了混淆的一些配置處理。從新觸發構建,日誌再也不有警告,但此時卻出現了一個error!算法

如上圖所示,這是我項目中完整的錯誤日誌。下面是我proguard-project.txt文檔中所配置的optimize相關內容。優化

# 指定混淆時採用的算法,後面的參數是一個過濾器
-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
# 代碼混淆壓縮比,在0~7之間,默認爲5,通常不須要更改
-optimizationpasses 5

若是你也出現了圖片中所描述的異常,若是你的proguard-project.txt文件中的配置也跟我上面所列舉的一致。那麼,請你繼續往下看,或許我能幫到你。日誌

我再網上扒拉的內容,大多都是說要加上-dontoptimize就行了。可是-dontoptimize的含義是「不優化輸入的類文件」,這樣一來,所謂的-optimizations-optimizationpasses就沒有意義了 。這種作法,我這邊表示不認同。最終在stackoverflow上找到了我想要的解決方案。code

沒錯!在-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*的基礎上添加!code/allocation/variable,我在本身的項目中加上了這個內容以後,項目終於構建成功!圖片


以上是我此次所遇到的問題。下面,我想把Proguard相關的其餘內容也補充到這篇博客中,但願可以方便你們去回顧這些內容。ip

    1. Proguard工做原理

Proguard由shrink、optimize、obfuscate和preverify四個步驟組成,其中每一個步驟都是可選的。如圖所示。
文檔

這裏,引入Entry Point的概念。Entry Point是在Proguard過程當中不會被處理的類或方法,反之,非Entry Point的類和方法會被重命名。博客

    1. 基本混淆指令

經常使用的混淆指令有it

# 代碼混淆壓縮比,在0~7之間,默認爲5,通常不須要更改
-optimizationpasses 5
# 混淆時不適用大小寫混合,混淆後的類名爲小寫
-dontusemixedcaseclassnames
# 指定不去忽略非公共的庫的類
-dontskipnonpubliclibraryclasses
# 指定不去忽略非公共的庫的類的成員
-dontskipnonpubliclibraryclassmembers
# 不作預校驗,preverify是proguard的4個步驟之一,android不須要作預校驗,去除這一步能夠加快混淆速度
-dontpreverify
# 有了verbose這句話,混淆後就會生成映射文件
-verbose
# 指定混淆時採用的算法,後面的參數是一個過濾器
-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
# 保護代碼中的Annotation不被混淆
-keepattributes *Annotation*
# 保護代碼中的泛型被混淆
-keepattributes Signature
# 拋出異常時保留代碼行號
-keepattributes SourceFile,LineNumberTable
相關文章
相關標籤/搜索