2016年07月19日

Android Studioを共有環境に入れよう!

ここでいう共有環境とは、以下のような特徴を持つ七面倒くさい環境を言う。
  • ユーザ個人の情報は Z ドライブにネットワークマウント( SMB で)される。数 GBくらいまで入る。
  • マシンのユーザプロファイル領域は高々数十 MB まででリミットがかかる。
  • ネットワークがプロキシ経由のみ。
  • 誰が何するか分かったものじゃない。
  • 通常利用時は、再起動すると C ドライブがロールバックする。もちろんインストール作業をする場合などはその機能を切れる。
  • ロールバックするので、ユーザプロファイルも消える。

ここまで書くとどこのことか分かるかもしれないが、まあ分かったところでさほど問題がないので気にしないことにする。
誰かが同じような環境にいないとも限らないわけで。


普通に使うと割と便利な Android Studio も、こんな環境では割と地獄になる。


普通に使おうとすると発生する問題


問題は致命的なものがいくつか発生する。一つずつ見ていこう。
  1. Android Studio の設定ファイルが C ドライブのユーザプロファイル以下に作られる(環境変数の有無にかかわらず)。何かのキャッシュが入っているためかそこそこ大きく、プロファイル領域を圧迫(というか平然とキャパオーバー)し、さらに再起動で消える。
  2. 設定しないとインストール時にユーザプロファイル以下に Android SDK を置こうとする。数百 MB である。以下同文。
  3. 起動後に始まるダイアログが、インストール時にどこに置いたかなど全く見ないで、ユーザプロファイル以下に Android SDK があるかを調べ、なかったらこちらが指定するか、さもなくばインストールするぞといってくる。入れたら以下略。しかも、ネットワークにつながっていると最新のファイルをダウンロードしてきて更新しようとする。
  4. ビルドに使う Gradle がユーザプロファイル以下に .gradle というフォルダを作り、そこに設定やらキャッシュやらを貯め込む。他に比べれば大きくないが、ほとんど何もしないプロジェクトでも20MB程度使い、残念ながらこちらの環境ではキャパオーバーする。
  5. プロキシの設定が自動でされないため、ビルド時に Gradle が依存するライブラリを取りに行く際に止まる。拒否されるのではなくタイムアウト待ちになるので、ビルドがちっとも終わらない。当然、長く待った挙げ句にエラーになる。さらに、ネットワークにつながっていると環境をアップデートしようとする。再起動すると戻るのに。
  6. プロジェクトを作るデフォルトの位置が C ドライブのユーザプロファイル以下に AndroidStudioProjects というフォルダになっている。間違ってここに作ると再起動時に消える。そもそもファイルサイズが以下略。

もうインストールやめてもいいだろうか・・・?
いやいや、問題を片付ければ使えるかもしれないじゃないか。続けよう。


問題回避


では一つずつ解消しよう。

  1. Android Studio の設定ファイルの位置は Android Studio をインストールしたフォルダの bin の下にある idea.properties を編集すれば良いようだ。あまり直接はいじらないらしいが、全体としてそうしたいので何も思わない。個々で設定は変えたいので、 Z ドライブ以下に作るようにした。
  2. インストール時には Android SDK を C ドライブの皆が見える位置にインストールする。インストール時に指定するだけなので簡単。
  3. 起動時の Android SDK に関するダイアログについてはスキップするようにした。 idea.properties に disable.android.first.run=true と入れるとスキップできる。どこに書いてあるんだそんなこと。
  4. GRADLE_USER_HOME という環境変数に位置を指定すれば Gradle の設定の位置を変えられるらしいので環境変数を追加した。
  5. Gradleの設定に Offline work というものがあった。これを指定すればネットワーク待ちは回避できる。指定させるのは面倒なのだが、現状設定方法が分からない。
  6. プロジェクトの位置は一度作れば設定ファイルにその場所を格納するので、一度目に口酸っぱく Z ドライブに作るよう言うしかない。これもデフォルト指定ができれば良いのだが、方法が分からない。

さて解決したか・・・と思いきや、まだ問題が発生する。


問題回避による問題


回避策によって起こった問題は以下のもの。
  1. 上の 3 のダイアログスキップの影響で、最初に Android SDK の位置を別途指定する必要が出てきた。
  2. 上の 5 の Offline mode の影響で、依存性解決が出来ない。プロジェクトが最初に作るユニットテスト用の junit も見つからない。
  3. 上の 6 のプロジェクトがネットワークドライブ( SMB )上にあることで、ビルドが極端に遅い。ローカル HDD と比較して 60 倍くらい(秒→分で良い感じ)。どうもファイル一覧の取得が必要になって死ぬほど遅くなってるらしい。

そろそろめげてきただろうか。
しかし回避しなければならない。
  1. 仕方ないので Android SDK のパスを指定させることに。幸い SDK の位置なしにはプロジェクトを作れないので、そうそう問題は起こるまい。
  2. 依存性解決のために、 jar を配置したフォルダを指定する Gradle のスクリプトを配置することにした。 Android Studio をインストールしたフォルダの gradle\gradle-2.10\init.d というフォルダに置かれたスクリプトが必ず実行されるらしいので、そこに allprojects { repositories { flatDir { dirs 'ほげほげ' } } } という記述を入れたファイルを置いた。
  3. 遅いのはビルドの時だけだったので、ビルドディレクトリの指定をした。先ほどの gradle のフォルダに置いたファイルに gradle.projectsLoaded { rootProject.allprojects { buildDir = "C:/Users/${System.env.USERNAME}/AppData/Local/Temp/${rootProject.name}/${project.name}" } } と指定。幸いテンポラリフォルダはプロファイル領域から除外されていたので動く。

次にいこう。まだ終わらない。
  1. 上の 2 の jar の無理矢理な指定のせいで、ユニットテストが動かない。本来はプロジェクトフォルダの app\libs に入れるはずなので、ここに必要なものを持ってこないといけない。
  2. 上の 3 のビルドディレクトリ指定により、再起動時に消えることになる。それを試すと、起動時にあらゆるシンボルの解決に失敗する。なお、ビルドはできる。
  3. ビルドディレクトリの問題か、 Android Studio がある生成物である jar ファイルのロックをかけたまま離してくれない。(フルパスを途中からだけ書くと、 appcompat-v7\23.3.0\jars\classes.jar という名前)

これは解決できるのかって?結果を見てみよう。そろそろ年貢の納め時らしい。
  1. 残念ながら現状回避策なし。試しに必要とおぼしき jar ファイルをいくつか libs の中に入れてみたが、なにやらエラーが出た。もう体力がないので今回は断念。つまりユニットテストをするな、と。(投げやり)
  2. ビルドメニューから Make Project をして、 Fileメニューにある "Invalidate Caches / Restart..." から、 Invalidate and Restart を選ぶ。 Android Studio が再起動するが、環境に問題がなければ、再起動後に indexing が行われてシンボルが解決できるようになる。
  3. 未だに回避策不明。 instant go のせいという Stackoverflowの回答もあったが、どうやらそれではない様子。ロックを強制的に解除するプログラムを使う手も説明されていた。ちょっと怖い。(これ実行に管理者権限いらない?)

というわけで、問題が残ってしまった。


現状


割とどうでも良い制限は以下。
  1. 初回に Android SDK の位置を指定する必要がある。
  2. Gradle の Offline mode を指定する必要がある。
  3. 初回に C ドライブにプロジェクトを作らないようにしないといけない。

そして致命的な問題が以下のもの。
  1. Gradle が jar を消せずに失敗する。回避策不明。 Gradle のメニューから別途ビルドすれば出来なくはないが・・・
  2. ユニットテストができない。もう勘弁してほしい。

現状は以上の通り。解決すれば書き換えたりするかも。続きを読む
posted by chiguri at 20:00| Comment(0) | PC