Tenho um aplicativo Android bastante grande que depende de muitos projetos de biblioteca. O compilador Android tem uma limitação de 65536 métodos por arquivo .dex e estou ultrapassando esse número.
Existem basicamente dois caminhos que você pode escolher (pelo menos que eu saiba) quando atinge o limite do método.
1) Reduza seu código
2) Crie vários arquivos dex ( veja esta postagem do blog )
Eu olhei em ambos e tentei descobrir o que estava fazendo com que minha contagem de métodos fosse tão alta. A API do Google Drive leva a maior parte com a dependência Guava em mais de 12.000. O total de libs para Drive API v2 chega a mais de 23.000!
Minha pergunta, eu acho, é: o que você acha que eu devo fazer? Devo remover a integração do Google Drive como um recurso do meu aplicativo? Existe uma maneira de reduzir a API (sim, eu uso o proguard)? Devo seguir a rota dex múltipla (que parece um tanto dolorosa, especialmente lidando com APIs de terceiros)?
fonte
apk
forma pseudo ? Eu pessoalmente gostaria de ver a integração do DriveRespostas:
Parece que o Google finalmente implementou uma solução alternativa / correção para ultrapassar o limite de método de 65K de arquivos dex.
Consulte: Criando aplicativos com mais de 65 mil métodos
Você ainda deve evitar atingir o limite de método de 65K usando ativamente o proguard e revisando suas dependências.
fonte
você pode usar a biblioteca de suporte multidex para isso, para habilitar multidex
1) inclua-o nas dependências:
2) Habilite em seu aplicativo:
3) se você tiver uma classe de aplicativo para seu aplicativo, substitua o método attachBaseContext como este:
4) se você não tiver uma classe de aplicativo para seu aplicativo, registre android.support.multidex.MultiDexApplication como seu aplicativo no arquivo de manifesto. como isso:
e deve funcionar bem!
fonte
Play Services
6.5+ ajuda: http://android-developers.blogspot.com/2014/12/google-play-services-and-dex-method.html...
Esta é uma boa notícia, para um jogo simples, por exemplo, você provavelmente só precisa do
base
,games
e talvezdrive
.fonte
Nas versões do Google Play Services anteriores à 6.5, você tinha que compilar todo o pacote de APIs em seu aplicativo. Em alguns casos, isso tornava mais difícil manter o número de métodos em seu aplicativo (incluindo APIs de estrutura, métodos de biblioteca e seu próprio código) abaixo do limite de 65.536.
A partir da versão 6.5, você pode compilar seletivamente APIs de serviço do Google Play em seu aplicativo. Por exemplo, para incluir apenas as APIs do Google Fit e Android Wear, substitua a seguinte linha no arquivo build.gradle:
com estas linhas:
para mais referências, você pode clicar aqui
fonte
Use o proguard para iluminar seu apk, pois os métodos que não são usados não estarão em sua construção final. Verifique novamente se você tem o seguinte em seu arquivo de configuração do proguard para usar o proguard com goiaba (minhas desculpas se você já tiver isso, não era conhecido no momento da escrita):
Além disso, se você estiver usando o ActionbarSherlock, mudar para a biblioteca de suporte appcompat v7 também reduzirá muito a contagem de métodos (com base na experiência pessoal). As instruções estão localizadas:
fonte
Warning: butterknife.internal.ButterKnifeProcessor: can't find superclass or interface javax.annotation.processing.AbstractProcessor
durante a corrida./gradlew :myapp:proguardDevDebug
Você pode usar Jar Jar Links para reduzir enormes bibliotecas externas como o Google Play Services (métodos de 16K!)
No seu caso, você apenas copiará tudo do jar do Google Play Services, exceto
common
internal
edrive
subpacotes.fonte
Para usuários do Eclipse que não usam o Gradle, existem ferramentas que quebram o jar do Google Play Services e o reconstroem apenas com as partes que você deseja.
Eu uso strip_play_services.sh de dextorer .
Pode ser difícil saber exatamente quais serviços incluir porque existem algumas dependências internas, mas você pode começar pequeno e adicionar algo à configuração se descobrir que algo necessário está faltando.
fonte
Acho que, a longo prazo, quebrar seu aplicativo em dex múltiplo seria a melhor maneira.
fonte
O suporte a Multi-dex
seráa solução oficial para este problema. Veja minha resposta aqui para os detalhes.fonte
Se não usar multidex, o que torna o processo de construção muito lento. Você pode fazer o seguinte. Como yahska mencionou, use uma biblioteca de serviço específica do Google Play. Na maioria dos casos, apenas isso é necessário.
Aqui estão todos os pacotes disponíveis Compilando APIs seletivamente em seu executável
Se isso não for suficiente, você pode usar o script do Gradle. Coloque este código no arquivo 'strip_play_services.gradle'
}
Em seguida, aplique este script em seu build.gradle, como este
fonte
Se estiver usando o Google Play Services, você deve saber que ele adiciona mais de 20k métodos. Como já mencionado, o Android Studio tem a opção de inclusão modular de serviços específicos, mas os usuários presos ao Eclipse precisam assumir a modularização em suas próprias mãos :(
Felizmente, existe um script de shell que torna o trabalho bastante fácil. Basta extrair para o diretório jar do google play services, editar o arquivo .conf fornecido conforme necessário e executar o script de shell.
Um exemplo de seu uso está aqui .
fonte
Como ele disse, substituí
compile 'com.google.android.gms:play-services:9.0.0'
apenas pelas bibliotecas de que precisava e funcionou.fonte