GooglePlayService(LibraryProject)のMultiDex対策メモ
ローカルでRoboSpock/テストライブラリ 辺りを試そうかなとおもったら
- 容易にMultiDexが必要になる*1
- testComple時のDex処理がクソ時間かかる
なのでなんでか調べてみたら、
ADT開発環境と共用しているGooglePlayService(以下GPSと略)のLibraryProjectの関数数の問題
ここらへんはQitta辺り見ても同じ話になっているようで
- robospockに関する4件の投稿 - Qiita の話が参考になる
> 現在の仕事場の開発環境
- 地図とか表示しないなら基本Push通知しか使わないよなー
というのが結構定番な使われ方だったりする
試した方法1)
Qittaとかによく出てくる方法
上記サイトにリンクが有る記載元gistの方はだいぶ変更されていて
LibraryProjectとして導入されている場合は既に動かせない*2
- strip_play_services.gradle
afterEvaluate { project -> android.applicationVariants.each { variant -> variant.javaCompile.dependsOn stripPlayServices } } task stripPlayServices << { // def playServiceRootFolder = new File(rootProject.buildDir, "intermediates/exploded-aar/com.google.android.gms/play-services/") def playServiceRootFolder = new File(rootProject.buildDir, "intermediates/exploded-aar/XXXX/unspecified")//☆環境確認の上修正 playServiceRootFolder.list().each { versionName -> def versionFolder = new File(playServiceRootFolder, versionName) //TODO: classes.jarがないフォルダで作業するとエラーになるのでSkipする if(!new File(versionFolder, "classes.jar").exists())return; copy { from (file(new File(versionFolder, "classes.jar"))) into (file(versionFolder)) rename { fileName -> fileName = "classes_orig.jar" } } tasks.create(name: "strip" + versionName, type: Jar) { destinationDir = versionFolder archiveName = "classes.jar" from (zipTree(new File(versionFolder, "classes_orig.jar"))) { exclude "com/google/ads/**" exclude "com/google/android/gms/analytics/**" exclude "com/google/android/gms/games/**" exclude "com/google/android/gms/plus/**" exclude "com/google/android/gms/drive/**" exclude "com/google/android/gms/ads/**" } }.execute() delete file(new File(versionFolder, "classes_orig.jar"))//☆deleteタスクが落ちるので記述修正 } }
解決した方法)
上記参照のgistのコメントにも書いてあるけど
compile ('com.google.android.gms:play-services:7.3.+') { exclude group: "com/google/ads/**" exclude group: "com/google/android/gms/ads/**" exclude group: "com/google/android/gms/analytics/**" exclude group: "com/google/android/gms/appindexing/**" exclude group: "com/google/android/gms/appinvite/**" exclude group: "com/google/android/gms/appstate/**" exclude group: "com/google/android/gms/cast/**" exclude group: "com/google/android/gms/drive/**" exclude group: "com/google/android/gms/fitness/**" exclude group: "com/google/android/gms/games/**" exclude group: "com/google/android/gms/identity/**" exclude group: "com/google/android/gms/location/**" exclude group: "com/google/android/gms/maps/**" exclude group: "com/google/android/gms/nearby/**" exclude group: "com/google/android/gms/panorama/**" exclude group: "com/google/android/gms/plus/**" exclude group: "com/google/android/gms/safetynet/**" exclude group: "com/google/android/gms/wallet/**" exclude group: "com/google/android/gms/wearable/**" }
と書いてある記述を流用して下記と書けばOK。
compile (project(':google_play_services_froyo')) { exclude group: "com/google/ads/**" exclude group: "com/google/android/gms/ads/**" exclude group: "com/google/android/gms/analytics/**" exclude group: "com/google/android/gms/appindexing/**" exclude group: "com/google/android/gms/appinvite/**" exclude group: "com/google/android/gms/appstate/**" exclude group: "com/google/android/gms/cast/**" exclude group: "com/google/android/gms/drive/**" exclude group: "com/google/android/gms/fitness/**" exclude group: "com/google/android/gms/games/**" exclude group: "com/google/android/gms/identity/**" exclude group: "com/google/android/gms/location/**" exclude group: "com/google/android/gms/maps/**" exclude group: "com/google/android/gms/nearby/**" exclude group: "com/google/android/gms/panorama/**" exclude group: "com/google/android/gms/plus/**" exclude group: "com/google/android/gms/safetynet/**" exclude group: "com/google/android/gms/wallet/**" exclude group: "com/google/android/gms/wearable/**" }
ビルドの高速化も考えるなら
- build.gradle
ext.findFirstFile = {rootDir,filter -> println "rootDir=$rootDir" println "filter=$filter" if(rootDir==null || !rootDir.exists()){ return null } File result rootDir.traverse( type : groovy.io.FileType.FILES, nameFilter : filter ) { it -> //println it result = it groovy.io.FileVisitResult.TERMINATE } result } def aarDir = new File(project(':google_play_services_froyo').buildDir,"outputs/aar") def hit_f = false if(ndFirstFile(aarDir, ~/.*\.aar/)!=null){ hit_f = true repositories{ flatDir{ dirs aarDir } } } dependencies { // ==省略== if (hit_f) { println "==== aar reference ====" releaseCompile(name:'google_play_services_froyo-release', ext:'aar') debugCompile(name:'google_play_services_froyo-debug', ext:'aar') } else { println "==== library project ====" compile (project(':google_play_services_froyo')) { exclude group: "com/google/ads/**" exclude group: "com/google/android/gms/ads/**" exclude group: "com/google/android/gms/analytics/**" exclude group: "com/google/android/gms/appindexing/**" exclude group: "com/google/android/gms/appinvite/**" exclude group: "com/google/android/gms/appstate/**" exclude group: "com/google/android/gms/cast/**" exclude group: "com/google/android/gms/drive/**" exclude group: "com/google/android/gms/fitness/**" exclude group: "com/google/android/gms/games/**" exclude group: "com/google/android/gms/identity/**" exclude group: "com/google/android/gms/location/**" exclude group: "com/google/android/gms/maps/**" exclude group: "com/google/android/gms/nearby/**" exclude group: "com/google/android/gms/panorama/**" exclude group: "com/google/android/gms/plus/**" exclude group: "com/google/android/gms/safetynet/**" exclude group: "com/google/android/gms/wallet/**" exclude group: "com/google/android/gms/wearable/**" } } }
- settings.gradle
include ':google_play_services_froyo' project(':google_play_services_froyo').projectDir = new File(settingsDir,'../google_play_services_lib')