如果您发现自己正在编写一个依赖于许多不同库的大型Android应用程序(我建议而不是重新发明轮子),很可能您已经遇到了Dalvik可执行文件的65k method limit classes.dex
。此外,如果您依赖于 Google Play Services SDK 这样的大型库,而这些库本身已包含more than 20k methods in version 5.0,则您必须use tricks like stripping packages或multidex support以避免错误打包。 Android的新运行时ART是公开可用的,因为Android Lollipop多个dex文件更易于处理,但目前开发人员仍被迫进行方法计数。
使用Google Play服务时减少应用程序方法数量的最简单方法是什么?
答案 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。
下载jarjar HERE
创建新文件调用'services.rules'
按照以下方式编辑
保留com.google.android.gms.maps。*
保留com.google.android.gms.location。*
将您原来的google-play-services.jar / jarjar-1.4.jar / services.rules复制到同一个文件夹中
启动命令提示符并输入..
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