IntelliJ IDEA 2017.1 で Android の開発ができるか?の試行
随時追記予定
- はじめに
- 試行状況
- IDEA固有のお話
- IDEA側でできないこと書き出しメモ
- ProjectViewのAndroid View
- Project Structure情報 & GradleSync
- build clean メニューがない
- Gradle Consoleがない
- InstantRunのHotSwapが使えない
- 複雑なdata-bindingがリアルタイムに認識しない
- layoutPreview で エラーが出た時プレビュー画面が埋まってウザい
- Gradle Syncが押せなくなる時がある(表示は出ているけどリンクが押せない)
- ConstraintLayout 変換メニューが出ない
- ConstraintLayout をつかうとlayout.xmlでスタイルが見えないエラー
- ConstraintLayout をつかうとlayout.xmlで補完が効かない
- 追記状況(Android gradle plugin 3.0対応?)
- IDEAのgradle plugin自体の仕様変更
はじめに
IntelliJ IDEA 2017.1
— close_yutori (@kimukou2628) 2017年4月12日
とりあえず確認した所、やはり Android Studio 2.2.3 相当(InstantRun ColdSwap も可)であることは確認できた。
こっちのほうが軽いのでとりあえずこれで作業を進めよう
で 一応 AS2.2.+ ベースなのを確認したので、どうしたらうまくいくのかを試してみた
試行状況
表面的な差分
色んなショートカットやボタンがない*1
- ココらへんは自分で色々と環境設定やらんと駄目な話がStackOverFlowにでてくる
- :app:generateDebugSources 等がgradle syncの代わりになる? みたいな記載だったけど,うーん?
- ideaコマンドをG様が公開してくれれば解決の話なんだけど
ProjectのViewに Android等 の専用Viewがない
- main/debug のソースが両方見れたりとかはできない
ProfilerのViewとかない
- 自分は使っていないので必要性は感じられないんだけど・・・
- AS2.4pからはmemory viewとかついかされてるけど、こっちは益々使わないな・・
所感的な感じだと、下記なイメージ
動けば確かに、、。
— close_yutori (@kimukou2628) 2017年4月13日
IDEA内向けのAndroid機能の逆輸入移植がイマイチなんですよね~(^^;;
まあG様が情報共有してないだけかもしれませんが。
<Asの古いアーカイブズG様に全削されたので、仕方なしにコッチ使ってます(AS2.2.+ベースなので
.iml/.ideaを消してimport (NGパターン)
この状態だと
- debugフォルダの構成を認識しない
- debugとかのbuildType ってG様独自拡張なのか??
- maven projectと互換のように mainフォルダのみ認識
ココらへん調べた感じだと
うまくいった操作ルート(OKパターン)
- .iml/.ideaをけす
- AS2.3 で一旦Open Project してプロジェクト情報を作成する
- AS2.3 を終了
- IDEA 2017.1 で対象プロジェクトを OpenProject する
- Android Projectとして認識される
ぶっちゃけ、AS用のIDEAタスクがかければイイんでしょうけどね。。ココらへん非公開ですおし・・・。
動作的な差分
ただ何故かこの環境で gradle plugin だけ 2.3.+ にしても全然軽いままなんだよなー
のAuto ImportがOFF の状態だからのよう
- ASの場合は、
- このメニューが消されていて内部で自動ONにされている
から上記の記事で指摘されている状態になる
それ+、OpenProject時/ビルド時 に毎回補完index作り直しているからすごく重い・・*3
IDEAはそんなこと無いから一瞬で開く状態だったりも・・。
これから考察されること
- ようは
- 無駄にASは編集ファイル等を監視しているのもあるから下記の挙動なんだよなーと
- 補完でるまで10秒以上かかる
- カーソル移動するだけで移動カーソルがカクカク挙動
- IDEAは、毎回それがないから補完もサクサク動くと
- たぶんこれが通常のIDEA側に期待されている動き
- ASはDE的に製品アプリが納品されている認識ではなくて、デモ宣伝用プロパガンダ用検証アプリ使わされている感じかな
- 無駄にASは編集ファイル等を監視しているのもあるから下記の挙動なんだよなーと
ココらへんの話にも絡んでくる話ですけど・・
.ideaとかにlibraryのjarのフルパスが書かれてしまうからですよね~(^^;;
— close_yutori (@kimukou2628) 2017年4月13日
最近は、環境変数(pluginやIDE定義のグローバル変数)っぼいのに置き換わってるのでcomitしてももんだいないですが、、
ASに関していえば、OpenProjectする/buildしなおす度に毎回作り直す?作りなのでcomit要らないかと(だから毎回補完index再作成してる)。
— close_yutori (@kimukou2628) 2017年4月13日
他のWebプロジェクトとかはideaコマンドで作ってから開くだけなのにな~(遠い目
IDEA固有のお話
今回新規にIDEAを導入する場合に作業すること
ProjectDefaultのProjectStructure
Configure > ProjectDefault > ProjectStructure
で、JDK,ANDROID_SDKのルートパスを [+]で登録して
で、選択させて Applyをする
キー操作の干渉
ideaVimが標準にONでなっていて、Shift+Cが封じられていてハマった><
- Setting(or Project) >Plugin> ideaVim のチェックを外す
sdk updateができない
android sdk の toolsを古い tools.zipに差し替える
コマンドライン ツールのみ入手する の箇所
現在の時点ではまだ、ASの公式サイトからtools.zipはDownload可能
- ただ、古い方のやつだと
- 新しい更新URLが追加されていない
- だから新しい物が落ちてこない
というG様強制アップデート時のURL差し替え対応しているので、手動で追加する必要はあるかも
Databaseアクセス機能(IDEA Ultimate 固有 Plugin)
- databaseTool pluginを SQLiteに対応した形
- 挙動的には
- run-asしてpull
- 操作後pushでもどす
したがって、
- 6系端末で結構多い*5 run-asできない端末には使えない
結局のところ
の対応をしたほうがベター
- ApplicationPrefixとか付けていると使えない*6
IDEA側でできないこと書き出しメモ
ProjectViewのAndroid View
IDEA側には標準で用意されていない
対策
Scopes で自前で作る*7
変更前 | 変更後 |
---|---|
![]() |
![]() |
Project Structure情報 & GradleSync
- .idea/.iml が AS2.3 と IDEA 2017.1 で形式に差分が有る
手動Syncが gradle taskのrefreshボタンでできる? との記載が、上記のimai先生のブログにあったが
- 現在はこれトリガーで Project Structureの再構成 までは動いていない感じ
対策
build.gradle を弄って Gradle SyncしましょうTopリンクを出すしか無い
build clean メニューがない
ASはよくAPT変換がおかしくなる*9ため、cleanビルドを結構しますが
結構感覚が麻痺していますが、
通常のjavaプロジェクトでそういうことはありえないのでそもそもそのメニューがない
対策
terminal窓で下記コマンドを実行
gradlew clean
Gradle Consoleがない
data-bindingでエラーが出た時に多分困ると思われる
MessageタブにはAPT生成エラーしか表示されないため
対策
現状は対処方法不明・・
terminal窓で下記のコマンドを入力
gradlew assembleDebug
手動ビルドして、System.outのエラー行を特定するしか無いかも*10
InstantRunのHotSwapが使えない
AS2.3からの機能なので現象仕方ないかも。
AS2.2系はColdSwap*11
必ずアプリは再起動される作りになる
複雑なdata-bindingがリアルタイムに認識しない
- includeしているレイアウトのid参照とかがだめ・・・
- レイアウト編集時にリアルタイムにindex作り直していないからかもしれないけど*12
- 直下のレイアウトのidとかは問題なく認識するんですが・・
exception-think.hatenablog.com
対策
手動 Gradle Sync 経由で更新させて 認識させる
layoutPreview で エラーが出た時プレビュー画面が埋まってウザい
AS 2.2.2 が現状逆移植されているそうなので、
AS2.3から、エラーの表示部が画面下端に固定化されている作りでしたね・・(遠い目
対策として
頑張ってエラー原因を消すしか無い
FragmentのlayoutPreviewエラー
G様標準で用意されていない場合、自分でからレイアウトを用意して、tools:layoutで指定
確かに SupportMapFragment のlayoutPreview参照エラー消えたけど正直ひどいな。こういう画像って標準で用意してくれないもんかしら・・ https://t.co/RvWayenAeB #map #layout #android #Google
— close_yutori (@kimukou2628) 2017年4月14日
サードパーティViewでエラーになる場合
とか導入した場合
- res/values/theme.xml
<resources> <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <!-- //使うカスタムViewのstyleをAppThemeに登録 --> <item name="spbStyle">@style/SmoothProgressBar</item> <item name="cpbStyle">@style/CircularProgressBar</item> </style> </resources>
AppTheme(AppCompat)の詳細は下記参照。
自分で書いたカスタムViewの場合
上記の記事のように isInEditMode() == trueの時に
onDraw等でダミーデータ等で表示するようにすれば layoutPreviewでもちゃんと表示されるようになるらしい(hellocharts-library とかでやってる
Gradle Syncが押せなくなる時がある(表示は出ているけどリンクが押せない)
ライブラリ追加/更新直後にたまに発生
対策
IDEA自体を Invalidate & Restart で再起動
ConstraintLayout 変換メニューが出ない
AS2.3からの機能なので保留
ConstraintLayout をつかうとlayout.xmlでスタイルが見えないエラー
対策
RelativeLayoutとかLinerLayout等では問題ないので(android.jar標準)、標準でない弱みなのかな?
IDEA自体を Invalidate & Restart で再起動
ConstraintLayout をつかうとlayout.xmlで補完が効かない
対策1
jps -v gradlew --status
で daemonが複数立ち上がっていないか、変なjavaタスクが残っていないか確認
これで改善されない場合は、対策2へ
対策2
AS2.3に戻る。
ただ挙動を見ていると、GUIモードでパーツ動かすたびに Index作成をぐるぐる回しているみたい
なのでこれG様的にかなり頑張っちゃってるから一押しなんじゃないかと思われ*13
追記状況(Android gradle plugin 3.0対応?)
modelを操作すればIntelliJ IDEAでもGradle Plugin 3.0を使えそう。 / https://t.co/Es87LnE0at
— Takahiro Yoshimura (@alterakey) 2017年8月19日
情報ありがとうございますmm
— Takahiro Yoshimura (@alterakey) 2017年8月21日
確かに.. 情報ありがとうございます。このところidea 2017.1〜2.2でAndroidの開発をやっているのですが、若干の違和感はありますね... 全体的にASからideaへのフィードバックが遅いような印象を受けています ;)
— Takahiro Yoshimura (@alterakey) 2017年8月21日
- gradle.propties
android.injected.build.model.only.versioned=3 android.injected.testOnly=false //★
って変数ですね。これ builder-model-3.0.0-beta2.jar の中のAndroidProjectクラスに定義されている変数なのですが
GUI側のandroid pluginの方もそれを一部参照しているという流れ
因みに、自分の環境だと★も引っかかりました(AS3.0-Beta2時点)
testフラグが立ってしまい、apk転送不可。*14
AS3.0-Beta3で治ったようですが・・・。状態がコロコロ変わるのでよくわかんないですね(汗
IDEAのgradle plugin自体の仕様変更
— KOMIYA Atsushi (@komiya_atsushi) 2017年8月25日
IntelliJ 数年前(gradleに本格対応する前)はoutがデフォルトの出力ディレクトリーだったような…
— Shinya Mochida@型 (@mike_neck) 2017年8月25日
IntelliJ 2017.2で gradle のサポートするエンジンが変わったっぽくて、僕も2週間前くらいに同じような状況になりました。
— Shinya Mochida@型 (@mike_neck) 2017年8月25日
*1:GradleSyncボタンとか
*2:専用の.iml/.ideaファイル を作成するみたい。通常の.ideaプロジェクトとは別
*3:これgradleタスクでやればいいと思うのに、中途半端にIDE側で頑張っちゃっていると推察
*4:汎用IDEダカラ仕方ないかな・・PyCharmとかもPython特化だからPythonのパス自動認識とかする感じでしたし・・
*5:というか殆ど??
*6:選択肢がパッケージpulldownなので・・
*7:ただこの情報 AS2.3にはもっていけないかも・・。AS2.4なら可能ですが
*8:まあASのときは暗黙に書き換えられていた経緯があるが・・
*9:失敗しやすい
*10:GradleConsoleで表示しているものもほぼ同じものだと思いますが・・
*11:端末内で差分ビルドキャッシュ結合=>1apkにして転送する
*12:その分編集がめちゃ軽いが・・
*14:adb install -t で入るらしいですね