使用Google Play服务时如何避免65k方法限制

时间:2014-12-21 12:56:56

标签: android google-play-services android-gradle dalvik dex

如果您发现自己正在编写一个依赖于许多不同库的大型Android应用程序(我建议而不是重新发明轮子),很可能您已经遇到了Dalvik可执行文件的65k method limit classes.dex。此外,如果您依赖于 Google Play Services SDK 这样的大型库,而这些库本身已包含more than 20k methods in version 5.0,则您必须use tricks like stripping packagesmultidex support以避免错误打包。 Android的新运行时ART是公开可用的,因为Android Lollipop多个dex文件更易于处理,但目前开发人员仍被迫进行方法计数。

使用Google Play服务时减少应用程序方法数量的最简单方法是什么?

3 个答案:

答案 0 :(得分:15)

6.5 release of the Google Play Services附带的开发人员的最大变化可能是粒度依赖关系管理。谷歌设法拆分了它的库,允许开发人员只依赖他们应用程序真正需要的某些组件。

自6.5版本开发人员不再被迫在他们的应用程序中实现完整的Google Play服务库,但可以选择性地依赖于这样的组件:

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.+'

可以找到on the Android Developers site的完整可用包列表。

答案 1 :(得分:4)

对于不使用Android Studio w/gradle或不想对您的项目实施ProGuard的人。

使用google-play-services时可以避免65k 通过使用jarjar保留一些你真正想要使用的包。例如,在我的项目中,我只想实现谷歌地图和谷歌地理位置,我喜欢这样的google-play-services.jar。

  1. 下载jarjar HERE

  2. 创建新文件调用'services.rules'

  3. 按照以下方式编辑

  4.   

    保留com.google.android.gms.maps。*

         

    保留com.google.android.gms.location。*

    1. 将您原来的google-play-services.jar / jarjar-1.4.jar / services.rules复制到同一个文件夹中

    2. 启动命令提示符并输入..

    3.   

      java -jar jarjar-1.4.jar process services.rules google-play-services.jar google-lean.jar

      就是这样你就会得到一个新的.jar,它的大小减少很多(方法也是如此)

      使用google-play-services.jar的instaed和超过56k的dex将消失。

      Here是.jar,就像上面提到的那样精益求精。

答案 2 :(得分:2)

我知道这个问题很老但是对于那些在eclipse上工作时遇到此问题并且无法使用上述答案的人

请按照步骤

如果您不想下载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 - 然后在app中的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文件夹和清单

从play-services-base到你的项目的复制资源和清单

6 - 将play-services-base / jars中的文件复制到项目的libs文件夹中 通常命名为classes.jar(请将其重命名为任何其他名称,以免与其他项目发生冲突)

7-添加此jar以构建路径然后右键单击project / properties / java构建路径/ order并导出选项卡检查添加的jar

8-右键单击project / properties / android / check is lib

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