今天來講一下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
Proguard由shrink、optimize、obfuscate和preverify四個步驟組成,其中每一個步驟都是可選的。如圖所示。
文檔
這裏,引入Entry Point的概念。Entry Point是在Proguard過程當中不會被處理的類或方法,反之,非Entry Point的類和方法會被重命名。博客
經常使用的混淆指令有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