Launch error: リモート VM に接続できませんでした

Android開発をしていて、ある時からアプリのデバッグ起動で次のようなエラーが出て固まるようになりました。


[2011-08-03 19:14:42 - com.example.testapp] ------------------------------
[2011-08-03 19:14:42 - com.example.testapp] Android Launch!
[2011-08-03 19:14:42 - com.example.testapp] adb is running normally.
[2011-08-03 19:14:42 - com.example.testapp] Performing com.example.testapp.First activity launch
[2011-08-03 19:14:42 - com.example.testapp] Automatic Target Mode: using device 'CB511J0W90'
[2011-08-03 19:14:42 - com.example.testapp] Uploading com.example.testapp.apk onto device 'CB511J0W90'
[2011-08-03 19:14:42 - com.example.testapp] Installing com.example.testapp.apk...
[2011-08-03 19:14:45 - com.example.testapp] 成功!
[2011-08-03 19:14:45 - com.example.testapp] Starting activity com.example.testapp.First on device CB511J0W90
[2011-08-03 19:14:45 - com.example.testapp] ActivityManager: Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.example.testapp/.First }
[2011-08-03 19:14:45 - com.example.testapp] Attempting to connect debugger to 'com.example.testapp' on port 8610
[2011-08-03 19:14:45 - com.example.testapp] Launch error: リモート VM に接続できませんでした

ポート8610番につなげない、と言われているので調べてみる。

C:\>netstat -an -p tcp 
~略~
TCP    127.0.0.1:8600         0.0.0.0:0              LISTENING
TCP    127.0.0.1:8601         0.0.0.0:0              LISTENING
TCP    127.0.0.1:8602         0.0.0.0:0              LISTENING
TCP    127.0.0.1:8603         0.0.0.0:0              LISTENING
TCP    127.0.0.1:8604         0.0.0.0:0              LISTENING
TCP    127.0.0.1:8605         0.0.0.0:0              LISTENING
TCP    127.0.0.1:8606         0.0.0.0:0              LISTENING
TCP    127.0.0.1:8607         0.0.0.0:0              LISTENING
TCP    127.0.0.1:8608         0.0.0.0:0              LISTENING
TCP    127.0.0.1:8609         0.0.0.0:0              LISTENING
TCP    127.0.0.1:8610         0.0.0.0:0              LISTENING
TCP    127.0.0.1:8612         0.0.0.0:0              LISTENING
TCP    127.0.0.1:8613         0.0.0.0:0              LISTENING
TCP    127.0.0.1:8614         0.0.0.0:0              LISTENING
TCP    127.0.0.1:8615         0.0.0.0:0              LISTENING
TCP    127.0.0.1:8616         0.0.0.0:0              LISTENING
TCP    127.0.0.1:8620         0.0.0.0:0              LISTENING
TCP    127.0.0.1:8621         0.0.0.0:0              LISTENING
TCP    127.0.0.1:8622         0.0.0.0:0              LISTENING
TCP    127.0.0.1:8623         0.0.0.0:0              LISTENING
TCP    127.0.0.1:8624         0.0.0.0:0              LISTENING
TCP    127.0.0.1:8626         0.0.0.0:0              LISTENING
TCP    127.0.0.1:8627         0.0.0.0:0              LISTENING
TCP    127.0.0.1:8629         0.0.0.0:0              LISTENING
~略~

と(やたらLISTENしているポートが多いのが気になるものの)ちゃんと開いているように見える。
ポートが空いてるのは確認できたが、firewallの影響を受けているかもしれないのでさらにしつこくjdbデバッガで調べてみる。

C:\>jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8610
uncaught java.lang.Throwable を設定しました
保留した uncaught java.lang.Throwable を設定しました
jdb の初期化中です...
> 

問題なくつなげたので一旦quitを入力して終了。
これで繋げなければJava VM側やネットワークの問題の可能性がありましたが、
これで原因はEclipseの可能性が高いということに。

改めてEclipseの設定を確認すると…

一般 → ネットワーク設定 → プロキシーのバイパスでプロキシが設定されていて、しかもlocalhost, 127.0.0.1 のプロキシが有効になってしまっていました。
これじゃ繋がるわけないわな。

アクティブ・プロバイダーが「ネイティブ」になっていて変更できなかったため「直接」に変更した上で上記2つのチェックを外した所無事解決。

AsyncTaskでブレークポイントを指定する時の注意点

AsyncTask の中でブレークポイントを設定する場合は、doInBackground() の最初で

android.os.Debug.waitForDebugger();

を呼ぶ必要があります。
 
呼ばないとブレークポイントを無視してしまいます。
 
デバッガが居なくても以外もwaitForDebugger()で処理を停止してしまうので、
デバッグ実行が終わったらちゃんとコメントアウトしましょう。
 
#謎の不具合で丸一日はまった…
 
参考:
Debug#waitForDebugger())

MercurialEclipse+ADTで not in root エラー

ある時からMercurial Eclipse(v1.8)でコミットをしようとするとnot under rootというエラーが出るようになりました。
原因をググってみるとどうやら Android のライブラリプロジェクトとメインプロジェクトの両方でMercurialを使っていると出るらしい。
解決方法はAndroidライブラリの依存チェックを外すか、どちらかのリポジトリを切断するかで、どちらも場当たり的なのが悩ましい…。
 
参考として、スタックトレースは以下の通りでした(MercurialEclipse バージョン 1.8.0.v201103281715 で確認)

!ENTRY com.vectrace.MercurialEclipse 4 0 2011-04-11 12:24:47.074
!MESSAGE 中断: c:\path\to\android_project_dir not under root. コマンド行: c:\path\to\android_library_project_dir\hg -y status -marduc — c:\path\to\android_project_dir, error code: -1
!STACK 1
中断: D:\usr\eclipse\net.canp.android.purigaget not under root. コマンド行: D:\usr\eclipse\net.canp.android.common\hg -y status -marduc — D:\usr\eclipse\net.canp.android.purigaget, error code: -1
at com.vectrace.MercurialEclipse.commands.AbstractShellCommand.executeToStream(AbstractShellCommand.java:405)
at com.vectrace.MercurialEclipse.commands.AbstractShellCommand.executeToBytes(AbstractShellCommand.java:348)
at com.vectrace.MercurialEclipse.commands.AbstractShellCommand.executeToString(AbstractShellCommand.java:548)
at com.vectrace.MercurialEclipse.commands.AbstractShellCommand.executeToString(AbstractShellCommand.java:544)
at com.vectrace.MercurialEclipse.commands.HgStatusClient.getStatusWithoutIgnored(HgStatusClient.java:154)
at com.vectrace.MercurialEclipse.team.cache.MercurialStatusCache.updateStatusInRoot(MercurialStatusCache.java:1333)
at com.vectrace.MercurialEclipse.team.cache.MercurialStatusCache.refreshStatus(MercurialStatusCache.java:1287)
at com.vectrace.MercurialEclipse.team.cache.MercurialStatusCache.access$0(MercurialStatusCache.java:1273)
at com.vectrace.MercurialEclipse.team.cache.MercurialStatusCache$ProjectUpdateJob.updateProject(MercurialStatusCache.java:144)
at com.vectrace.MercurialEclipse.team.cache.MercurialStatusCache$ProjectUpdateJob.run(MercurialStatusCache.java:126)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54)
!SUBENTRY 1 com.vectrace.MercurialEclipse 4 -1 2011-04-11 12:24:47.074
!MESSAGE 中断: c:\path\to\android_project_dir not under root. コマンド行: c:\path\to\android_library_project_dir\hg -y status -marduc — c:\path\to\android_project_dir

 
参考:
MercurialEclipseでちょっと困った(Naga Blog)

Eclipseでプラグイン更新後エラーで起動しなくなった時の対処方法

MESSAGE バンドル org.eclipse.equinox.app (913) を自動的に有効化している間にエラーが発生しました。

と出て、Eclipse が起動しなくなった。
Eclipse ディレクトリの

eclipse.exe -clean.cmd

を実行して解決しました。
ない場合はコマンドラインから

eclipse -clean

でOKです。

ADT – うまく動作しない時の対処方法

ADT(Android Development Tools) 0.6 を Eclipse 3.5(Galileo), Java 6.0 の環境でインストールしたものの色々不安定です。

Conversion to Dalvik format failed with error 1

というエラーが出て、プロジェクト→クリーンすればいいよという情報があったのでやってみたけど解決に至らず、試行錯誤の結果次の手順でプロジェクト設定を修正したところエラーが消えました。
 
1.パッケージプロパティーでプロジェクトを右クリック
2.Androidツール→プロジェクトプロパティを修正を選択 (Android Tools > Fix Project Properties)
3.最後にプロジェクト→クリーン
 
gen フォルダがおかしい時や、Android のライブラリの欠落もこれで修正されます。
 
参考:
Android Eclipse Classpath – want to add classpath container path but eclipse won’t let me.

他人の Eclipse プラグインを翻訳するには

便利なのに日本語化されていない、そんな海外のプラグインを見つけた時の翻訳方法をざっとまとめてみました。
 
1. 翻訳対象のプラグインを Eclipse にインポートする。
プラグインのソースコードまたはリリースされたアーカイブファイル(.jar)をEclipse プロジェクトとしてインポートします。
前者の場合は「インポート→一般→既存プロジェクトをワークスペースへ」。
後者の場合は「インポート→プラグイン開発→プラグインおよびフラグメント」です。
 
2. 翻訳対象プラグインのパッケージディレクトリ内から *.properties ファイルを検索する。
まずは置き換え対象の外部化文字列の設定ファイルを探します。org/example/foo/messages.properties などです。ファイル名は異なっている可能性がありますが、実行時のメッセージなどがそのまま(ASCII)テキストで入っているため、開いてみれば一目瞭然のはずです。
 
3. Eclipse でフラグメントプラグイン(プラグイン開発->フラグメント・プロジェクト)としてプロジェクトを新規作成する
日本語化プラグインを作成します。
 
プロジェクト名は、慣習として翻訳対象のプラグイン名に .nl_ja (“.nl_” + 言語をあらわす2文字)をつけたものにします。

例:
翻訳対象のプラグインの名: org.junit4.source
日本語化プラグインのプロジェクト名: org.junit4.source.nl_ja

 
次のページでホスト・プラグインのプラグインIDを求められるので、プラグインIDに翻訳対象のプラグイン名を指定し、終了ボタンを押します(先の例なら org.junit4.source)。
 
5. 文字列を外部化したファイルを翻訳対象プラグインからコピーする
 (2)で探し出したファイルを日本語化プラグインプロジェクトにコピーします。
ここでコピー先パッケージ構成は元と同じ場所で、ファイル名に _ja をつけます。

例:
コピー元:
  org.example プロジェクト内パッケージディレクトリの org/example/foo/messages.properties
コピー先:
  org.example.nl_ja プロジェクト内パッケージディレクトリの org/example/foo/messages_ja.properties

 
6. *_ja.properties を編集してメッセージを日本語化します。
プロパティエディタプラグインなどを利用していない場合は編集後に native2ascii で ASCII 文字に変換する必要があります。
 
7.プロジェクトをフラグメントとしてリリースする。
ワークスペースでプロジェクトを右クリック→エクスポートを選び、エクスポート画面から「プラグイン開発→デプロイ可能なプラグインおよびフラグメント」を選びます。
 
あて先には eclipse のルートディレクトリ、または適当な保存先ディレクトリを選び次へ、を押すと、あて先に選んだディレクトリの plugins 以下に、プラグイン(フラグメント)として利用可能な .jar ファイルが作成されます。
 
8. 使ってみる
作成した日本語化プラグイン(org.example.nl_ja_1.0.0.jar など) を翻訳元のプラグインと一緒に plugins ディレクトリに入れて、Eclipse を動かして実行してみましょう。
 
以上です。
うまくできたらぜひ本家プラグインの提供元にコミット&ネット公開してくださいね。

JSEclipse 導入でエラー

JavaScript 用 Eclipse プラグインは JSEclipse がよさそう、ということで
Eclipse 3.3.1 に JSEclipse 1.5.3 を下の更新サイト

http://www.interaktonline.com/

からいれてみたのですが、Eclipse を再起動して早速 *.js ファイルを開いてみたところ、次のようなエラーが…

Error opening the editor

 
とりあえず ソフトウェア更新→構成の管理→JSEclipse 1.5.3を選択し、更新をスキャンしてみたところ、Adobe Labs に JSEclipse 1.5.5 があるよ、と言われたのでそれをインストールし、無事動作しました。
最初から Adobe Labs からインストールすればよかったのですね。
 
Update site: Adobe Labs

http://download.macromedia.com/pub/labs/jseclipse/autoinstall/

 
ちなみに、InterAKT と Adobe の関係については FAQを参照するとわかるのですが、InterAKT が Adobe に買収され、その結果 JSEclipse を含む一部の製品が Adobe Labs に移ったようです。

Eclipse で SVN 利用時 JavaHL にすると強制終了する時のトラブルシューティング

Eclipse 3.3, Subversive または Subclipse を利用し、Apache2.2 用 Subversion 1.4.5 をインストールした環境でローカルで使っていたところ、SVN リポジトリへのアクセスが発生すると、黙って Eclipse が落ちる、という現象が発生しました。プライマリなパースペクティブが SVN リポジトリにアクセスするものだと Eclipse が全く起動しなくなったり…
 
調べてみたところ、結論として、パスが通る場所(PATH で指定されている場所)に libapr-1.dll があり、libapr-1.dll と eclipse/plugin/*javahl* にある libjavahl-1.dll の(Apache の)バージョンが異なる場合に JavaHL を呼び出した瞬間に Eclipse が落ちるようです。
 
以下のいずれかの方法で対策できます。
(A) Subversion をアンインストールするか、PATH から <Subversion ホームディレクトリ>/bin を外す
(B) Apache2.2 用でなく Apache 2.0 用 Subversion (1.4.x) をインストールする
(C) plugin/*javahl*_X.X.X にあるすべての DLL を、使いたい Subversion の DLL にまるごと置き換える
(D) JavaHL でなく SVNKit など PureJava 実装の SVN コネクタを使う。
 
C の案を採用する場合、Subversive なら

eclipse\plugins\org.polarion.team.svn.client.javahl_1.1.*

Subclipse なら

eclipse\plugins\org.tigris.subversion.javahl.win32_1.2.*

に、それぞれのプラグインで使われている JavaHL の DLL があります。
 
また、置き換える DLL は Subversion ダウンロードページからダウンロードした svn-win32-1.4.*_javahl.zip の中の

javahl/libsvnjavahl-1.dll
bin/*.dll

です。
 
追記:
– 2007-10-26: (C)の案でSubversive についてのみ書いていましたが、本日 Subclipse にして再発したため、再調査の上加筆修正しました。
 
参考:
久しぶりにJavaHL(気の向くままに…)

Windows で SVN – 環境準備から Web 公開、利用までの手順

OS: Windows XP SP2
サーバ環境: Apache 2.2.6 + Subversion 1.4.5 + TortoiseSVN 1.4.5
クライアント環境: Eclipse 3.3 + Subclipse 1.2.x
 
という構成で、SVN 環境を構築したのでその手順を残しておきます。
参考にしたサイトについては後述。
 
– Apache 2.2 をダウンロード、インストール
  詳細は省略
– Subversion インストール
  Apache 2.2 用 zip 版(svn-win32-*.zip)をダウンロード(インストーラが必要なら Apache 2.0 用 exe 版(svn-*-setup.exe)をインストール後、zip 版を上書きする)
 コマンドラインから利用するため、 Subversion インストールフォルダの bin にパスを通しておく。
 
– コマンドラインで SVN リポジトリ作成
引用: http://terai.xrea.jp/Subversion/Apache2.html#uc9cfee4

mkdir c:\svn
svnadmin create c:\svn\hoge
svn mkdir file://localhost/c:/svn/hoge/trunk -m “mkdir trunk”
svn mkdir file://localhost/c:/svn/hoge/tags -m “mkdir tags”
svn mkdir file://localhost/c:/svn/hoge/branches -m “mkdir branches”

– Apache の httpd.conf で SVN リポジトリが見られるように設定
以下の行がコメントアウトされていれば、コメントアウトをはずして有効にします。

LoadModule dav_module modules/mod_dav.so
LoadModule dav_fs_module modules/mod_dav_fs.so

以下の行がなければ、LoadModule の最後に追加します。

LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so

最後に、以下のように、Location や VirtualHost タグで DAV, SVNParentPath を設定します。

<Location /svn>
  DAV svn
  SVNParentPath “c:/svn”
</Location>

これで、Apache を再起動すればブラウザで

http://localhost/svn/hoge

とアクセスして接続を確認することができます。
 
– TortoiseSVN インストール
 これは任意。インストールするとエクスプローラで右クリックでSVNリポジトリが作成できるようになります。
 http://tortoisesvn.net/downloads から、自分の環境用の msi をダウンロード
 インストールし、マシンを再起動したあとに同ページの下にある Language Packs の Japanese をダウンロードして実行すると、設定から日本語が選択できるようになります。
設定方法は、エクスプローラを開いて適当な場所で右クリック→ TortoiseSVN → Settings → General の Language を日本語して OK 、です。
 
 
– Eclipse 3.3 インストール
 詳細は省略。
 
– Subclipse インストール
 Eclipse のインストール/更新メニューで新規リモートサイトとして

http://subclipse.tigris.org/update_1.2.x

を指定すればインストールできます。
 
– Elicpse で SVN 対応
SVN リポジトリーエクスプローラーを開き、SVN リポジトリビューで右クリック、新規→リポジトリーロケーションで以下のように入力します。

http://localhost/svn/hoge

パッケージエクスプローラで既存のプロジェクトを右クリック→チーム→プロジェクト共用→SVN
で、あとはそのままウィザードを進めれば SVN を利用することができます。
 
参考:
Apache2 で Subversion をネットワークに対応(てんぷらメモ)
 SVN リポジトリの作成と Apache での公開手順。
Subversion を Windows で GUI 中心に使う(Landscape – エンジニアのメモ)
 Subversion + TortoiseSVN の導入手順。

Eclipse でマウスジェスチャ(Windows)

プラグインで全てのエディタでマウスジェスチャを有効にするというのは現状無理らしいので、フリーソフトのマウ筋で以下の設定をして Eclipse でマウスジェスチャを実現させてみました。
 
MauSuji.ini:
(Target, Action のみ抜粋。既存の設定がある場合要調整)

[Target]
Number_0=1
Succession_0=0
HookType_0=1
WheelRedirect_0=0
FileName0=”eclipse.exe”
 
[Action]
TargetNumber0=1
Gesture0=3
Gesture0_0=12
Gesture0_1=14
Comment0=”エディタを閉じる”
Case0_0=10
CommandTarget0_0=0
Wait0_0=0
Key0_0=599
TargetNumber1=1
Gesture1=3
Gesture1_0=11
Gesture1_1=14
Comment1=”右のタブに移動”
Case1_0=10
CommandTarget1_0=0
Wait1_0=0
Key1_0=546
TargetNumber2=1
Gesture2=3
Gesture2_0=11
Gesture2_1=13
Comment2=”左のタブに移動”
Case2_0=10
CommandTarget2_0=0
Wait2_0=0
Key2_0=545
Comment3=”ファイル新規作成”
Case3_0=10
CommandTarget3_0=0
Wait3_0=0
Key3_0=590

 
とりあえず Firefox の All in one gesture にならい、
 
– 右ドラッグしながら↑→ – タブを右に移動
– 右ドラッグしながら↑← – タブを左に移動
– 右ドラッグしながら↑ – ファイル新規作成(タブ作成)
– 右ドラッグしながら↓→ – 現在のタブのファイルを閉じる
 
としてみました。
デフォルトの設定のままだと右クリックでコンテキストメニューを開く時に一瞬ジェスチャモードに入ってもたつき感があったため、設定→マウス感度の設定→タイムアウトを短くし、150ミリ秒くらいにしました。
 
参考:
Eclipseでマウスジェスチャー