Proguard Kuralları

Siz de proguard hata verdiğinde zorlananlardan mısınız? Kurallar her ne kadar karmaşık görünse de dokümantasyon oldukça başarılı aslında. Burada kendi ifadelerimle Türkçe olarak anlatmaya çalışacağım.

Keep Seçenekleri (Reference)

Kodun istediğimiz kısımlarının obfuscate edilmemesi için ya da uçurulmaması için -keep* (-keep, -keepclassmembers…) anahtar kelimeleri ile bazı ifadeler yazıyoruz.

Burada proguard dokümantasyonundaki öneriler önemli:

  • Ne yaptığınızı bilmiyorsanız sadece -keep kullanın. Bu belirtilen sınıfın ve alanların hem obfuscate edilmesini hem de uçurulmasını engelleyecektir.
-keep class com.mehmet6parmak.training.proguard.keep.** {
*;
}
  • -keep’ten sonra sadece sınıf ismi belirtmek sadece sınıf ismini korur alanlarını obfuscate eder ve kullanılmadığını düşünürse uçurur. Bu yüzden korumak istediğiniz sınıf alanlarını belirtmeyi unutmayın.
  • Proguard sadece belirtilen alan ve sınıflara dokunmaz, onların bağımlı olduğu sınıfları özellikle belirtilmedikçe obfuscate edecektir ya da uçuracaktır.

Class Belirleyicisi (Reference)

keep* ifadelerinden sonra bir class filtresi kullanılmaktadır. Bu class filtresinin spesifikasyonu şu şekildedir.

  • Köşeli parantezler opsiyonel seçenekleri belirtir.
  • | ya da anlamındadır.

Filtreler, Özel Karakterler

  • ? tek bir karakter yerine kullanılabilir.
  • * paket ayırıcısı (nokta) dışında herhangi bir ismin yerine kullanılabilir. com.mehmet6parmak.* — > com.mehmet6parmak.MainActivity ok ancak com.mehmet6parmak.ui.MainActivity not ok.
  • ** paket ayırıcısı dahil herhangi bir ismin yerini alır. **.MainActivity herhangi bir paket altındaki MainActiviy sınıfına işaret eder.
  • ! değil operatörü. Bu olmayan şu olmayan anlamında kullanılır. **.!MainActivity — > MainActivity olmayan tüm sınıflar. Ya da !foobar,*bar — > foobar olmayan tüm bar ile biten sınıflar.
  • *** herhangi bir tipe karşılık gelir, primitive,non-primitive, array, non-array
  • … herhangi bir sayıdaki herhangi tipteki argüman listesine karşılık gelir.
  • % herhangi bir primitive tipe karşılık gelir.
  • <init> consctructorlara karşılık gelir.
  • <fields> sınıf alanlarına karşılık gelir.
  • <methods> sınıf methodlarına karşılık gelir.

Not-1: ?, *, ** primitive tipler için kullanılamamaktadır.

Not-2: Sadece *** array tiplerine karşılık gelir.

  • ** get*() -> “java.lang.Object getObject()” OK
  • ** get*() -> “float getFloat()” NOT OK
  • ** get*() -> “java.lang.Object[] getObjects()” NOT OK

Referanslar & Örnekler

Like what you read? Give Mehmet Altıparmak a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.