是否有明確的方法阻止ProGuard從實現接口更改類?如何阻止ProGuard從類中剝離Serializable接口
我有一個類實現java.io.Serializable
,我們稱之爲com.my.package.name.Foo
。我發現在運行ProGuard後,它不再實現Serializable
。我從Serializable
轉換爲Foo
和false
後,我得到null
如果我使用instanceof Serializable
檢查實例。我已經取得了一定要設置的ProGuard忽略這個類:
-keep class com.my.package.name.Foo
我也試過:
-keep class com.my.package.name.Foo { *; }
和我也做這個嘗試全包:
-keep class com.my.package.name.** { *; }
或:
-keep class com.my.package.** { *; }
也只是爲了保持所有類型Serializable
:
-keep class * implements java.io.Serializable { *; }
但無濟於事。我有一個兄弟姐妹包(大致爲:com.my.package.name2.Bar
),也實現Serializable
和類似使用,但沒有問題的其他類。
我不確定它是否相關,但我將它包裝在一個用於Android的jar中。使用這些類的代碼包括將它們放在Bundle
中,這就是爲什麼我需要Serializable
。我認爲ProGuard可能以某種方式認爲Foo
永遠不會被用作Serializable
,但這似乎不太可能,因爲我將它作爲參數傳遞給Bundle.putSerializable(String, Serializable)
,並且我也進行了隱式投射:Serializable serializable = foo;
。實際上,當我調試時,我可以看到Foo
被放入Bundle
,我可以檢查Bundle
並在那裏看到Foo
的實例,但是當檢索它時,轉換失敗。
感謝輸入,但我已經對'javap'檢查和'Foo'沒有實現'Serializable'了。您對'ClassCastException'的評論對我來說也是有意義的,但它似乎並沒有這樣工作。我懷疑是在收縮和優化中發生了什麼事情,以改變你所期望的普通Java代碼所做的行爲,因爲此時它不再是Java,而是字節碼。 – kabuko
我發現如果我將ProGuard設置爲'-dontshrink',然後明確使用'-keep,allowoptimization,allowhrinking,allowobfuscation Foo',那麼'Foo'仍然會實現'Serializable',但不幸的是這對我來說不是一個解決方案正如我想縮小一般。 – kabuko
如果你有一個小樣本來說明問題,我會研究它。您可以在ProGuard網站的反饋頁面上找到我的郵件地址。 –