2012-11-28 41 views
24

在這種情況下,只要我願意,如果沒有來源改變,Proguard會保證提供相同的映射嗎?

  • 建項目
  • 清理所有的二進制文件
  • 重新構建它(沒有源/資源等發生了變化)。

不Proguard的擔保提供相同的mapping.txt文件?

+0

我想這將產生同樣的輸出(以及因此使用相同的映射) - 除非有在發揮RNG ;-)鑑於輸入沒有變化(包括任何的RNG),則輸出應該是相同..考慮的一個md5sum來快速「點頭或搖動」這樣的斷言。但是,由於源代碼經常改變,所以這真的不是最有用的問題。 – 2012-11-28 21:12:39

回答

34

ProGuard是確定性的:對於相同的輸入,它會生成相同的輸出。

但有一點細微之處:如果操作系統以不同的順序列出目錄中的輸入文件(特別是不在存檔內的類文件),那麼它們可能以不同的順序處理,並且輸出可以不一樣。

+0

哪裏寫的ProGuard手冊,它是確定性的?我無法找到任何參考。 –

+15

@Diego我是ProGuard的開發者;你必須相信我這個,或者你可以看看源代碼。 –

+0

謝謝,@Eric,我忘了版本mapping.txt,也想知道這一點。 –

7

它可能會發生,但我不認爲proguard保證。

我發現這個在Proguard documentation,讓你重用你的mapping.txt,以避免對映射

-applymapping名

改變指定重用給定名稱映射這是打印出來在之前的ProGuard混淆運行中。映射文件中列出的類和類成員會收到與它們一起指定的名稱。沒有提及的班級和班級成員會收到新名字。映射可能涉及輸入類以及庫類。此選項可用於增量混淆處理,即處理現有代碼塊的附加組件或小塊補丁程序。如果代碼的結構發生根本變化,ProGuard可能會打印出應用映射的警告,導致衝突。您可以通過在兩次混淆運行中指定選項-useuniqueclassmembernames來降低此風險。只允許一個映射文件。只有在混淆時才適用。

0

如果您想要保證,那麼您必須使用映射文件作爲混淆處理的輸入。但是,您必須仔細檢查與該映射文件有關的衝突的所有警告。如果您忽略這一點,那麼在處理反射時可能會出現細微的錯誤。

相關問題