ようこそ Android Studio 3.0 Canary5 のトラップ教室へ

はじめに

  • 補完index関係がバグる
  • local.aarあたりが認識しない
    • 複数人で開発してるとlocal Repoアップロード運用とかありえないかなと
    • 開発している仕事場にNWアクセスフリーな独自Repo立ち上げるのって結構面倒だったりする*1

あたりのバギーな状況だったのでcanary4にに戻しました。

一応備忘メモ

release note

  • gradle runtime 4.1-m1 対応
  • flavor DSLを変更

androidstudio.googleblog.com


動作環境

  • macOS Sierra
  • 16G
  • HDDタイプのiMac
  • AS 3.0-Canary5
    • => 不具合でCanary4に戻す
  • gradle plugin 2.3.3
  • gradle runtime-4.1-m1
    • daemonが複数立ち上がるので4.0-binに戻す

状況

これ、gradle runtime-4.1-m1 の不具合っぽい。

org.gradle.configureondemand=false

にしないとdaemonがぽこぽこ量産 => Gradle Syncが失敗

IDE <=> Daemon 一対一であることを期待されているから

ライブラリプロジェクト周りがほぼ全滅

graldew assembeDebug

はとおるのですよ・・ IDE側でindex作るコード書いているからなんでしょうかね??

すごい挙動が謎・・・

local.aarで固めるパターン

repository {
    flatDir {
        dirs "libs_aar"
    }
}

dependencies {
    compile(name: 'nend-sdk-3.2.2', ext: 'aar')
}

プロジェクトにaarをインポートするパターン

  • app/build.gradle
dependencies {
    project(":nend-sdk")
}
  • libP/build.gradle
configurations.maybeCreate("default")
artifacts.add("default", file('nend-sdk-3.2.2.aar'))

settings.gradle でフォルダ参照するパターン

  • app/build.gradle
dependencies {
    project(":nend-sdk")
}

例外っぽいやつ(対象外)

//apply plugin: 'com.android.application' とは別枠なので影響が出ないよう
apply plugin: 'com.android.instantapp'

//元々独自っぽい
wearApp project(':Wearable')

関連

既存挙動(local.aar周り)

NGパターン

★が何故かエラーになる

  • app/build.gradle
dependencies {
    compile (project(':libP')){
        exclude group: 'com.android.support'
        exclude group: 'com.google.android.gms'
        exclude group: 'hoge.fuga.maiu'  //★libP.aarパッケ時にlibs/XXX.jarで入っている
    }
}
  • libP/build.gradle
configurations.maybeCreate("default")
artifacts.add("default", file('libP.aar'))

OKパターン?

というか、これは既存のルートの処理が残っていて動いている挙動に見える

repository {
    flatDir {
        dirs "libs_aar"
    }
}

dependencies{
    compile (name: 'libP', ext: 'aar'){
        exclude group: 'com.android.support'
        exclude group: 'com.google.android.gms'
        exclude group: 'hoge.fuga.maiu'  //★libP.aarパッケ時にlibs/XXX.jarで入っている
    }
    compile group: 'hoge.fuga.maiu' //△最新のバージョンを再参照
}

単に△の最新バージョンの再設定がない場合は、下記の書き方も有り*2

ファイル除外周りの話

  • excludeはclassは除外できるけど
  • XXX.proptiesとかは無理
  • 特に重複している場合 packageOptionで頑張るのですが・・・。
android {
    // 省略
    packagingOptions {
        pickFirst 'XXX.propties'  //★
        merge   'LICENSE.txt'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/notice.txt'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/NOTICE'
    }
}

packageタスク以前でエラーになってしまうケースも有る

で、その場合jarを解凍して除くみたいな形になる

  • unzip
  • ファイル除く
  • zip <= ココでNG

  • jarからexclude指定がうまくできないのでファイル除いてリパッケするときに必須

    • (単純にunzipしてzipし直しでは駄目。Macだと変なフォルダが入って誤爆する)

http://www.ne.jp/asahi/hishidama/home/tech/java/jar.html


補完index周りの話

  • ただし除外していい対象フォルダが素人にはわからない*3
  • 除外しすぎると次回開く時に、プロジェクト情報が不正 と言われ再作成される

操作補足

  • 上記の呟きでうまくできなかったので、再検証
  • フォルダ単位の指定のみ出来る*4
  • 因みにExclude解除ができない
  • あと除外推奨フォルダ自体がよくわからないので、それ程劇的には変わらず

因みに

  • 一時的補完無視=PowerSaveモードというIDEAででいている機能を使うと
    • IDE再起動するまでそれ以降補完が効かなくなる

というG様バグが存在している・・


TLメモ

3.0ってkotlinな人のためのIDEだと思ってたんだけどな・・・(遠い目

一応 gradle plugin 3.0-X ベースでビルド通らないか

毎回最新版出る度に試して入るんですけどビルドが通らないですね・・うーん。

*1:フォルダ認証とか遣りだすと大変><

*2:単純に除くだけ

*3:下記のつぶやきはCのソースを対象外にした記載のよう

*4:IDEAだとファイル単位でもできるのですが・・・