2013/11/16

Eclipse に .project の無い既存の Android プロジェクトをインポートする

@Eclipse Juno SR2
@ADT Rev. 22.3
@Android SDK Rev. 19

以前、「Eclipse に既存の Android プロジェクトをインポートする」というエントリで以下のように書きました。

.project ファイルがない場合は何も表示されません。その場合は、Eclipse でインポートできるサンプル等ではないので、別の方法で Eclipse に取り込んでやる必要があります。

その後、「別の方法」が提供されたので書いておこうと思います結構すぐに出来るようになったのですが、書こうと思いながら大分時間が経ってしまいました…

File → New → Other...

Android → Android Project from Existing Code

Root Directory を入力

選択したディレクトリを再帰的に検索してプロジェクト一覧が表示されます。
この時、プロジェクト名は AndroidManifest.xml 内で宣言されているアプリ名になります。
別の名前にしたい場合は、ここで変更することも可能です。

Finish を選択すると、選択したプロジェクトがインポートされます。

2013/11/14

Android SDK をアップデートしたら BufferOverflowException が出るようになった

最近、ちょっと古い Android Project を Eclipse で実行しようとすると以下のようなエラーが起こるようになりました。

Android Console の出力
[2013-11-14 22:04:14 - Dex Loader] Unable to execute dex: java.nio.BufferOverflowException. Check the Eclipse log for stack trace.
[2013-11-14 22:04:14 - LifeCycleTest] Conversion to Dalvik format failed: Unable to execute dex: java.nio.BufferOverflowException. Check the Eclipse log for stack trace.

調べてみると、Eclipse を再起動してみろとか、いろいろ書かれているのですが…

私の環境では再起動してもダメで、以下のように Project Build Target を最新にしてやるとうまく動くようになりました。

Project → Properties → Android → Project Build Target


エラーの内容からすると、生成された dex ファイルに問題がある様子。
ということは、Build に失敗しているわけで、心当たりを探してみると、一つ思い当たることが。

先日、Android SDK のバージョンを 19Android 4.4 KitKat にした時に、古い Android SDK Build-tools を全て Delete したのです。
Android SDK Build-tools Rev. 19 以外が Not installed


時間が無くて調べきれていませんが、対応する Android SDK Build-tools が無いと、正しく dex ファイルが生成できないのではないかと思われます。


追記
ちょっと気になったので確認してみましたが、結論としては Android SDK Build-tools は関係なく、現時点(2013/11/14) の最新SDK Android SDK Tools Rev. 22.3
Android SDK Platform-tools Rev. 19
では Project Build Target が API 15Android 4.0.3 以前の Project のビルドにはことごとく失敗します。
Android SDK をアップデートしたら、Project Build Target もアップデートしないといけないようです。

そもそも、Project Build Target のバージョンはなるべく最新に保ち、Deprecated なものなどに気を配って開発していくべきですので、あまり問題はないと思いますが、リリース直前の複数のプロジェクトを抱えているとやっかいなことになりそうです。
まぁ、そういう場合は SDK のインストールディレクトリから分けるべきなのでしょう。。。

2013/10/02

Android Layout の Lint を個別に表示しなくする方法

ADT (Android Development Tools) の Lint、どんどん進化してきて便利ですね。
しかし、"Nested weights are bad for performance" のように修正不可能なものもあります工夫次第で修正できる場合もありますが

この Lint、「Java のコード内で表示された場合はアノテーションで無視することが出来るけど、Layout XML 内では個別に無視できない」と思っていました。
昨日までは。

しかし、Warning が表示されている行で Ctrl + 1 を押すとなんと、"Add ignore 'NestedWeights' to elemnt" というサジェストが表示されるではないですか。

選択してみると、以下のように tools:ignore="NestedWeights" が追加され Warning が表示されなくなりました。

この機能、どうも ADT 17 で入ったみたいですADT 17 が出たのが 2012年3月 なので、1年半も気づかなかったわけですね…
ぐぅ


2013/03/05

Eclipse の Android JUnit Test は 2回実行される

Android で JUnit Test をしていた時、ちょっと気になる現象を発見してしまいました。
たまたま、android.app.Application を継承した独自実装の Application を使用して、その onCreate() にログを仕込んでいた状態だったので気づいたのです。
以下、その詳細です。

コード

実際のコードをあげるのは大変なので、以下に簡略化したものをあげておきます。

MyApplication.java (Target)
public class MyApplication extends Application {
    private static final String TAG = "MyApplication";

    @Override
    public void onCreate() {
        super.onCreate();

        Log.d(TAG, "onCreate");
    }
}

AndroidManifest.xml (Target)
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.kokufu.android.test.sampletarget"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <application
        android:name=".MyApplication"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        
        <!-- 省略 -->
        
    </application>

</manifest>


このアプリに対し、以下のようなテストを作成。
(テストとしての役割は全く果たしていませんが…)

MyTest.java (Test)
public class MyTest extends TestCase {
    private static final String TAG = "MyTest";

    public void testA() {
        Log.d(TAG, "testA");
    }

    public void testB() {
        Log.d(TAG, "testB");
    }
}

Application.onCreate() が2度呼ばれている

Eclipse から
Run → Run As → Android JUnit Test
と実行してみると、
以下の様な結果が。
onCreate が2度呼ばれています。
間違えて 2度実行してしまったわけではありません。
たった1度、実行操作を行っただけです。

さらによく見てみると、最初の onCreate だけ PID が異なります。
どうも、別プロセスで 2回実行されているようですが、テスト自体は2回目だけ実行されるようです。
2013/01/31

EGit could not detect where Git is installed

@ Eclipse Juno SR1 on Windows7
EGit 2.1.0

Git まわりをいじっていたら Eclipse の立ち上がり時に、EGit could not detect where Git is installed というエラーが出るようになってしまいました。

「Git がインストールされている場所がわからない」ってことですね。

文面を読んでみると
Preferences → Team → Git から設定することが可能です
と書いてあるので、設定画面を開いてみましたが、設定できそうなところはどこにもありません。

きっと古いバージョンの情報が表示されちゃってるんでしょうね。
こういう時は、パスが通っていれば大丈夫だろうと思い、環境変数 path に以下のディレクトリを追加してやりました。
参考:Windows TIPS -- HINT:環境変数を変更する
C:\Program Files (x86)\Git\cmd

すると、エラーは出なくなりました。


ちなみに、以下のディレクトリにパスを通してもエラーは出なくなるのですが、cygwin 等と競合するアプリケーションが多数入っているので、cmd ディレクトリを指定した方が無難だと思われます。
C:\Program Files (x86)\Git\bin
2013/01/22

Eclipse Project のフォルダを右クリックで開くプラグイン


Eclipse を使っている際、Project Explorer から任意のフォルダを右クリックして Explorer や Command prompt を開きたくなることがよくあります。

そんな時に使えるのが、openextern というプラグイン。
Eclipse 歴の長い人には Open External とほぼ同じものと言えば通じるでしょうか。
結構便利なので、お勧めです。
openextern - Open shell and folder from eclispe - Google Project Hosting

インストール方法は例によって簡単。
Help → Install New Software...
Add
Location に以下のサイトを指定
http://openextern.googlecode.com/svn/trunk/openextern_update/



インストールが完了すると、Project Explorer の右クリックメニューに openextern という項目が追加され、任意のディレクトリを開けるようになります。
パッケージ配下のファイルをいじりたい時などはかなり便利です。
よく見ると、あの幻のプラグインが…

この openextern は Windows 、Linux、 Mac で動作します。
私は Ubuntu 上の Eclipse でも使用しています。

2013/01/17

Eclipse に NDK Plugin を入れようとしたら "Cannot complete the install because one or more required items could not be found" エラー

このところ、出番が少なくなってきたノートPC (Windows 7 64bit)。
長いこと放ったらかしになっていたので、開発環境を構築しなおしてみました。

「ブログのネタにもなるしね。」とか思って始めたのですが、早々にエラーが。
Eclipse (Juno RC1) をインストールして、最初に ADT をインストールしようとしたところ、 Cannot complete the install because one or more required items could not be found と言われてしまいました。
正確には Android Native Development Tools (NDK Plugins) をインストールしようとしたところでエラーが出ています。
以下、エラー部分抜粋
Cannot complete the install because one or more required items could not be found.
  Software being installed: Android Native Development Tools 21.0.1.v201212060256-543035 (com.android.ide.eclipse.ndk.feature.group 21.0.1.v201212060256-543035)
  Missing requirement: Android Native Development Tools 21.0.1.v201212060256-543035 (com.android.ide.eclipse.ndk.feature.group 21.0.1.v201212060256-543035) requires 'org.eclipse.cdt.feature.group 0.0.0' but it could not be found

「あれ、今までこんなエラー出たことないぞ」と思ってよくみてみると、CDT が入ってなかったからでした。
(赤字のところです)

今までは CDT のインストールの方を先にやってたからなぁ…
組み込み屋ではなくなってきたのを実感。

というわけで、CDT をインストール。
CDT Downloads

Eclipse を再起動の後、もう一度 Android Native Development Tools のインストールを試みると、今度はすんなりインストール出来ました。

Eclipse も依存関係とか自動でチェックしてインストールしてくれると楽なんですけどねぇ
2012/10/11

Exception が発生した時の LogCat の読み方 (3)

穀風: Exception が発生した時の LogCat の読み方 (2) に続いて、もう少し現実的なパターンを書いておきます。

サンプルは前回までと同じものです。


Button3 を押すと、以下のような Exception が発生します。

これまでのルールだと一行目を見て、RuntimeException が発生したということになります。
まぁそれで間違いではないのですが、RuntimeException というのは例外処理を必須としない一般的な Exception です。
どんなエラーが起こったかの情報にはなりません。

実は、今回のエラーは別スレッドで起こっているので、このようなログが出力されるのです。
2012/10/07

Exception が発生した時の LogCat の読み方 (2)

穀風: Exception が発生した時の LogCat の読み方 (1) では、最もシンプルな LogCat の読み方を書きましたが、実際はそんなに単純な Exception が出ることは稀です。
今回はもう少し現実的な Exception を見てみたいと思います。

サンプルは前回と同様のものです。


Button2 を押すと、以下のような Exception が発生します。


上から見ていくと、IndexOutOfBoundsException が発生したことがわかります。
どんな Exception なのかは調べてみて下さい。

さらに、次の行を見ていくと、ArrayList.java の 257行目が発生源のようです。
そんなコードを書いた覚えはありません…
2012/10/06

Exception が発生した時の LogCat の読み方 (1)

先日、知人が Exception (例外)が発生した時のデバッグが大変だと言うので、話を聞いてみたところ、LogCat を使っていないということがわかりました。
いや、正確には LogCat 自体は知っていて、怪しそうなところに片っ端からログを出力してデバッグしているとのこと。
いわゆる printfデバッグですね。

デバッグ手法として間違ってはいないけど、まずはスタックトレースの見方を知らないと大変だよねってことで、結構真面目に説明してあげました。
せっかくなので、ここにも書いておこうかと思います。


まずは、サンプルコードを作ります。
今回は、ボタンを押したら Exception が発生するサンプルを作成してみました。
以下にアップロードしてあります。
ExceptionThrower.zip


あえて、どんな Exception が発生するかわからないようにしてみたので、実行する前にコードを見て、どんな Exception が発生するか想像してみるのも良いでしょう。
2012/09/19

Eclipse のプラグイン情報を引き継ぐ

Eclipse を Indigo (3.7) から Juno (4.2) にアップデートしました。(@Windows 7 64bit)
本体のアップデートは

Help → Install New software...
http://download.eclipse.org/eclipse/updates/4.2

とするのが簡単なのでしょうが、私は昔からのクセで、新しい Eclipse を別ディレクトリにインストールして、暫くの間2バージョン共生状態で運用することにしています。

ただ、その際に面倒くさいのがプラグインの移行です。
少し前までは、 dropin フォルダを利用していたのですが、やはり更新のしやすさを考えると Eclipse Marketplace や更新サイトの利用が増えてきてしまい、結局インストールし直すことになるのが面倒でした。
しかし、今回は Eclipse 3.6 から加わったプラグインの引き継ぎ機能を使って、これが楽に出来ました。
2012/05/30

Eclipse on Linux でホワイトスペースを可視化する

最近、Ubuntu ネタばかりです。
やはりメインマシンとして Ubuntu を使い始めると、サブとして使っているのとは違う不満(というか要求)が出てくるものですね。

Windows の Eclipse には JStyle というプラグインがあって、White Space (Tab, 全角スペース, 改行等)を以下のように可視化してくれます。
(色が薄くて、画面では見づらいかもしれませんが、エディタ上だと絶妙な色加減です)


ところが、このプラグイン、残念なことに Windows 専用なんです。

Linux 用のプラグインがどこかにないかなぁと探していたら、なんと、Eclipse 3.7M3 以降だとデフォルトで White space 可視化機能が入っているというではないですか!
参考:
Eclipse: Make Tabs visible, Spaces invisible - Stack Overflow


というわけで、使ってみました。
2012/02/02

Android のソースコードを Eclipse から使用できるようにする

Android 4.0 (API Level 14) 以降、Android のソースコードは Android SDK Manager からダウンロードしてくることが出来るようになったようです。

これまでは、repoでソースコードを取ってきて、必要なファイルだけ抜き出して…といったような作業が必要だったのですが、これで大分楽ちんになりました。
(4.0 より前のSDKをベースにして開発する場合は、自分でソースをとってこないといけません)

ただ、このソースコード、インストールするだけではEclipseから参照することができない状態です。
(そのうち改善されると思いますが)
これでは宝の持ち腐れなので、参照できるようにしてあげようと思います。
2012/01/21

Nested weights are bad for performance

突然ですが、私、Eclipse プロジェクトの Warning アイコンが嫌いです。
プロジェクトの横に出ている黄色い三角形のやつです。

Warning が出たままで放っておくなんてありえない!と思います。
徹底的に直して、いつもこのアイコンが出ないようにプロジェクトを作るよう心がけています。
…A型ではないです。
だって、これを放置する習慣がついちゃうと、本当に重要な Warning が出たときに無視してしまうでしょ?

ところが、最近 ADT が XML に lint をかけて警告してくれるようになったのです。
いや、それ自体は良いことです。
ダメな書き方を教えてくれるわけですから。

しかし、
Nested weights are bad for performance
という Warning、修正方法がないみたいです。たぶん。
(参考情報: http://groups.google.com/group/android-developers/browse_thread/thread/9bfd6a5731b038bb/854b654344e382bf?lnk=raot

リンク先のスレッドでも言っていますが、縦方向と横方向が入れ子になるようなレイアウトの場合、 両方に weight 属性を持たせないといけない場合があるはず。
で、その答えが、「ただの Warning だから気にしなくて良いよ」ってのはどうなんでしょうかね。

こういうのは Warning じゃなくて Information に止めておいて欲しい。
または、Java の アノテーションみたいに、「これはわかってるけど、あえてそうしてるの」ってのを明示的に書けるようにしておいて欲しい。
と思います。

と思ったら、Information に変更する方法がありました。結構普通に。
2012/01/16

Google APIs の Javadoc が表示されなくなった

2012/01/19 追記
ごめんなさい。以下に書いてある方法は使えませんでした
この方法を実行した後に実機で動作させようとすると、以下のようなエラーが発生してしまいます。
java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation
動確しないで、不確かな情報を載せてしまい申し訳ありません。
言い訳なんですが、ちょうど動作が不安定になるような大きな変更を入れてる最中にJavadocが表示されなくなった事に気づき、結構書き換えてる時だからJavadocが無いと余計不便で調べてみたのです。
で、変更してみたけど、もともとうまく動かないプロジェクトでやってたから動確せず。で別件に手をとられ放置…という流れでした。
そういうのブログに書くなよって話ですよね。いや、お恥ずかしい…




Google APIs [Android 4.0.3] を使うと、Javadoc (インテリセンスっぽいやつ)が表示されず、
Note: This element has no attached source and the Javadoc could not be found in the attached Javadoc.

というようなエラーが表示されてしまいます。

おかしいと思って、ライブラリを右クリック → プロパティ
2011/08/31

Android SDK を再インストールしたら Javadoc が表示されなくなった

2012/01/17 追記
別件で同じ問題が起こり、下記の付け焼刃的な解決方法ではうまく行かなくなったので、もう少しましな方法を見つけました。
Google APIs の Javadoc が表示されなくなった



諸事情で Android SDK を再インストールしました。(installer_r12-windows.exe)

そうしたら、インテリセンスライクなやつがうまく動かなくなって、
Note: This element has no attached source and the Javadoc could not be found in the attached Javadoc.
っていうエラーが…

で、よくよく見てみると、SDKのインストールディレクトリが

C:\Program Files\Android\android-sdk

になっている。

2011/08/11

Android Project で Is Library を使う場合、res の管理に注意

以前、Android プロジェクトを jarライブラリ化する というエントリで
res以下を使用したい場合は、上記の Is Library を使用することでライブラリ化することが可能です。
と書いたのですが、最近、Is Library を使っていても res 以下の扱いは注意しなければいけないことに気づきました。
具体的には、Library と Application(使用する側)に同じ名前のリソースがあると、コンパイルエラーにはならないが、実行時におかしなことが起こるのです。

この辺の事情は、以下のサイトに詳しく書いてあります。
2011/07/11

AIR GEAR を使ってみた(2) - error while loading initial content

AIR GEAR を使ってみた(1) - インストール」 でプロジェクトを作成してみたものの、
error while loading initial content
というエラーが出て動きませんでした。


このエラー、ググって見ると、どうもバージョン情報が合っていない場合に出るようです。そこで、application.xml を開いてみると、先頭の2行は
<?xml version="1.0" encoding="utf-8" ?>
<application xmlns="http://ns.adobe.com/air/application/1.1">
となっています。

今回インストールした AIR のバージョンはもっと大きいはずなので、ここがおかしいようです。

2011/07/10

AIR GEAR を使ってみた(1) - インストール

Eclipse で AIR アプリケーションを作成できるプラグイン AIR GEAR というものがあるということで、使ってみることにしました。

2011/06/03

Android プロジェクトを jarライブラリ化する

Android に関わらず、プログラムを書いていると、作った成果物をライブラリ化したいと思うことは多々あります。
Eclipse の Android 開発環境(ADT) には Is Library という設定があって、ソースコードのままライブラリとして利用出来ます。
ただ、この方法だと、再配布がしにくいです。
というわけで、Eclipse の Javaプロジェクトを jarライブラリ化する機能を使って、Android プロジェクトを jarライブラリ化する方法を紹介したいと思います。

2011/6/5 追記
この方法はres以下を使用するAndroidプロジェクトには使用できないようです。(いろいろ実験してみましたが無理でした。うまい方法をご存知の方は是非教えてください。)
res以下を使用したい場合は、上記の Is Library を使用することでライブラリ化することが可能です。
Is Libary の詳しい使い方は ADTによるLibrary Projects という Kazzz さんのエントリがわかりやすいです。

2011/8/12 追記
本件、Googleが公式に出来ないと発表していることがわかりました。
res を使っている場合、jarライブラリ化するのは諦めた方が良さそうです。
その辺については、Android Project で Is Library を使う場合、res の管理に注意 というエントリにまとめたので、参考にしてみてください。
res を使用しない場合は、以下の要領でjarライブラリ化可能ですが、Google が公式に認めていない以上、お勧めは出来ません。あしからず。