ProGuard에서 클래스를 인터페이스 구현에서 변경하지 않으려는 명확한 방법이 있습니까?ProGuard에서 클래스에서 Serializable 인터페이스를 제거하지 못하도록하는 방법
나는 java.io.Serializable
을 구현하는 클래스를 가지고 있는데, com.my.package.name.Foo
이라고 부르기로한다. ProGuard를 실행 한 후에는 더 이상 Serializable
을 구현하지 않습니다. 내가 instanceof Serializable
으로 인스턴스를 확인하면 Serializable
에서 Foo
및 false
으로 전송 한 후에 을 얻습니다.
-keep class com.my.package.name.Foo
나는 또한 시도했다 : :이 클래스 무시 ProGuard에서 설정되어 있는지 확인했습니다
-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에서 사용하기 위해 항아리에 포장하고 있습니다. 이러한 클래스를 사용하는 코드는 Bundle
에 넣는 것을 포함하므로 Serializable
이 필요합니다. 나는 아마도 ProGuard가 Foo
이 Serializable
으로 사용 된 적이 없다고 생각하지만 아마도 Bundle.putSerializable(String, Serializable)
에 대한 매개 변수로 이것을 전달할 가능성이 희박하며 암시 적 캐스트 : Serializable serializable = foo;
을 수행한다고 생각했습니다. 사실, 내가 디버그 할 때, Bundle
에 들어가서 Foo
을 볼 수 있고 거기에서 Bundle
을 검사 할 수 있고 Foo
의 인스턴스를 볼 수 있습니다.하지만이를 검색 할 때 캐스트가 실패합니다.
감사합니다,하지만 난 Foo' 더 이상'Serializable'를 구현하지 않는'javap''으로 확인하고했습니다. 'ClassCastException'에 대한 여러분의 의견도 나에게 의미가 있지만, 그렇게 작동하지 않는 것 같습니다. 저의 의구심은 정상적인 자바 코드가 자바 코드가 아닌 자바 코드가 아니라 바이트 코드가 될 것으로 기대했던 것과 행동을 바꾸기위한 축소와 최적화에서 어떤 일이 일어났습니다. – kabuko
ProGuard를'-dontshrink'로 설정하고 명시 적으로'-keep, allowoptimization, allowshrinking, allowobfuscation Foo'를 사용하면'Foo'가 여전히'Serializable'을 구현하지만 불행히도 저에게는 해결책이 아니라는 것을 발견했습니다 나는 축소가 일반적으로 이루어지기를 원한다. – kabuko
문제를 설명하는 작은 샘플이있는 경우 살펴 보겠습니다. 내 메일 주소는 ProGuard 웹 사이트의 피드백 페이지에서 찾을 수 있습니다. –