Come mantenere / escludere un particolare percorso del pacchetto quando si utilizza proguard?


110

Voglio escludere alcuni percorsi di file da ProGuard. Esempiocom.myapp.customcomponents

Come posso fare questo? Odio mettere i flag -keep per ogni singolo file di componenti personalizzati che ho in questa directory.

Ho provato quanto segue ma non funziona:

-keep public class com.myapp.customcomponents.*

Risposte:


241

Non specifichi in che modo non funziona. La tua configurazione mantiene i nomi di tutte le classi pubbliche nel pacchetto specificato:

-keep public class com.myapp.customcomponents.*

La seguente configurazione mantiene i nomi di tutte le classi pubbliche nel pacchetto specificato e nei suoi sottopacchetti:

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

La seguente configurazione mantiene i nomi di tutte le classi / campi / metodi pubblici / protetti nel pacchetto specificato e nei suoi sottopacchetti:

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

6
I doppi asterischi (**) non si compilano più (Android Studio 4.0)
Daniel

1
Android Studio 4.x mostrerà errori come "Nome classe non risolto" ecc. Per doppi asterischi (**), ma funzionerà come previsto.
Mahmudul Hasan Shohag

È stato risolto e non darà errori nelle prossime versioni, controlla i dettagli qui
shadygoneinsane

56

Aggiungi la seguente riga in fondo alla configurazione di ProGuard:

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

Sostituisci il nome del pacchetto di conseguenza, qui il pacchetto com.facebookverrà escluso da ProGuard.


13
perché tenere e non avvisare l'uso insieme
Jongz Puangput

@ Jongz Puangput, se ho ragione - se l'app non usa il pacchetto com.facebook, sulla build verrà mostrata la nota "la configurazione si riferisce alla classe sconosciuta ...". -non avvisare disabilita questa nota.
Yura Shinkarev

14
cosa { *; }significa?
Muhammad Babar

15
@ MuhammadBabar intendo ogni membro, metodo, classe in ogni ambito, in breve tutto!
Omar El Don

1

Molte persone sembrano consigliare -keep class com.myapp.customcomponents.** { *; }come un modo per escludere un percorso dall'elaborazione. Vedere qui:

  1. escludere i pacchetti da proguard
  2. Fai in modo che Proguard ignori completamente il pacchetto
  3. Impedisce a una directory di offuscare il programma

Il problema con questa soluzione è che si verifica ancora un certo livello di offuscamento, che può interrompere il codice. Puoi vedere la mappatura nella stampa della mappatura:

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

La soluzione che ho scelto è un processo in due fasi. In primo luogo, utilizzare injarscon un filtro per selezionare il percorso del pacchetto che desidero elaborare. È possibile aggiungere gli altri percorsi del pacchetto come librerie.

-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)

In secondo luogo, unisci il jar elaborato con il jar originale, ma solo i percorsi che sono stati ignorati.

-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

Il risultato è un jar unito che è la combinazione del percorso del pacchetto elaborato e dei percorsi ignorati. Questo esercizio non è valido, se qualcuno può fornire un modo per saltare completamente l'elaborazione di determinati percorsi (che non ho trovato).


1

Quello che ha funzionato per me utilizzando Android Studio 4.0 è:

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

I doppi asterischi (**) in altre risposte non hanno funzionato per me. Ho anche provato la configurazione di cui sopra con R8, funziona bene.


questa risposta è la risposta più aggiornata credo. grazie.
Gogo-the-Cat,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.