Как обойти ограничение в 65 КБ при использовании Сервисов Google Play

Если вы обнаружите, что пишете большое приложение для Android, которое зависит от множества разных библиотек (что я бы порекомендовал вместо изобретения колеса), вполне вероятно, что вы уже столкнулись с лимитом метода в 65 КБ исполняемого файла Dalvik. classes.dex, Кроме того, если вы зависите от больших библиотек, таких как SDK Google Play Services, который уже содержал более 20 000 методов в версии 5.0, вы вынуждены использовать такие приемы, как разбор пакетов или поддержка мультидекса, чтобы избежать ошибок при упаковке. С новым Android-приложением ART времени выполнения, которое общедоступно с Android Lollipop, легче обрабатывать несколько файлов dex, но в настоящее время разработчики все еще вынуждены делать подсчет методов.

Какой самый простой способ уменьшить количество методов вашего приложения при использовании Google Play Services?

3 ответа

Решение

Самым большим изменением для разработчиков, появившимся в версии 6.5 Google Services, было, вероятно, управление гранулярными зависимостями. Google удалось разделить свою библиотеку, чтобы позволить разработчикам зависеть только от определенных компонентов, которые им действительно нужны для их приложений.

Начиная с версии 6.5, разработчики больше не обязаны внедрять полную библиотеку Google Play Services в свое приложение, но могут выборочно зависеть от таких компонентов:

compile 'com.google.android.gms:play-services-fitness:6.5.+'
compile 'com.google.android.gms:play-services-wearable:6.5.+'
compile 'com.gogole.android.gms:play-services-maps:6.5.+'
...

Если вы хотите скомпилировать полную библиотеку в свое приложение, вы все равно можете сделать это:

compile 'com.google.android.gms:play-services:6.5.+'

Полный список доступных пакетов можно найти на сайте разработчиков Android.

Для тех, кто не использует Android Studio w/gradle или не хотите реализовывать ProGuard вам проект.

Можно избежать 65 тыс. При использовании google-play-services, сохранив некоторые пакеты, которые вы действительно хотите использовать, используя jarjar. Например, в моем проекте я хочу реализовать только карту Google и местоположение Google, я склоняю свой google-play-services.jar следующим образом.

  1. Скачать jarjar ЗДЕСЬ

  2. Создайте новый файл с именем 'services.rules'

  3. отредактируйте его следующим образом

держать com.google.android.gms.maps.*

сохранить com.google.android.gms.location.*

  1. Скопируйте ваш оригинальный google-play-services.jar / jarjar-1.4.jar / services.rules в ту же папку

  2. запустите командную строку и введите..

java -jar jarjar-1.4.jar процесс services.rules google-play-services.jar google-lean.jar

Вот и все, вы получите новый.jar, размер которого был значительно уменьшен (метод тоже)

используйте его вместо google-play-services.jar и dex более 56k исчезнет.

Вот.jar, который был уже худой, как упомянуто выше.

Я знаю, что этот вопрос старый, но для тех из вас, кто сталкивается с этой проблемой, работая над затмением, и не может использовать вышеуказанный ответ

пожалуйста, следуйте инструкциям

если вы не хотите загружать android studio для получения проектов lib, вы можете скачать файлы lib здесь: https://www.dropbox.com/s/1pf73czcn7pyqgi/com.google.android.gms.rar?dl=0 и перейти к шагу 4

1 - во-первых, вам все еще нужна Android Studio, чтобы загрузить свои зависимости, вы можете скачать ее здесь

https://developer.android.com/sdk/index.html

2 - затем в вашем build.gradle внутри вашего приложения добавьте следующие строки

dependencies {
    compile 'com.google.android.gms:play-services-maps:7.5.0'
//map , gcm or any specific api for a hole list visit the below link
//https://developers.google.com/android/guides/setup
}

а затем нажмите синхронизировать проект с файлом Gradle

после этого вы попадете в lib проекты

play-services-base play-services-maps

щелкните правой кнопкой мыши на них, чтобы получить их путь

4 - создать проект в eclipse, удалить файлы генерации в папке src, папке res и манифесте

5- скопируйте res и манифест из базы play-services в ваш проект

6 - скопируйте файл из play-services-base/jars в папку libs вашего проекта, обычно называемую classes.jar (переименуйте его в любое другое имя, чтобы оно не конфликтовало с другим проектом)

7 - добавьте этот jar-файл, чтобы построить пути, затем щелкните правой кнопкой мыши на project / properties / java build path / order и на вкладке экспорта проверьте добавленный jar

8 - щелкните правой кнопкой мыши на проекте / свойства / Android / проверить, является ли библиотека

9- сделать те же шаги для play-services-maps

10 - теперь вы попали в проекты lib, один называется googleBase, а другой - googleMaps (или любое другое имя)

11 - добавить их в свой проект как библиотеки

Теперь добавьте следующие строки в ваш манифест

<!-- Include required permissions for Google Maps API to run-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-feature
       android:glEsVersion="0x00020000"
       android:required="true"/> 


<meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />

<meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="" />

для полного учебника с изображениями, пожалуйста, обратитесь к ссылке ниже http://androidninja.quora.com/Prevent-65-K-Methods-Count-When-Using-Google-Lib-on-Android-with-eclipse-adt

Другие вопросы по тегам