Proguard kullanırken belirli bir paket yolu nasıl tutulur / hariç tutulur?


110

Bazı dosya yollarını ProGuard'dan çıkarmak istiyorum. Misalcom.myapp.customcomponents

Bunu nasıl yapabilirim? Bu dizine sahip olduğum her özel bileşen dosyası için -keep bayrakları yerleştirmekten nefret ediyorum.

Aşağıdakileri denedim ama işe yaramıyor:

-keep public class com.myapp.customcomponents.*

Yanıtlar:


241

Ne şekilde çalışmadığını belirtmiyorsunuz. Yapılandırmanız, belirtilen paketteki tüm genel sınıfların adlarını tutar:

-keep public class com.myapp.customcomponents.*

Aşağıdaki yapılandırma, belirtilen paketteki ve alt paketlerindeki tüm genel sınıfların adlarını tutar:

-keep public class com.myapp.customcomponents.**

Aşağıdaki yapılandırma, belirtilen paketteki ve alt paketlerindeki tüm genel / korumalı sınıfların / alanların / yöntemlerin adlarını tutar:

-keep public class com.myapp.customcomponents.** {
  public protected *;
}

6
Çift yıldız işareti (**) artık derlenmiyor (Android Studio 4.0)
Daniel

1
Android Studio 4.x, çift yıldız işaretleri (**) için "Çözümlenmemiş sınıf adı" gibi hataları gösterecek, ancak beklendiği gibi çalışacaktır.
Mahmudul Hasan Shohag


56

ProGuard yapılandırmanızın altına aşağıdaki satırı ekleyin:

-keep class com.facebook.** { *; }

Paket adını uygun şekilde değiştirin, burada paket com.facebookProGuard'dan çıkarılacaktır.


13
neden birlikte
kullanıp uyarmayın

@Jongz Puangput, eğer haklıysam - uygulama com.facebook paketini kullanmazsa, derleme üzerinde "yapılandırma bilinmeyen sınıfa atıfta bulunuyor ..." notu gösterilecektir. -dontwarn bu notu devre dışı bırakın.
Yura Shinkarev

14
ne anlama { *; }geliyor?
Muhammad Babar

15
@MuhammadBabar demek her üye, yöntem, her kapsamda sınıf, kısacası her şey demek!
Omar El Don

1

Görünüşe göre birçok insan -keep class com.myapp.customcomponents.** { *; }, bir yolu işlenmekten hariç tutmanın bir yolu olarak tavsiye ediyor. Buraya bakın:

  1. paketleri proguard'dan hariç tut
  2. Proguard'ın paketi tamamen yok saymasını sağlayın
  3. Bir dizinin proguard gizlemesini önleyin

Bu çözümle ilgili sorun, hala kodunuzu kırabilecek bir miktar şaşırtma olması. Haritalama çıktısında eşleştirmeyi görebilirsiniz:

java.lang.String toString() -> toString
int getMemoizedSerializedSize() -> getMemoizedSerializedSize
void setMemoizedSerializedSize(int) -> setMemoizedSerializedSize
int getSerializedSize() -> getSerializedSize
boolean equals(java.lang.Object) -> equals
int hashCode() -> hashCode

Seçtiğim çözüm iki aşamalı bir süreçtir. Öncelikle, injarsişlemek istediğim paket yolunu seçmek için bir filtre ile kullanın. Diğer paket yollarını kitaplıklar olarak eklemek mümkündür.

-injars       artifacts/in.jar(org/toprocess/**.class)
-outjars      out/processed.jar
-libraryjars  artifacts/in.jar(org/skipped/**.class)
-libraryjars  artifacts/in.jar(org/moreskipped/**.class)

İkinci olarak, işlenmiş kavanozu orijinal kavanozla, ancak yalnızca atlanan yolları birleştirin.

-injars  out/processed.jar
-injars  artifacts/in.jar(org/skipped/**.class)
-injars  artifacts/in.jar(org/moreskipped/**.class)
-outjars out/merged.jar

-dontshrink
-dontoptimize
-dontobfuscate

Sonuç, işlenen paket yolu ile atlanan yolların birleşimi olan birleştirilmiş bir kavanozdur. Birisi belirli yolların işlenmesini tamamen atlamanın bir yolunu sağlayabilirse (bulamadığım) bu alıştırma geçersizdir.


1

Android Studio 4.0 kullanarak benim için işe yarayan şey:

-keepclassmembers class com.myapp.customcomponents.* {
    <fields>;
    <init>();
    <methods>;
}

Diğer yanıtlarda çift yıldız işareti (**) benim için işe yaramadı. Yukarıdaki yapılandırmayı da R8 ile denedim, iyi çalışıyor.


bu cevap bence en güncel cevap. teşekkür ederim.
Gogo-the-Cat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.