proguard hell - não é possível encontrar a classe referenciada

125

Então, estou tentando lançar algum software, mas Proguard está me dando dor de cabeça.

Quando tento exportar usando proguard, recebo muitos avisos, ou seja, "não consigo encontrar a classe referenciada"

Por exemplo:

[2011-08-07 17:44:37 - GAME] Warning: org.simpleframework.xml.stream.StreamReader: can't find referenced class javax.xml.stream.events.XMLEvent
[2011-08-07 17:44:37 - GAME] Warning: there were 52 unresolved references to classes or interfaces.
[2011-08-07 17:44:37 - GAME]          You may need to specify additional library jars (using '-libraryjars'),
[2011-08-07 17:44:37 - GAME]          or perhaps the '-dontskipnonpubliclibraryclasses' option.
[2011-08-07 17:44:37 - GAME] java.io.IOException: Please correct the above warnings first.
[ 

Os avisos parecem estar relacionados ao simpleframework, portanto, no meu arquivo de configuração proguard, adicionei o seguinte:

-libraryjars pathtoprojecttolibs\simple-xml-2.4.jar

Onde pathtoprojecttolibsestá o caminho para os frascos referenciados pelo meu projeto.

Isso não faz diferença.

Se o simpleframework referenciar javax, posso dizer ao proguard para ignorar isso também?

Alguma ideia?

iasksillyquestions
fonte
1
Você está usando o programa apenas para fazer árvores? Em caso afirmativo, você verificou o tamanho do arquivo sem usá-lo? Você pode obter bugs superdimensionados quando o programa lança algo que é acessado usando reflexão, por exemplo, que você não encontrará até que ele interrompa o tempo de execução; portanto, tenha muita certeza de que precisa.
alun
Eu estava realmente apenas usando-o para tentar proteger o código sendo cortado com a mesma facilidade? Você acha que vale a pena?
Iasksillyquestions
3
O @ListenToRick Proguard está perfeitamente bem, se for executado com as configurações adequadas e o aplicativo resultante testado corretamente. Tenho certeza de que o Google recomenda seu uso. O Google fornece vários guias / exemplos para o uso do Proguard com aplicativos Android.
precisa saber é o seguinte
O Proguard é uma boa ferramenta, mas o Google recomenda que seja provavelmente pelo menos por causa de uma limitação de tamanho bastante estranha no formato dex como qualquer outra coisa. (Veja code.google.com/p/android/issues/detail?id=7147 )
alun
5
@ Alun, essa não é a razão. Aqueles de nós que não desejam nossos aplicativos com engenharia reversa ou que estão usando o licenciamento para 'tentar' impedir a pirataria devem usar uma ferramenta de ofuscação como essa para dificultar a vida de hackers. Fazer com que seu aplicativo ocupe menos espaço também é um benefício para o usuário final, e também há otimizações feitas por essas ferramentas ... mais um benefício.
Christopher Perry

Respostas:

128

org.simpleframework.xml.stream.StreamReaderno seu código se refere javax.xml.stream.events.XMLEvent. Como a última classe faz parte do tempo de execução Java ( rt.jar), mas não faz parte do tempo de execução Android ( android.jar), o ProGuard avisa que algo pode estar quebrado. Se tiver certeza de que seu aplicativo funciona de qualquer maneira, você pode especificar

-dontwarn javax.xml.stream.events.**

ProGuard, inferno?

Eric Lafortune
fonte
15
Que não corrigi-lo para mim, no entanto, isso fez-dontwarn javax.xml.**
Jeshurun
8
A adição -libraryjars <java.home>/lib/rt.jarcorrigiu o problema para mim.
Gautam
3
Recebi avisos adicionais sobre, por exemplo, javax.xml.stream.XMLInputFactory, então usei-dontwarn javax.xml.stream.**
spatialist
1
Como posso configurar -dontwarna GUI?
Tomáš Zato - Restabelece Monica
2
O inferno proguard continua, apenas me chateie e acabe com essa dor.
217 Josh
9

No meu caso, a causa raiz estava aqui . Esses avisos que você pode simplesmente ignorar:

-dontwarn org.simpleframework.xml.stream.**

A resposta original está aqui

Yaroslav Havrylovych
fonte
5

Este erro ocorre porque as bibliotecas usadas dependem de outras que não são realmente usadas, mas o Proguard as procura.
Adicione suas linhas -dontwarn ao seu arquivo proguard-rules.pro no seu projeto Android para desativar esses avisos.

insira a descrição da imagem aqui

Você pode encontrar quais dependências você precisa adicionar ao seu proguard-rules.pro no rastreamento de pilha do seu erro.

Yuliia Ashomok
fonte
2

Você deve incluir isso em sua configuração do Proguard:

-dontskipnonpubliclibraryclasses
CrackerJack9
fonte
Bem, isso aconteceu comigo na época ... ~ 4 anos atrás ... as coisas podem ter mudado desde então :) Parecia ter funcionado para pelo menos 2 outras pessoas de qualquer maneira.
precisa saber é o seguinte
O padrão proguard-android.txt já possui esta linha.
Cristina De Rito
1
@Ultimecia que cometem é a partir de 2013, este post foi feito em 2011
CrackerJack9
2

Chave My Magic que resolveu minhas horas de pesquisa: adicione isto a progruard-android.txt

-dontskipnonpubliclibraryclassmembers
Ashraf Alshahawy
fonte
0

Hmm. Lendo esse aviso, parece que a biblioteca que você está tentando usar depende de javax.xml.stream.events. Eu não acho que o espaço para nome esteja realmente incluído no Android. (Consulte o Índice do pacote ).

Tente implantá-lo no emulador sem usar proguard e veja se funciona. Meu palpite seria não se esse aviso for preciso.

alun
fonte
Oi, se estiver funcionando no emulador sem o proguard, isso significa que os avisos são imprecisos? Estou tentando descobrir por que tive esses tipos de avisos semelhantes. Eu não quero apenas suprimir os avisos.
Michelle Shieh
0

Eu acho que esse é um caso extremo, mas no meu caso eu tive que limpar completamente a pasta de compilação no meu programa Jenkins, tentei trabalhar com código antigo que não existia mais - apenas no caso de alguém ter o mesmo problema.

sortudo
fonte
0

No meu caso, não mudei nada e o aviso começou a aparecer. O problema estava com os caches de gradle quebrados. Veja minha outra resposta . Partilho com isso porque demorei duas horas para encontrar o problema:]

AppiDevo
fonte
0

Adicione esta linha ao seu proguard-rules.proarquivo no diretório gradle scripts:

-dontwarn package.class.name.**

onde package.class.nameé o nome do pacote com o nome da classe do arquivo jar anexado.

Por exemplo:

-dontwarn com.myexternalclass.utils.**
Pedro Marthon
fonte