茨の道だよ Android Studio 2.2.2
- suppot-library 24.1.X => 25.0.0 にあげたキッカケ
- アプデ時に対面しなければいけない問題
- AS2.2.2で変わった処
- 動かなくなった plugin
- あいかわらず変わってない(修正されていない)処
suppot-library 24.1.X => 25.0.0 にあげたキッカケ
を将来的に使うかもというお話の元、APIレベルを上げたわけですが*1
よくわからんエラーが結構出ててビルドエラー潰すのに時間かかりました。。。
まあそれ+今まで避けてきたManifestMarger地獄に対面しなきゃいけないわけですし・・
リリース状況
結構ズタボロっぽい。うーん。G様内部でも混乱してるんですかね。。
なんかGoogleさんAndroid周り最近ヤバイんじゃないの?API25のSDK(Android 7.1)をdeveloper previewとしてリリースって言ってるのにリポジトリではrelease licenseでリリースしてるし(続く)
— りんね (@rin_ne) 2016年10月24日
ブログのリリースでAOSPには12月頃って言ってたのにmanifestにAndroid7.1のリリースブランチもうあるし、さらにそれをsyncするとSHA1 missingで失敗するって言うし。リリースする部署が入れ替わったかなにかしたんだろか?
— りんね (@rin_ne) 2016年10月24日
Android Studioの開発サイトではCanary、Dev、Beta、Stableとチャネルを設けてるのに、2.2くらいから全く機能していないな。段階を踏むことなくいきなり公開しちゃってる感じだし。
— けいちゃ (@keicha_hrs) 2016年10月24日
今現在はDev、Beta、Stableに2.2.2があって、Canaryに2.2.1があるとか、訳わからんことになってるしw
— けいちゃ (@keicha_hrs) 2016年10月24日
でもまあ、大半のTwのつぶやきとか見てると
AS 2.2.2 リリースすげー
が多いんですが、これRTしてる人って実際触ってるんでしょうか?
上げたあとから困ってること
ASのlaunch画面が立ち上がるのに数分かかるようになった。
起動クリックしてから、まじでお茶が飲める状況。。。
- AS 2.2.1 まで効いてた Invalidate Cashe 等も効かない
- launcher画面が立ち上がるだけで CPU400% & 数分 とかいくので訳わからん*3
詳細ログが大量に出過ぎてわからない
- G様がデバック版リリースしているような感じ
- ちょっと動かす度に大量にログが出るようになった
- 特にエラーが発生したときに追うのが大変
target sdk 上げた段階でまず引っかかるのがここら辺なんだよな。。
— close_yutori (@kimukou2628) 2016年10月30日
release note どのversionを使っているか記載ないですし https://t.co/IAyq88vhg5バージョン指定できたのか!少し前にProguardのバグ踏んで最適化無効にしたんだよな... AndroidのGradleビルドでProguardのバージョンを指定する方法 by @kakajika200x on @Qiita https://t.co/YAME9yXawG
— ちばっちんぐ (@chibatching) 2016年10月28日
実は同じ奴はまりまして、1日悩んでました。
というかtarget-25辺りに環境更新しただけで
progardが大量にwarning吐いてrelease buildが通らなくなってパニクりました。
gradlew assembleRelease >log
で log(テキストファイル)にリダイレクトして、
余計なsystem.out消して、対象の箇所を絞り込みましたが
それ以外の詳細ログが大量に出て追いきれませんがな><
アプデ時に対面しなければいけない問題
manifest-merger
を熟読しろと言うことらしいんだが。。
SuppressWarnigとかも相変わらず補完は効かないし・・・*4
下手するとSublimeTextの方が補完効いてサクサクみたいな時代錯誤状態になっていたりする。。
data-binding関連
gradleのsystem.outを拾えるようにする
たしかにこれは、APTやdata-bindingを使う場合は必須。- 通常だと変換エラー とか Build Failed しかでないんだもんな。。
- => あんまり効果なかった
- terminal窓から gradlew assembleDebugを素直にやり直してます><
ただこれやると下記の記述を追記したときと同じように、warnigがエラー扱いになる。
場合によってはビルドがエラーになる諸刃の剣ではあるかも。。
- root/build.gradle
allprojects { //-XlintのワーニングをASのMessageタブに表示させる gradle.projectsEvaluated { tasks.withType(JavaCompile) { options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" } } }
を設定したときと同じ状況になる*5
APT-pluginの使用をやめる(annotationProcessor 記述に変更)
というか、data-bindingの内部でAPT使ってるからですよね。前からversion不一致でエラー出てたから内部のDSL指定使えってことだと https://t.co/ket1rT7Qlv
— close_yutori (@kimukou2628) 2016年10月30日
aptプラグインはもうオワコンだぞhttps://t.co/PV9dA79LB7
— fkm (@fkm) 2016年10月29日
- build.gradle
android { ... defaultConfig { ... javaCompileOptions { annotationProcessorOptions { className 'com.example.MyProcessor' // Arguments are optional. arguments = [ foo : 'bar' ] } } } ... } dependencies { compile 'com.google.dagger:dagger:2.0' annotationProcessor 'com.google.dagger:dagger-compiler:2.0' //debugAnnotationProcessor 'com.google.dagger:dagger-compiler:2.0' }
で、これどこにドキュメント書いてるかとNewBuildSystemのサイト検索してみたら
Jackのページにちょろっと書いてるだけなんですよね。。
fkmさんよく気づいたよな。。と
Experimental New Android Tool Chain - Jack and Jill - Android Studio Project Site
AS2.2.2で変わった処
data-bindingで補完が多少効くようになった?
layout.xml上で bindしている publicな変数に関しては補完対象になったみたい。
ただ、
- layout.xmlを編集した場合、
- 1回目はdata-binding関係の変換エラーでビルドがコケるようになったかなー。
- 再ビルドすると解決
ココらへんの解決策って、stackoverflowによると
等に変更すると挙動が安定するとのこと
ようは、gradle の mustRunAfter を指定しない場合と同じく
abc順に処理されるから、binding対象のxmlの発見ヒット率が上がるのでビルドが成功しやすいですよ
とかいう話。
挙動が変化した処
- 下記記述の共存が不可になった
- setContentView(R.layout.actitvity_main)
- DataBindingUtils.setContentView(R.layout.actitvity_main)
その代わり、DataBindingUtils.setContentView さえすれば
通常通り下記は使える形。*6
findViewById(R.id.hoge)
補完の記述のところでも書いたけど、
anotation指定をすれば、ちゃんと抽出されるButterKifeの方がよかったな~
と思う面もありつつ、他のライブラリを入れると
ビルドが通らなくなる危険性が高いので、標準使いつつな状況があったりもしつつ。。
ただ補完を効かせるためには?
- 自動インポート
- Editor > Auto Import > Optimize import on the fly
- Editor > Auto Import > Add unambiguous on the fly
- Compiler
- Make Project Auto
- Sync Project with Gradle before building
あたりを有効にする富豪環境にしないとだめ。
そもそも Cmd+Enter による補完が 2.2.X系 になって上手く動かなくなったので*9
多分ココらへんテストしてないんだろうな・・*10
ただこの場合
ManifestMargerが結構うるさくなった
build tool 25に変更してAAPTが変更されたからだと思われ
- app/AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="hoge.fuga.test"> <uses-sdk android:targetSdkVersion="24" android:minSdkVersion="9" tools:overrideLibrary="hoge.fuga.libP"/> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" tools:node=”replace” tools:replace="android:label, android:icon, android:theme"/>
あたりは必須ですが
aar形式でないlibrary projectが有る場合
- libP/AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="hoge.fuga.libP"> <uses-sdk android:targetSdkVersion="24" android:minSdkVersion="14"/> <application tools:ignore="all" //★ />
- ★は実際は、"“と書いてから Cmd(Alt)+Enter AS上の補完で最適なものに補完されるかと思う
- 上記の場合は “UnusedAttlibute” と補完された
ようは override先のlibP/AndroidManifest.xmlのほうに、replace対象のタグとか無い or 違うものが指定されている とエラーにされるわけで
android gradle plugin 2.2.X で manifestMargerを無効化できない今、超面倒くさいです。
因みに
というわけのわかんない挙動をするので
でlibP側の 上記のタグを消したりすると => 上書きするタグがないよエラー
が解決策みたいな奴になる。
でもこれaarにするとこのチェック誓約が外れるので、G様的には カスタムlibrary Projectは使わせたくないのかもしれない・・
因みに AS 2.2.1 では
GUI上で build > make module が出来ませんでした。2.2.2 では治ったけど・・
InstantRunあたりの変更とバッティングしていたんでしょうね。
APT絡みも不安定でしたし・・。だから AS 2.2.2 が結構早めにリリースされたのかな? と
G様的推奨オペレーションとしては
まあtools:ignore やSupplessWarningsとかは
Android・レイアウトXMLのTools属性について | ギャップロ
読むと
この状態でAndroid Studioのメニューの Analyze> Inspect Code… から レイアウトXMLファイルをチェックします。 対象のエラーを選択した状態で右クリックして Suppress with @SuppressLint(Java) or tools:ignore(XML) を選択する 自動的にtools:ignoreへ値が設定されます
基本AS任せにしましょうというお話らしいんですけど
ただココらへん適応すると、変にソースがフォーマット整形されるんですよね*12
動かなくなった plugin
2.2.X から動かせていないかなーと(汗
自分なりの使い回しが出来るライブラリを作ろうとすると、普通
- カスタムlibrary projectを作成する
- dependency記述を 本体側/ライブラリ側 両方に書くのは嫌
- aarをfatしたい
みたいなことを思ったりするわけですが・・
ANDROID_HOME/extras/android/m2repository/com/android/support/support-v4/24.2.1
とかみても下記にしか依存関係は書いていないわけで。。。
support-v4-24.2.1.pom
なんか凄く面倒くさい。
でもManifestMarger とかの変更は激しいから追随していくのは難しいだろうなと
まあ考えてみれば、現在
- AS上で 外部libraryの中身を見る
- libsにいれているjarのみ見れる
とか出来ないわけだしな。。
完全補完頼み状態になってる。これも開発効率結構落としている気がするんだけどな*13
あいかわらず変わってない(修正されていない)処
Logcatの除外設定
アプデ時に定期的に初期化されるのは何でなんだろう?
- Edit Filter Configuration>by Log tag
^(?!.(SNFCCCS|WifiHW)).$
上記は SNFCCCSとWifiHWのタグを除外する記述
deplicated warnig等があると必ずmessage tab がフロント表示される
これ何気に邪魔な機能。
logcat/debug view で
だから快適に操作するためには message tabが強制表示されないように
warningを潰す必要があるわけで、これはこれでストレッサー。
しかも Alt+Enterで対処しようとしても SupplessWarnings 自動補完されないしね。。
毎回 hisidama先生のサイトにお世話になっています・・。
よく使うやつ(順次追記予定)
@SuppressWarning("unchecked") @SuppressWarning("deprecation")
@SuppressLint("NewApi") @SuppressLint("InlinedApi") //googleのサイトにサイトにのってたやつ @SuppressLint("ParserError") //最終手段 @SuppressLint("all")
GUIエディタのlayout.previewが相変わらずエラーが出る
@keicha_hrs これ FloatingActionButton の連動動作用かと思ってました。GUIエディタは未だ使えないかと(それ以前にlayoutプレビューエラー無がないので) https://t.co/Wh8xSY2gY6 は読んで後でためそうとか思ってたりも
— close_yutori (@kimukou2628) 2016年10月24日
これASの新規Wizで作ったレイアウト以外、エラーが出なかったこと無いんですけど。
しかもこれstyle.xmlとかlayout.xml いじりだすとエラー出るようになるので
エラーが出なくなる条件が凄く知りたいです
*1:support-libraryに上げないとエラーにするよと強制される
*2:ランチャー画面でできないものなの??
*3:ここらへんが重いとつぶやかれている原因かと
*4:かならずググりながらコード書くハメになる
*5:またログ出る分時間がかかるようになる
*6:内部でsetContentViewが行われているよう。書くとsetContentViewを二度読みするなとコンパイルエラーが出るので
*7:でもG様Wizテンプレでもこの状態。これをdata-binding化するとid抽出できないというわけわかめな状態だったりも・・
*8:でもこの頃のConstantLayoutとか使うと必然深くなる気も。。
*9:import処理含め
*10:多分富豪環境がG様が使っている環境?
*11:しないと常にマウスやキーボードが固まる状況になる。。
*12:git管理していると差分が多くて、レビューする人に怒られることも・・・
*13:しかも補完が出るのに大概カクつく