2016-04-01 17 views
2

Şu anda çok fazla yansıma kullanan bir Android kütüphanesi kullanıyorum.Proguard: Kullanılmayan yöntemleri ortadan kaldırmaktan (ve engellemekten) kaçınmak için tüm bir paketin küçültülmesinden (ve gizlenmekten) nasıl kaçınılmalı?

Proguard'ı etkinleştirdiğimde ve çalıştırdığım anda ... çöker.

Neden? Çok fazla yansıma kullanır ve yöntemler yalnızca yansıma yoluyla çağrılır, böylece küçültme işlemi sırasında kullanılmayan ve çıkarılan proguard tarafından algılanır, böylece NoSuchMethodError atılır.

Neden böyle oluyor? Yani proguard kod parçalarının (bütün yöntemleri)

Yani, nasıl küçülen veya şaşırtma önlemek için, ProGuard yapılandırabilirsiniz onlar kullanılmamış vardır gördüğünü ve bu nedenle kaldırır olarak küçülen işlemi sırasında kaldırıldıkları anlamaya kolaydır tüm bir paket? (kitaplık)

Not: -dontshrink seçeneğini kullanmak istemiyorum, hepsi ya da hiçbir şey yok ve sadece belirli bir paketden kaçınmak istiyorum.


diğer bilgiler:

çalışma zamanı hatası şudur: Sorun bir iç iç sınıf biri olduğunu

E/AndroidRuntime: FATAL EXCEPTION: main Process: com.my.app.debug, PID: 3771 
java.lang.NoSuchMethodError: observeValueForKeyPath [class java.lang.String, class java.lang.Object, class com.my.lib.util.Dictionary, class java.lang.Object] 
at com.my.lib.util.Observable$ObservationManager$Observer.<init>(SourceFile:47) 
at com.my.lib.util.Observable$ObservationManager$Observer.<init>(SourceFile:26) 
at com.my.lib.util.Observable$ObservationManager.addObserver(SourceFile:159) 
... 

not alın ...

Bulunduğum Yapılandırma gibi bir şey var:

-keep,includedescriptorclasses class com.my.** { *; } 
-keepclassmembers class com.my.lib** { *; } 
-keep,includedescriptorclasses class com.my.lib.util.Observable$* { *; } 
-keep,includedescriptorclasses class com.my.lib.util.Observable$*$* { *; } 

Ama görünüşe göre bu sadece küçülme işlemi sırasında çıkarılan yöntemlerin gizlenmesini önler ... daralma sırasında yöntemleri kaldırmaktan kaçınmam gerekir.

+0

[ProGuard kullanırken tutmak için nasıl/Belirli bir paket yolu dışlamak?] Olası yinelenen (http://stackoverflow.com/questions/4830474/how-to-keep-exclude-a-particular-package -path-kullanırken-proguard) – Elltz

+0

Bu bir kopya değil.Özellikle, diğer cevapların çözmediği (ve diğer cevapların gerçekten cevapladığı) gizlemeyi devre dışı bırakmanın bir yolunu arıyorum. – neteinstein

+0

Küresel neden bu kadar çok kötüye gidiyor? ** uygulamanızın küçültülmesine ** ihtiyacınız var mı? Şu anda size sebep olan daralmaya değer mi? –

cevap

2

"[bir] sınıfları da korunur eğer" -keepclassmembers çalışır iken, küçülen bile çalışmalıdır documentation-keep göre.

benzer sorunları olan bir gelecekte insanlar uğruna
+0

Aslında haklısın. Başka bir şey yanlış yapıyordum. – neteinstein

0
-keep class com.library.** { *; } 
+0

Bu işe yaramıyor çünkü büzülme, kullanılmayan yöntemleri kaldırır. Bu nedenle, yalnızca kullanılan şekilde algılananları gözetlenmemiş halde tutar. Yansıma, derleme zamanında kullanılarak algılanmadı. – neteinstein

+0

true, sorunuz yansıma kullanımının özgüllüğünden bahsetmedi. Ama evet haklısın, – gaara87

+0

Cevaplarla ilgili daha fazla bilgi eklendi. – neteinstein

0

, gerçekten neler olduğunu açıklayacağız: F43nd1r cevabı yapılmış @-keep class my.app.package gerçekten (küçülen tarafından çıkarılıp Karartılmış edilecek yöntemler kaçınarak edildi

  1. Ben gerçekten de, bu yüzden de o da küçülen önlemek için dokümanlar söyledi, bu yüzden sorun başka bir yerde sorun olduğunu fark ettim, bu yüzden sorun başka yerde oldu

  2. Lib'in kodunu derledikten ve bir süreyi okuduktan sonra bir parametre olarak aldığımı buldum. Başka bir sınıf (bu lib'den değil) ve bir metod adı t ile bir dize şapka yansıması için kullanılır. Sorun buydu, aynı zamanda bu sınıfı gizlemekten de kaçınmam gerekiyordu.

İlgili konular