AS3.0 と AS2.3をスイッチコンパチで試せる環境を作る
はじめに
AS3.0-Beta 以降古いプロジェクトは、AS2.3で動かさざるをえない状況ですごいストレスなんですが
G様が過去互換対応してくれることを祈りつつ、どちらでもすぐ試せる環境を作っておく*1
動作環境
現状のAS3.0 Beta以降の問題点
Google APIsをつかったプロジェクト
local.aarをつかったProjectは動かせない
- issueにあがっているので、コチラは多分治るんではないかと
- というか、library projectをつかったProjectは補完index作成が不安定になった
- 基本的にG様は社内mvnに上げる運用だとお聞きしたしな・・*2
検証状況
コマンドラインビルドベースの話
android studio 3.0 Beta2
— close_yutori (@kimukou2628) 2017年8月16日
android.enableAapt2=false
指定で
* サードパーティーUI library利用
* databinding利用
* rootのgradle pluginバージョンのみ変更
でクラッシュしなくなった
これBetaからaapt2をデフォルトに使うようになってるという話で、
aapt2に対応していない *3UIライブラリを使っている場合はoffってくださいとのことらしい
android studio 3.0 Beta2
— close_yutori (@kimukou2628) 2017年8月16日
ただaapt2 off状態だとbuild滅茶苦茶遅い
(3~5分かかる
android.enableD8=true
でも
3.0ベースにbuild.gradle書き換えたのに差し替えても対して変わらず
これ いつものG様サイトだと3倍速みたいな表記されるんだけど、環境依存なんですかね(汗
InstantRunも2秒と表示されることあるけど、実際測るともっと時間かかってるし変更を認識してくれないことが多々。
最近は下記な状況になってて、正直微妙や・・
- InstantRun offっててもbuild cacheを勝手に使ってしまい変更認識してくれない
- clean project / rebuild project=> debug実行が必須な場合が多い*4
android studio 3.0 Beta2
— close_yutori (@kimukou2628) 2017年8月16日
あれ?
先ほどの状態で、JDK8でbuildすると3割ぐらい速くなる。
そうか、gradle plugin 3.0-beta2 ってjava8で最適化されてるのか、、(というかJDK7 buildに手が入ってないだけ?
android studio 3.0 Beta2
— close_yutori (@kimukou2628) 2017年8月16日
3.0ベースbuild.gradleにすると、
GUI plugin側の補完index作成は確かに速くなる。
OpenProject時は変わらないけど。
ヤッパリimplimatationの補完index再作成してないっぽい
android studio 3.0 Beta2
— close_yutori (@kimukou2628) 2017年8月16日
ただ
android.enableAapt2=false
にすると
26.0 のsupport library使うとbuild出来ない
とか stackoverflowであったから
これも依存有?(自分は25.1.1利用
26.0.1 なら治ってる? みたいなStackOverFlowも出てたけど、、、そんなことはない感じ
android studio 3.0 Beta2
— close_yutori (@kimukou2628) 2017年8月17日
betaからlocal.aar使ってると
GUI Plugin側でAssertion Errorでるのか、、
command line上は問題ないので
GUI Plugin側で、aapt2が有効なままなのかもしれない
これはissue対応待ち。GUI Plugin側には aapt2をoffるオプション無いからなー
今回使った検証用のスイッチコンパチが出来る環境設定
毎回書き換えるのが大変なので下記の環境は作っておく
ファイル構成
build.gradle app build.gradle build30.gradle ・・3.0ベースに書き換えたもの library build.gradle settings.gradle gradle.properties
切り替え設定
- gradle.properties
#ここに記述すると GradleSync が抑えられるらしい #_compileSdkVersion=25 _compileSdkVersion=26 _buildToolsVersion=26.0.1 #_buildToolsVersion=25.0.3 _playServicesVersion=11.0.4 #_playServicesVersion=10.2.6 # 26.0 にすると3.0系だと Gradle sync failed: java.lang.AssertionError(IDE上のみ) _supportLibraryVersion=26.0.+ #_supportLibraryVersion=25.3.1 #_supportLibraryVersion=24.2.+ # === using 3.0 is disable ==== org.gradle.caching=true #android.enableBuildCache=false android.enableD8=true # G様 UIライブラリ以外を使う時はfalse android.enableAapt2=false #_JavaVersion=VERSION_1_7 _JavaVersion=VERSION_1_8 # switch plugin//★ 切り替え用 _use30File=true _use30Plugin=true
- settings.gradle
include ':app' include ':library' def props = loadProperties("$rootDir/gradle.properties") println "_use30File="+props._use30File if(props._use30File == 'true'){ setBuildFileName(rootProject) }else{ println "[buildFile(any)]build.gradle" } def setBuildFileName(project) { String myFileName="build30.gradle" project.children.each { childProject -> //childProject.buildFileName = "${childProject.name}.gradle" def fullPath = "${childProject.projectDir}/${myFileName}" if(new File(fullPath).exists()){ childProject.buildFileName = myFileName } assert childProject.projectDir.isDirectory() assert childProject.buildFile.isFile() println "[buildFile(${childProject.name})]"+ childProject.buildFileName } } def loadProperties(filename) { def props = new Properties() file(filename).withInputStream { props.load(it) } return props }
settings.gradle のタイミングだと gradle.propertiesは読み込まれていないので、変数として認識できないので直読みする
また、root/build.gradle の buildScript も同じ形になります
DSL記述変更により一部修正が必要な箇所
gradle 2.3とコンパチで動かす記述
- app/build.gradle
android { applicationVariants.each { variant -> if (variant.buildType.name.equals("release")) { // releaseビルドのみ、ファイル名にVesionNameとビルド時間を付与 variant.outputs.each { output -> //★ if (output.outputFile != null && output.outputFile.name.endsWith('.apk')) { def versionName = variant.versionName def date = new java.text.SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()) def newName = "apk_v${versionName}_${date}.apk" //=== 修正 ==== if (output. hasProperty('outputFileName')) { output.outputFileName = newName } else{ output.outputFile = new File(output.outputFile.parent, newName) } } } } } }
ちなみに★はallである必要はない。eachで問題なく動きます
gradle.propertiesの変数で切り替えている所
- rootの部分も書き換えできたので記述修正
- root/build.gradle
buildscript { repositories { jcenter() google() } dependencies { if(project.hasProperty('_use30Plugin') && _use30Plugin == 'true'){ classpath 'com.android.tools.build:gradle:3.0.+' } else{ classpath 'com.android.tools.build:gradle:2.3.+' }
- app/build.gradle
android { if( _compileSdkVersion.isNumber()){ compileSdkVersion _compileSdkVersion as int } else{ compileSdkVersion "$_compileSdkVersion" } buildToolsVersion "$_buildToolsVersion" //javaのコンパイラの設定 compileOptions { encoding "UTF-8" sourceCompatibility _JavaVersion as org.gradle.api.JavaVersion targetCompatibility _JavaVersion as org.gradle.api.JavaVersion } }
plugin変更による記述差分
一応コマンドラインベースでは変更しなくても問題なく動きますが、、
AS3.0化はどちらかと言うと補完index作成の時間を抑制するのが目的みたい
- app/build.gradle
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) testCompile 'junit:junit:4.12' compile "com.android.support:appcompat-v7:$_supportLibraryVersion" compile "com.android.support:design:$_supportLibraryVersion" compile "com.android.support:recyclerview-v7:$_supportLibraryVersion" compile "com.android.support:cardview-v7:$_supportLibraryVersion" }
- app/build30.gradle
dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) testImplementation 'junit:junit:4.12' implementation "com.android.support:appcompat-v7:$_supportLibraryVersion" implementation "com.android.support:design:$_supportLibraryVersion" implementation "com.android.support:recyclerview-v7:$_supportLibraryVersion" implementation "com.android.support:cardview-v7:$_supportLibraryVersion" }
fkmさんが色んな所で公演されているように、G様ライブラリだけで固めれば
compile => implementation 書き換えでだいたい問題なくイケる
TLメモ
マジかよ
— びな😂 (@bina1204) 2017年8月16日
Currently, data binding does not work for non-base feature modules.
Please, move data binding code to the base feature module.
はい。data-binding がちゃんと動かない(正確にはbuildが不安定)のは実は認識してました。
kapt経由だと実は動くらしいんだけど、G様開発陣が既に kotlinしかつかってないから気づかない
ってことなのかなーとか思いつつ
Android Studio 3.0 Beta 2 に上げたらこれだもんな。リリース前に上げた俺が悪い https://t.co/fEhfnzxfxe
— びな😂 (@bina1204) 2017年8月16日
TLメモ(補完index作成に関するメモ)
それ、build cacheが悪さしてると思う。
— close_yutori (@kimukou2628) 2017年8月18日
android.enableBuildCache=false
AS2.3.3 は高速化?の為に3.0のバックポートあてられてるようで instant run使わなくても build cacheつかう。
@serenegiantこれ途中書換の変更だと認識しないので gradlew deamon --stop 必要。あとorg.gradle.caching=trueの挙動も正直微妙ですね(おかしくなったらstopする運用中
その場合は、
— close_yutori (@kimukou2628) 2017年8月18日
AS自体かキャッシュ持ってるので
invalidated restart 必要かな~(^^;;
<自分も再立ち上げで10分無駄にする
因みにAS3.0 betaは local.aarを推奨のimport形式でも認識しなくてissue中
@kimukou2628 AS自体は立ち上げ直さなくても強硬手段シェルスクリプトを走らせてプロジェクトを一旦閉じてから開くとだいたい直ります?cleanBuildCache cleanしてさらにプロジェクト下に存在する全てのbui… URL
@kimukou2628 ちなみにモジュールが10数個入っているプロジェクトを3つ同時に開いた状態でASを立ち上げ直す(プロジェクトを3つ同時に読み込む)と大体1分でインデックスの確認まで終わります。基本的人権強し(*ノω・*)テヘ
syncすると足りない依存ライブラリは読み直しです😅ネットの速度も基本的人権かなぁ😃実際は.idea/libraries下を丸ごと消去しなくてもおかしくなってるライブラリのxmlだけでいいはずなんですが面倒なのでまるっと😜そこを消してもだめなときはキャッシュの実態も抹殺します☠️
— さきちゃんの中の人、冬眠準備中😭 (@serenegiant) 2017年8月18日