Como manter / excluir um caminho de pacote específico ao usar o proguard?

110

Desejo excluir alguns caminhos de arquivo do ProGuard. Exemplocom.myapp.customcomponents

Como posso fazer isso? Eu odeio colocar sinalizadores -keep para cada arquivo de componente personalizado que tenho neste diretório.

Tentei o seguinte, mas não funcionou:

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

Respostas:

241

Você não especifica de que maneira isso não funciona. Sua configuração mantém os nomes de todas as classes públicas no pacote especificado:

-keep public class com.myapp.customcomponents.*

A configuração a seguir mantém os nomes de todas as classes públicas no pacote especificado e seus subpacotes:

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

A configuração a seguir mantém os nomes de todas as classes / campos / métodos públicos / protegidos no pacote especificado e seus subpacotes:

-keep public class com.myapp.customcomponents.** {
  public protected *;
}
Eric Lafortune
fonte
6
Asteriscos duplos (**) não compilam mais (Android Studio 4.0)
Daniel
1
O Android Studio 4.x mostrará erros como "Nome da classe não resolvido" etc. para asteriscos duplos (**), mas funcionará conforme o esperado.
Mahmudul Hasan Shohag
Está consertado e não dará erros nos próximos lançamentos, verifique os detalhes aqui
shadygoneinsane
56

Adicione a seguinte linha na parte inferior da configuração do ProGuard:

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

Substitua o nome do pacote de acordo, aqui o pacote com.facebookserá excluído do ProGuard.

Pawan Maheshwari
fonte
13
por que manter e não usar juntos
Jongz Puangput
@Jongz Puangput, se eu estiver certo - se o aplicativo não usar o pacote com.facebook, então na construção será mostrada a nota "a configuração refere-se à classe desconhecida ...". -dontwarn desativa esta nota.
Yura Shinkarev
14
o que { *; }significa?
Muhammad Babar
15
@MuhammadBabar i significa cada membro, método, classe em cada escopo, em suma, tudo!
Omar El Don
1

Muitas pessoas parecem recomendar -keep class com.myapp.customcomponents.** { *; }uma forma de impedir que um caminho seja processado. Veja aqui:

  1. excluir pacotes do proguard
  2. Faça o Proguard ignorar completamente o pacote
  3. Impedir que um diretório seja ofuscado por proguard

O problema com essa solução é que ainda há algum nível de ofuscação acontecendo, o que pode quebrar seu código. Você pode ver o mapeamento na impressão do mapeamento:

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

A solução que optei é um processo de duas etapas. Primeiro, use injarscom um filtro para selecionar o caminho do pacote que gostaria de processar. É possível adicionar outros caminhos de pacote como bibliotecas.

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

Em segundo lugar, mescle o jar processado com o jar original, mas apenas os caminhos que foram ignorados.

-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

O resultado é um jar mesclado que é a combinação do caminho do pacote processado e dos caminhos ignorados. Este exercício é inválido se alguém puder fornecer uma maneira de pular completamente o processamento de certos caminhos (que eu não encontrei).

PLG
fonte
1

O que funcionou para mim usando o Android Studio 4.0 é:

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

Asteriscos duplos (**) em outras respostas não funcionaram para mim. Eu também tentei a configuração acima com R8, funciona bem.

mtsahakis
fonte
esta resposta é a mais atualizada, eu acho. obrigado.
Gogo-the-Cat