LibraryProjectでR.idが定数として認識されない

2,545 views
Skip to first unread message

Jaken Jarvis

unread,
Mar 27, 2013, 5:51:24 AM3/27/13
to android-g...@googlegroups.com
Jakenと申します。

制作中のアプリを、有料版と無料版、coreのように、3つのプロジェクトに分けて管理しようとしたところ、
ADTのバグと思われる症状に遭遇しましたので、確認させてください。

問題は、Libraryプロジェクト内のresで、「type="id"」のように指定したリソースが「定数」として認識されないため、switch-case文で記述した場合に、ビルドエラーになることです。

「case R.id.test_id_1:」のように記述すると、「case 式は定数式でなければなりません」のように怒られます。
「if(itemid == R.id.test_id_1)」のようにif文で記述すると、ビルドが通ります。
さらに、case文のまま、プロジェクトの「Is library」のチェックを外してビルドすると通ります。

つまり、ライブラリの時、かつ、switch-case文で判断しているR.idのところだけビルドエラーになるんです。
また、R.id以外のR.layout等は、問題なくビルドが通っています・・・。

これが、あまりにも中途半端で不可解なので、この現象が自分だけなのか・・・
再現する最小構成のファイルを用意しましたので、同じ現象が他の環境でも発生するのか確認したいです。
(自分の環境が問題な場合は、環境構築しなおそうと思っています)

・再現方法
3つのAndroidプロジェクトを使います。

「CantBeChangedLibrary」
  外部のライブラリプロジェクトを想定しており、自分では変更しないものです。
  Is libraryにチェックを付けています。

「MyLibrary」
  自分が作成したライブラリプロジェクトです。
  アプリのメイン処理をここで実装するCore部分を想定しています。
  Is libraryにチェックを付けています。さらに、CantBeChangedLibraryを参照しています。
  ここで、CantBeChangedLibraryのresに定義しているR.idを使う時に問題が発生します。

「MainApp」
  アプリCoreの薄いラッパーです。有料版や無料版などの差分だけを入れる部分を想定しています。
  Is libraryにチェックはつけていません。MyLibraryを参照しています。

こんな構成のため、「ライブラリの中のライブラリ」という扱い自体が特殊なのかもしれない、とは思っています。
ですが、、、それにしても中途半端な症状なので、仕様とは考えにくいと思っています。
また、genに自動生成されたR.javaを見ても、特に変わった様子はないので、aaptはちゃんと動いているように見えます。
なので、ADTのバグなのではないか・・・という思考に至りました。

とりあえずif文で回避できることは判明したのですが、何が原因だったのか釈然としません。


・開発環境
Windows 7 Ultimate SP1 64bit Core2Duo3GHz メモリ4MB
ADT:Build: v21.1.0-569685
Eclipse:Version: 3.7.2.v20120120-1414-7z8gFcuFMP7BW5XTz0jLTnz0l9B1 Build id: M20120208-0800
※android-sdk_r21.1-windowsにpleiades-1.4.0、jstyle_4.2.2.0-64bitを入れて、UTF-8で書いています。

・最少構成のファイル
以下のDropbox上のURLにありますので、ダウンロードしてください。
https://www.dropbox.com/s/ns30s7s1i6yvg3l/projects.7z
※しばらくは残しておきますが、そのうち消すかもしれません。

projects.7zには、上記3つのサンプルプロジェクトを含んでいます。
※これはビルドエラーが確認できる最小構成なので、アプリとしてはまったく意味がありません。

・確認方法
1.ビルドが通る状態にしてありますので、まずは、3つのプロジェクトのビルドが通る状態にします。
2.MyLibraryプロジェクトのMainActivity.javaを開き、コメントアウトしてあるonMenuItemSelectedメソッドを入れ替えます。
3.ビルドすると、case文の所で「case 式は定数式でなければなりません」になることを確認できると思います。
4.この状態で、MyLibraryプロジェクトのプロパティを開き、Is libraryを外してビルドしてみてください。ビルドが通ります。

思わず吹き出しそうになると思います・・・(汗)
こんなところで数日潰されてしまった orz

もし、私が何か間違えているだけなら、ご指摘頂けるとありがたいです。
ということで、誰か興味のある方、お手数をおかけいたしますが、よろしくお願いします。

Makoto Yamazaki

unread,
Mar 27, 2013, 6:12:27 AM3/27/13
to android-g...@googlegroups.com
zaki です。

仕様です。

2013/3/27 Jaken Jarvis <jaken....@gmail.com>:
> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com にメールを送信します。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
> その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
>
>



--
YAMAZAKI Makoto

Makoto Yamazaki

unread,
Mar 27, 2013, 6:18:41 AM3/27/13
to android-g...@googlegroups.com
zaki です。

ちょっとシンプル過ぎたのでもう少し詳しく書いておきます。
http://tools.android.com/recent/buildchangesinrevision14
の Library Project Revamp のところに
To make the compiled classes not embed this value and instead access
it from the R classes, library project will generate the resources IDs
as static int only.
とかかれています。

昔の Android SDK ではライブラリプロジェクトの R も定数でしたが、 r14 でビルドシステムに
変更が入った際に定数ではなくなりました。


2013/3/27 Jaken Jarvis <jaken....@gmail.com>:

Makoto Yamazaki

unread,
Mar 27, 2013, 6:28:59 AM3/27/13
to android-g...@googlegroups.com
zaki です。

この件に関して追加の情報を思い出したので書いておきます。

Android developers blog のエントリ
http://android-developers.blogspot.jp/2011/10/changes-to-library-projects-in-android.html

それまで switch 文を使っていた場合の対応方法
http://tools.android.com/tips/non-constant-fields


2013/3/27 Jaken Jarvis <jaken....@gmail.com>:

Jaken Jarvis

unread,
Mar 27, 2013, 7:00:51 AM3/27/13
to android-g...@googlegroups.com
zakiさんへ

Jakenです。
回答ありがとうございます。

おもいっきり書いてありますね・・・お恥ずかしい・・・。
でも、これで仕様だとわかってスッキリしました。
対処方法も、if文にするのが正解だとわかりましたので安心です。

教えてくださり、ありがとうございました!
※Dropboxのprojects.7zは、3月末までは残しておきます。

Makoto Yamazaki

unread,
Mar 27, 2013, 10:04:10 AM3/27/13
to android-g...@googlegroups.com
zaki です。

変更当時を知っていれば疑問に思うこともないのですが
知らずにこの挙動に遭遇するとびっくりしますよね。

いずれの情報も普通に開発環境を作っただけでは見に行くことがない
場所なので気づかないのも仕方ないかなと思います。


2013/3/27 Jaken Jarvis <jaken....@gmail.com>:
--
YAMAZAKI Makoto
Reply all
Reply to author
Forward
0 new messages