読者です 読者をやめる 読者になる 読者になる

茨の道だよ Android Studio 2.2.2

suppot-library 24.1.X => 25.0.0 にあげたキッカケ

を将来的に使うかもというお話の元、APIレベルを上げたわけですが*1

よくわからんエラーが結構出ててビルドエラー潰すのに時間かかりました。。。

まあそれ今まで避けてきたManifestMarger地獄に対面しなきゃいけないわけですし・・

リリース状況

結構ズタボロっぽい。うーん。G様内部でも混乱してるんですかね。。

でもまあ、大半のTwのつぶやきとか見てると

AS 2.2.2 リリースすげー

が多いんですが、これRTしてる人って実際触ってるんでしょうか?

上げたあとから困ってること

ASのlaunch画面が立ち上がるのに数分かかるようになった。

起動クリックしてから、まじでお茶が飲める状況。。。

  • AS 2.2.1 まで効いてた Invalidate Cashe 等も効かない
    • これIDEのキャッシュを消すものらしいですけど、プロジェクト開いてからこの挙動するのが凄い苦痛*2
  • launcher画面が立ち上がるだけで CPU400% 数分 とかいくので訳わからん*3

詳細ログが大量に出過ぎてわからない

  • G様がデバック版リリースしているような感じ
    • ちょっと動かす度に大量にログが出るようになった
    • 特にエラーが発生したときに追うのが大変

実は同じ奴はまりまして、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 記述に変更)

  • 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によると

  • main_map_activy.xml => activity_map.xml

等に変更すると挙動が安定するとのこと

ようは、gradle の mustRunAfter を指定しない場合と同じく

abc順に処理されるから、binding対象のxmlの発見ヒット率が上がるのでビルドが成功しやすいですよ

とかいう話。

挙動が変化した処

  • 下記記述の共存が不可になった
    • setContentView(R.layout.actitvity_main)
    • DataBindingUtils.setContentView(R.layout.actitvity_main)

その代わり、DataBindingUtils.setContentView さえすれば

通常通り下記は使える形。*6

findViewById(R.id.hoge)

補完の記述のところでも書いたけど、

  • idを振っても下記の状態のときは変数抽出されない
    • include文を使っている*7
    • layoutの階層が深い場合*8 どうしても候補として抽出されない

anotation指定をすれば、ちゃんと抽出されるButterKifeの方がよかったな~

と思う面もありつつ、他のライブラリを入れると

ビルドが通らなくなる危険性が高いので、標準使いつつな状況があったりもしつつ。。

ただ補完を効かせるためには?

  • 自動インポート
    • Editor > Auto Import > Optimize import on the fly
    • Editor > Auto Import > Add unambiguous on the fly f:id:kimukou_26:20161024232842p:plain
  • Compiler
    • Make Project Auto
    • Sync Project with Gradle before building f:id:kimukou_26:20161024232854p:plain

あたりを有効にする富豪環境にしないとだめ。

そもそも Cmd+Enter による補完が 2.2.X系 になって上手く動かなくなったので*9

多分ココらへんテストしてないんだろうな・・*10

ただこの場合

  • CPUがガンガンにぶんまわるので
    • AS/java のCPU limit対策は必須 *11
  • 自動index再作成時に、入力IOが固まる

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側で同じファイル名のリソースを定義していると
    • android:label => libP側の物を使う
    • android:icon => libP側の物を使う

というわけのわかんない挙動をするので

でlibP側の 上記のタグを消したりすると => 上書きするタグがないよエラー

  • android:labelで違うものを指定
    • app側
      • android:label=“@string/app_name”
    • libP側
      • android:label=“@string/lib_name”

が解決策みたいな奴になる。

でもこれ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のみ見れる
    • IDEAがサポートしていた android maven project形式 だと外部jarは見れてた
    • aarは元々G様が自分で作った形式なんだから何とかして欲しいと思うんですけど。。

とか出来ないわけだしな。。

完全補完頼み状態になってる。これも開発効率結構落としている気がするんだけどな*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が相変わらずエラーが出る

これ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:しかも補完が出るのに大概カクつく