Как избежать ограничения метода 65k при использовании сервисов Google Play

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

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

Ответ 1

Самым большим изменением для разработчиков, которые пришли с 6.5 выпуском сервисов Google Play, вероятно, было управление Granular Dependency Management. 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.

Ответ 2

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

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

  • Загрузить jarjar ЗДЕСЬ

  • Создать новый файл-вызов 'services.rules'

  • отредактируйте его, как следует

сохранить 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 process services.rules google-play-services.jar google-lean.jar

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

использовать его instaed из google-play-services.jar и dex через 56k.

Здесь есть .jar, который был худым уже как упоминалось выше.

Ответ 3

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

выполните следующие действия.

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

1 - прежде всего вам нужна студия Android для загрузки ваших зависимостей вы можете скачать его здесь

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

стыковые услуги базы плей-сервис-карты

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

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

5- копировать res и манифест из play-services-base в ваш проект

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

7- добавьте эту банку для создания путей, затем щелкните правой кнопкой мыши по проекту/свойствам/пути сборки java/порядок и вкладку экспорта проверьте добавленную банку

8 - щелкните правой кнопкой мыши по проекту/свойствам/android/check - это lib

9 - выполните те же действия для игровых сервисов-карт

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