Proguard rimuove i metodi sottoposti a override in una classe astratta come non utilizzati, anche se sono utilizzati nella classe padre. Ecco un'implementazione di riferimento che mostra il comportamentoProguard rimuove i metodi sottoposti a override in classe astratta come non utilizzati
public abstract class Animal {
Animal() {
born();
}
abstract void born();
}
public abstract class Human extends Animal {
@Override
void born() {
System.out.println("Human is born.");
}
}
La tenere attributi sono definiti come:
-keep public class test.Human {
public *;
}
Proguard rimuove le sovrascritti born()
metodi nella classe umana come inutilizzato, anche se è utilizzato dal costruttore di classe animale. Il file di mapping risultante è
test.Animal -> test.a:
void born() -> a
test.Human -> test.Human:
Questo problema non esiste se la classe Human
non è astratta. Se la classe è Human
non astratta, il file di mapping risultante è
test.Animal -> test.a:
void born() -> a
test.Human -> test.Human:
void born() -> a
Come possiamo vedere, il metodo born()
viene mantenuto in questo caso.
Si tratta di un bug in proguard? O c'è qualche impostazione di ottimizzazione che può fornire il comportamento desiderato?
Sto usando proguard con Android Studio.
Esiste una classe concreta che estende Human? Se non c'è, potrebbe essere che si deduca che 'Human.born' non può mai essere eseguito. –
@Devon_C_Miller Non esiste una classe concreta poiché fa parte della libreria. Lo stesso problema esiste se i costruttori vengono sostituiti da un altro metodo che viene mantenuto e visualizzato nella mappatura. – adwiv