Androidエラーの傾向と対策

Q.EclipseにAndroid開発環境構築のためADT プラグインをインストールしようとしたら「要求を完了できません。詳細を参照してください。依存関係違反。次の要件を満たすソリューションがみつかりません。」とメッセージが表示される。
A.プラグインを利用するにあたり、他のプラグインのバージョンと整合がとれていない、あるいは必要なプラグインがインストールされていないと依存関係エラーになります。Eclipseのバージョンが、Androidアプリ開発システム要件を満たさない古いものであることが考えられます。バージョン3.6.2以上のEclipseで構築してみます。

Q.SDKコンポーネントを追加しようとしたら「Failed to fetch URL https://dl-ssl.google.com/android/repository/addons_list-1.xml, reason: Connection to https://dl-ssl.google.com refused 」「Failed to fetch URL https://dl-ssl.google.com/android/repository/repository-5.xml, reason: Connection to https://dl-ssl.google.com refused 」とメッセージが表示される。
A.プロキシを経由している環境ではないですか?「Android SDK Manager」でプロキシ設定を行う必要があります。(参考サイト:Android SDKとAVDのアップデートについて

Q.新規Androidプロジェクトの作成で「An SDK Target must be specified.」(SDKターゲットを指定する必要があります。)とメッセージが表示される。
A.SDKロケーションが設定されていないことが考えられます。Eclipseメニューの「ウィンドウ」→「設定」→左ペイン「Android」をクリックしてSDKロケーションにAndroid SDKの場所を設定します。

Q.新規Androidプロジェクトの作成で「java.io.FileNotFoundException」とメッセージが表示される。
A.Androidエミュレータのパスに問題があると思われます。ビルドしようとしたらライブラリがなかったという意味なので、Androidプロジェクトを右クリック→「ビルド・パス」→「ビルド・パスの構成」→左ペイン「Android」→「Project Build Target」で適切なエミュレータのバージョンをチェックし、ライブラリを選択します。

Q.新規Androidプロジェクトの作成で「%android-sdk%/tools/ant/build.xml:479: SDK does not have any Build Tools installed.」とメッセージが表示される。
A.Android SDK Manager を起動し、Android SDK Build-tools をインストールします。(参考サイト:Android SDK 22 では、Build Toolsが必要になったようです。Eclipse ADT 22 のバージョンアップでは Android SDK Manager のアップデートは 2 回する。いまどきのAndroid開発に通しておくといいPATH

Q.「ビルド・パスのエラーが解決されるまで、プロジェクトをビルドできません」または「no classfiles specified」とメッセージが表示される。
A.Androidプロジェクトを右クリック→「ビルド・パス」→「ビルド・パスの構成」→左ペイン「Java のビルド・パス」→「順序およびエクスポートタブ」で「Android X.X」などの未チェック項目を適宜チェックし、「OK」をクリックします。その後、Eclipseメニューの「プロジェクト」→「クリーン」を実行します。チェックを入れてもダメな場合は順序を上にしてみます。いったん正常に動作すれば、以後「順序およびエクスポート」のチェックをはずしても正常に動作するようです。ソースフォルダ(src)は常にエクスポート項目です。(選択解除できません)

Q.ビルドすると「Android requires compiler compliance level 5.0 or 6.0. Found ‘1.7’ instead. Please use Android Tools > Fix Project Properties.」とメッセージが表示される。
A.Androidの開発要件はJDK6(1.6)で、JDK7(1.7)は要件に沿っていません。Androidプロジェクトを右クリック→Javaコンパイラー→Javaコンパイラーの準拠レベルが「1.7」になっているはずなので「1.6」に変更し、「OK」をクリックします。

Q.プログラムが間違っていないのに 「R.layout.~」リソースの参照でエラーが起こる。
A.Androidプロジェクトを右クリック→Javaコンパイラー→Javaコンパイラーの準拠レベルが「1.6」になっているのところを「1.5」や「1.7」に変更し、「OK」をクリックします。その後、Javaコンパイラーの準拠レベルを「1.6」に戻して「OK」をクリックし、再ビルドします。

Q.「java.lang.NoClassDefFoundError」、「VFY: unable to find class referenced in signature …」エラーが起こる。
A.Android Tools Project SiteのDealing with dependencies in Android projectsにあるように、ADT 17.0.0 からライブラリを配置するフォルダが lib から libs に変更されています。プロジェクトディレクトリ内の「lib」フォルダ配下のJarをいったん退避し、フォルダ名を「libs」に変更してビルドしなおします。(参考サイト:外部jarを使ったandroidプロジェクトが起動しなくなった解決法ADT r15-> r20 にアップデートしたら実行時にエラーHow to fix the “NoClassDefFoundError” with ADT 17Androidで外部JarがAPKファイルに取り込まれなくなった時の対処法Androidアプリ開発では、外部jarファイルはlibsフォルダ内に置くこと) ADTの変更により、「libs」フォルダに置いたjarは「ビルド・パス」に設定しなくても自動で参照されます。Eclipseのパッケージエクスプローラで「Android Dependencies」に含まれているかどうかで確認できます。上記の「ビルド・パスの構成」→左ペイン「Java のビルド・パス」→「順序およびエクスポートタブ」の方法で対象jarをエクスポートして外部から可視化しても解消できます。ADT r22からはビルド・パスの「Android Private Library」のチェックを確認します。(参考サイト:Android SDK r17にアップデートしたらVerifyErrorAndroid SDKのアップデート時の注意(?)libsの中のライブラリがあるのに使えないADTでlibsフォルダ配下においたファイルが認識されないアクティビティの ClassNotFoundException の解決方法AndroidSDKをR22にしたら、アプリがエミュレータで起動しなくなった時にありがちな原因Android SDK r22 の注意点libraryのパスってどうなってるの?ADT22でのMultiple dex files defineの解決方法開発でつまづいた事!! jarファイルの参照!!

Q.「java.lang.VerifyError」とエラーメッセージが出る。
A.使えないAPIを利用しようとしています。(参考サイト:Android1.6 で発生する java.lang.VerifyError の対処メモ

Q.新規Androidプロジェクトの作成で、「The tools need to be updated via the SDK manager.  Your tools installation appears to be out of date (or not yet installed). This wizard depends on templates distributed with the Android SDK Tools.」とメッセージが表示される。
A.Android SDK managerを起動し、「Android SDK Tools」、「Android SDK Platform-tools」をチェックし、アップデート(またはインストール)します。

Q.新規Androidプロジェクトの作成で、「Install Dependencies    Unsupported templete dependency : Upgrade your Android Eclipse plugin    This templete depends on the Android Support libraly, which is either not installed, or the template depends on a more recent version than the one you have installed.」とメッセージが表示される。
A.「%ANDROID-SDK-HOME%/tools/templates/activities/BlankActivity/template.xml」ファイルを開き「<dependency name=”appcompat” version=”v7″ />」の記述を
除外して対応します。Android SDK r22.2のバグのようです。(参考サイト:AndroidSDKをrev22.2へアップデートしたらAndroid新規プロジェクトが作れなくなった

Q.新規Androidプロジェクトの作成で、あるはずのプラットフォームがターゲットのリストに表示されない。
A.Android SDK Tools で新規にPlatformを追加しただけではリストに反映されません。Eclipseを再起動する必要があります。Eclipseメニューの「ファイル」→「再開」をクリックします。

Q.Android 仮想デバイス・マネージャーの新規Android仮想デバイス作成で、あるはずのプラットフォームがターゲットのリストに表示されない。
A.Android SDK Tools で新規にPlatformを追加しただけではリストに反映されません。Eclipseを再起動する必要があります。Eclipseメニューの「ファイル」→「再開」をクリックします。

Q.Eclipseメニューの「ウィンドウ」→「設定」→左ペイン「Android」をクリックすると「com.android.sdkuilib.internal.widgets.SdkTargetSelector.access$000 (Lcom/android/sdkuilib/internal/widgets/SdkTargetSelector;)Z」とメッセージが表示される。
A.直前にADT Pluginを更新しているのにEclipse をクリーン起動しなかった場合に起こります。Eclipse (eclipse.exe)を「%ECLIPSE_HOME%/eclipse -clean」のように、「-clean」オプションを指定して起動します。Eclipseのショートカットを作成してオプション指定するのが簡単です。(参考サイト:Android 4.0 (ADT)での罠Eclipseのキャッシュを削除する。(クリーン起動)『Pleiades でエラーが発生しました。』の対処法ex.1 ECLIPSEの日本語化eclipse.exeの-cleanオプションをショートカットに設定するクリーン起動MacのEclipseをclean起動するコマンドEclipseが起動しなくなったときにやってみること(cleanオプション)Eclipseエラー・・・

Q.レイアウト(*.xml)を編集しようとしたら「エラーが発生しました。詳細については、エラー・ログを参照してください。com/android/ide/eclipse/adt/~」とメッセージが表示され開けない。
A.直前にADT Pluginを更新しているのにEclipse をクリーン起動しなかった場合に起こります。Eclipse (eclipse.exe)を「%ECLIPSE_HOME%/eclipse -clean」のように、「-clean」オプションを指定して起動します。Eclipseのショートカットを作成してオプション指定するのが簡単です。(参考サイト:main.xmlが開けないエラーADT-Pluginインストールで長ったらしいエラーが出た。ADT11.0導入によるレイアウトエディタエラー発生時の対処com/android/ide/eclipse/adt/internal/resources/configurations/FolderConfigurationのエラー

Q.Graphical Layoutが表示されない。「java.lang.NullPointerException」「Exception details are logged in Window > Show View > Error Log」とメッセージが表示される。
A.Eclipse をクリーン起動し、「Graphical Layout」右上の「ターゲットビルド」を、プロジェクトのSDKバージョンにします。(参考サイト:Android 「main.xmlが開けない」「Graphical Layoutが表示されない」取りまとめeclipseのXMLデザイナーが開かないレイアウトが表示されない(java.lang.NullPointerException)

カスタムビューを使用している場合など、 isInEditMode() を記述して処理を抑止すると解消する場合があります。(参考サイト:EclipseのLayout Editor でエラーが吐かれる。Android のレイアウト XML を Eclipse の Graphic Layout で表示できないカスタムView作成時のメモAndroidのつまずき-SurfaceViewが重ならない?!

Q.LogCatを起動しようとしたら「ビューを作成できませんでした: com.android.ddmuilib.logcat.LogCatPanel$13.(Lcom/android/ddmuilib/logcat/Log CatPanel;)V」とメッセージが表示される。
A.直前にADT Pluginを更新しているのにEclipse をクリーン起動しなかった場合に起こります。Eclipse (eclipse.exe)を「%ECLIPSE_HOME%/eclipse -clean」のように、「-clean」オプションを指定して起動します。Eclipseのショートカットを作成してオプション指定するのが簡単です。

Q.「INSTALL_FAILED_MISSING_SHARED_LIBRARY」エラーが起こる。
A.Androidプロジェクトのビルド・ターゲットが「Google APIs」なのに、AVDのターゲットが一般の「Android X.X.X”となっているはずなので、AVDのターゲットを「Google APIs」にします。

Q.Androidプロジェクトを実行したら「Your project contains error(s),please fix them begore running your application」とメッセージが表示される。
A.Eclipseメニューの「プロジェクト」→「クリーン」を実行してみます。これで解決しない場合は、ソースの一部を編集(わざと空白を挿入して削除するなど)してから「クリーン」を実行してみます。

Q.Android SDKを更新しようとしたら「Warning ! A folder failed to be moved. On Windows this typically means that a > program is using that folder > (for example Windows Explorer or your anti-virus software.)」とメッセージが表示される。
A.Eclipseやエクスプローラーなどの他のプログラムが「android-sdk-windows」フォルダを掴んでいます。掴んでいるプログラムを閉じるようにします。不明なら、Windowsを再起動してみます。(参考サイト:Androidアプリ開発において、エラーの対処方法2Android2.3.3環境構築(installer_r10-windows)Android SDKのAndroid SDK Toolsアップデート時に”A folder failed to be moved.” エラーが発生する

Q.Android SDKを更新したら「ERROR: Unknown command ‘crunch’」エラーが起こる。
A. Android SDK Manager を確認します。更新が必要な部分に「Update available」 の表示とともにチェックが入っているものを更新します。(参考サイト:ERROR: Unknown command ‘crunch’ 出ました~♪

Q.Android SDK r22に更新したらおかしくなった。起動しなくなった。
A. Android SDK r22以降は、「Android SDK Build-tools」が増えています。クリーン起動を試してみます。(参考サイト:Eclipse ADT 22 のバージョンアップでは Android SDK Manager のアップデートは 2 回する。

Q.AVDを作成しようとしたら、CPU/ABIの欄が「No systemimages installed for this target」と表示されている。
A.SDK Managerでsystem imageをインストールする必要があります。なお、インストールして一度Eclipseを再起動しないと表示は変化しません。(参考サイト:AVDが作成できない

Q.AVDを起動しようとしたら「Failed to install XXX.apk on device ‘emulator-5554′: timeout Launch canceled!」とメッセージが表示される。
A.マシンのスペックが低いと起動までに時間がかかるため、タイムアウトの時間を長くする必要があります。Eclipseメニューの「ウィンドウ」→「設定」→左ペイン「Android」→「DDMS」をクリックし、「ADB Connection timeout(ms)」の値を大きくします。(参考サイト:timeoutエラーが発生する

Q.AVDを起動しようとしたら「PANIC: Could not open AVD config file」とメッセージが表示される。
A.AVD作成時のWindoiwsログインユーザー名が日本語、SDKのPathに半角スペースある、あるいはユーザーフォルダの位置をCドライブ以外に移動していると起こります。

環境変数「ANDROID_SDK_HOME」を利用してAVDのパスを設定します。(参考サイト:AVDの保存場所を設定ANDROID_SDK_HOMEを設定する。Android開発環境構築(その 7):Eclipse AVDの作成とエミュレーターの起動PANIC: Could not open AVD config fileeclipseでエミュレーター起動時に「PANIC: Could not open:アンドロイドのエミュレーターを作成する

あるいはWindows Vista以降なら、コマンドプロンプトからmklinkコマンドでシンボリック リンクを作成しても対応できます。XPでもリソースキットをインストールすれば対応できます。(参考サイト:Android:AVDが起動しない(PANIC:Could not open…)エミュレータが起動しない(PANIC: Could not open: C:Users…)Androidのエミュレータが起動しない

Q.問題ビューに「Error generating final archive: Debug certificate expired on YY/MM/DD hh:mm」とメッセージが表示される。
A.debug.keystore(デバッグ用証明書)の有効期限は標準で365日に設定されています。Androidインストールから1年たって有効期限切れになるとこのメッセージが表示され、今まで普通にコンパイルできていたものもエラーになります。Eclipseメニューの「ウィンドウ」→「設定」→左ペイン「Android」→「Build」をクリックして 「デフォルトのデバッグキーストア」の場所を確認します。デバッグ用証明書は、ここに存在するものが使われ、存在しなければ、自動的にSDKが発行してくれます。確認したパスの「debug.keystore」を削除してからEclipseを再起動して、Eclipseメニューの「プロジェクト」→「クリーン」を実行します。なお、本番用の証明書は紛失しないよう注意しないとアップデートできません。(参考サイト:apk は前のバージョンと同じ証明書で署名する必要があります。

Q.問題ビューに「[アクセシビリティ] Missing contentDescription attribute on  image」と警告メッセージが表示される。
A.プロジェクト・ビルドターゲットが Android 4.0 以上で、xml ファイルの ImageView に android:contentDescription が無いとこの警告が出ます。(参考サイト:Android 4.0でアクセシビリティを向上させるImageViewで出てた警告[Android] [アクセシビリティ] Missing contentDescription attribute on image

Q.プロジェクトをインポートしたら「Project has no default.properties file! Edit the project properties to set one.」とメッセージが表示される。
A.
「default.properties」ファイルが欠落しています。(参考サイト:サンプルで画面遷移の仕方を確認【Android】インポート時のエラー対応メモ【eclipse】

Q.プロジェクトをインポートしたら「Unable to resolve target ‘android-x’」(ターゲット’アンドロイド-X’を解決できません)とメッセージが表示される。
A.プロジェクトが指定しているAndroidプラットフォームがインストールされていません。Android SDK マネージャー を起動し、メッセージに表示されたプラットフォームをインストールするか、「project.properties」ファイル(r14未満の古いandroid SDK のバージョンでは「default.properties」)のtargetを変更します。(参考サイト:アプリケーションの作成方法プロジェクトのインポートに於けるエラーについてエラー対処方法5Unable to resolve target ‘android-4′Eclipse で Android sl4a のプログラムを作成してみるADT 14.0.0 (for Android4.0) の変更点 [ADT Plugin for Eclipse 翻訳]

Q.@Overrideアノテーションで「スーパークラスのメソッドをオーバーライドする必要があります」メッセージが表示される。
A.Eclipseの「コンパイラー準拠レベル」の設定がJava5(1.5)になっていて、「onClick(View)」のようなインターフェースの実装に記述すると発生します。

@Overrideアノテーションは、スーパークラス(親クラス、基底クラス)のメソッドをサブクラス(子クラス、派生クラス)でオーバーライド(スーパークラスで定義されているメソッドを上書き)していることを明示するものです。宣言することで、メソッド名、戻り値の型、引数の数と型がスーパークラスと同じでないとエラーになるので、記述間違いを防ぐことができます。けれども、Java5ではインターフェースの実装で@Overrideアノテーションを記述できません。 インターフェースの実装でも記述できるようになったのはJava6からです。

Pleiades all in One 3.7.2 (Eclipse3.7) 以前は、既定の「コンパイラー準拠レベル」の設定がJava5(1.5)になっているので、Java6(1.6)に設定しないと発生します。

Eclipseメニューの「ウィンドウ(Window)」→「設定(Preferences)」→左側ペインで「Java」→「コンパイラー(Compiler) 」を選択します。右側ペインで、「コンパイラー準拠レベル(Compiler compliance Level)」を選択します。「1.6」を設定し、設定画面の「OK」をクリックします。コンパイラー設定が変更ダイアログが出て、フル・ビルドを行うか問われるので「はい」をクリックします。

解決しない場合は、パッケージエクスプローラでプロジェクトを右クリック→「プロパティ」→左側ペインで「Javaコンパイラー 」を選択します。「プロジェクト固有の設定を可能にする」にチェックが入っていて、「コンパイラー準拠レベル」の設定がJava5(1.5)になっていると思いますので、Java6(1.6)に設定します。(参考サイト:@Override アノテーション@Overrideのエラーを解決してみた@Overrideをつけると「スーパークラスのメソッドをオーバーライドする必要があります」エラーになる問題解決Eclipseでアノテーション@Overrideを取り除けというエラーが出た

Q.Android SDK マネージャーでコンポーネントをアップデートしようとしたら「Failed to fetch URL https://dl-ssl.google.com/android/repository/repository-7.xml, reason: IO Unknown Host dl-ssl.google.com.~」とメッセージが表示される。
A.プロキシ設定が原因の可能性があります。「Settings」をクリックし設定します。(参考サイト:Android SDK Managerでfetchに失敗するAndroid SDK の各バージョンを手動でインストールする

Q.アプリを更新しようとしたら「パッケージファイルが無効です」とメッセージが表示される。
A.端末の保存容量がいっぱいになっていると、失敗します。アプリを一度アンインストールするか、「Google Playストア」の「キャッシュを消去」や「データの消去」をしてからやり直すようにします。あるいは、WiFi接続で更新している場合は、データ通信(3GもしくはLTE)に切り替えてみます。(参考サイト:「パッケージファイルが無効です」メッセージでアプリのインストール、更新ができない場合の対処法エラーが出てインストールできない

Q.実行したら、端末画面に「[!]エラー アプリ名(com.example.sample)が予期せず停止しました。やり直してください。」と表示される。LogCatに「Uncaught handler: thread main exiting due to uncaught exception」  「android.content.ActivityNotFoundException: Unable to find explicit activity class {com.example.sample/ClassName}; have you declared this activity in your AndroidManifest.xml?」とメッセージが表示される。
A.全てのActivityはマニフェストファイル「AndroidManifest.xml」に<activity>タグで宣言されている必要があります。パッケージ名とクラス名をあわせた完全修飾クラス名で記述しますが、<manifest>タグで指定したパッケージに属していれば、パッケージ名を省略し「.」(ピリオド)+クラス名での記述ができます。宣言されていない画面(Activity)を呼び出そうとするとこのエラーになります。すなわち、intent命令で呼び出そうとしたActivity名を書き漏らしているか、書き間違っているのが原因です。例えばパッケージ名やファイル名を修正して名前を変えたのに、「AndroidManifest.xml」中の名前が以前のままの場合に起こります。(参考サイト:アクティビティの追加EclipseでのActivityの追加方法開発初心者がよくやる失敗【コーディング編】(1)AndroidManifest と画面遷移android:nameのパスは絶対か相対か?AndroidプロジェクトでEclipseを使ってソース構成を変えずにパッケージ名のみサクッと変更するアプリのパッケージ名を変更する

Q.実行したら、端末画面に「[!]エラー アプリ名(com.example.sample)が予期せず停止しました。やり直してください。」と表示される。LogCatに「Uncaught handler: thread main exiting due to uncaught exception」  「java.lang.RuntimeException: Unable to instance activity ComponentInfo(com.example.sample/ClassName}: java.lang.ClassNotFoundException: com.example.sample.ClassName in loader dalvik.system.PathClassLoader@xxxxxxxx」とメッセージが表示される。
A.intent命令で呼び出そうとしたActivityが存在しません。呼び出そうとしたActivityの「xxx.java」ファイルの名前を書き違えていないかチェックします。

Q.実行したら、端末画面に「[!]エラー アプリ名(com.example.sample)が予期せず停止しました。やり直してください。」と表示される。LogCatに「java.lang.RuntimeException: Unable to start activity ComponentInfo(com.example.sample/com.example.sample.MainActivity): android.util.AndroidRuntimeException: requestFeature() must be called before adding content」とメッセージが表示される。
A.タイトルを非表示にする 「requestWindowFeature(Window.FEATURE_NO_TITLE)」 の記述をMainActivityにしているはずです。「setContentView(ビュー名)」 の記述より先に記述します。(参考サイト:アクティビティのタイトルを表示しない方法

Q.実行したら、端末画面に「[!]エラー アプリ名(com.example.sample)が予期せず停止しました。やり直してください。」と表示される。LogCatに「Uncaught handler: thread main exiting due to uncaught exception」  「java.lang.RuntimeException: Unable to start activity ComponentInfo(com.example.sample/ClassName}: java.lang.NullPointerException」とメッセージが表示される。
A.intent命令で呼び出そうとしたActivityのonCreate()メソッド内にエラーがあります。参照しようとした変数の値がnull(値が定まっていない状態)のものがあります。(参考サイト:findViewByIdはsetContentViewの後でAlertDialog#findViewByIdはshow以降じゃないと使えないAndroid SDK の動かないコード(中級編) ListView内の要素にアクセスしようとするとNullPointerExceptionで落ちるエラーコードに間違いがないはずなのにNullPointerExceptionが返ってくる

Q.実行したら「No Launcher activity found!」「The launch will only sync the application package on the device!」とメッセージが表示される。
A.
マニフェストファイル「AndroidManifest.xml」内の<activity>タグに、
<intent-filter>
<action android:name=”android.intent.action.MAIN” />
<category android:name=”android.intent.category.LAUNCHER” />
</intent-filter>
を追記します。(参考サイト:Androidアプリケーション実行時にNo Launcher activity found!が出て実行できないときにやったことAndroidアプリで最初に呼び出されるクラスを用意するまでのエラーとその対策メモ

Q.実行したら「Re-Installation Failed Due To Different Application Signatures.」「Please execute ‘adb uninstall パッケージ名.アプリ名’  in a shell.」とメッセージが表示される。
A.
一旦アプリを削除してからインストールします。以前とファイルの署名が異なるapkファイルをインストールしようとするとこのメッセージが出ます。例えば、アプリをチーム(複数の人間)で開発していて、実機やエミュレータへ上書きインストールしようとしたときに、開発者ごとに異なるデバッグ用キーストアを使用していると頻繁に起こり得ます。インストール済みのアプリを削除しないとインストールできません。解決策として、Eclipseメニューの「ウィンドウ」→「設定」→左ペイン「Android」→「ビルド」とした右ペインの「カスタム・デバッグ・キーストア」欄に開発者共通のキーストアを用いると煩わしくありません。(参考サイト:Launch canceled!Android MapViewで使用するapiKeyの共有

Q.実行したら「Unfortunately, (app) has stopped.」とメッセージが表示される。
A.「AndroidManifest.xml」に必要な設定が足りていません。(参考サイト:Android 「Unfortunately, (app) has stopped.」 エラーの対応記録

Q.実行したら「Unfortunately, Launcher has stopped.」とメッセージが表示される。
A.「.avd/config.ini」を修正してみます。(参考サイト:Nexus7用エミュレータが起動しない、「Unfortunately, Launcher has stopped.」の直し方

Q.実行したら「unfortunately system ui has stopped」とメッセージが表示される。
A.「GPU Support」をOFFにしてみます。(参考サイト:SDK 18 リリース Emulator GPU サポート

Q.実行したら「Failed to allocate memory: 8」とメッセージが表示される。
A.エミュレータ作成時のMemory Options の RAMサイズを768MiB(メビバイト)以下にします。Windowsでは、Android AVDに設定できるメモリサイズは1GiB(ギビバイト)の上限があります。例えば「nexus7」エミュレータの設定では、デフォルトが1024MiBとなっており、小さくしないとエラーになります。(参考サイト:Android開発でつまずいたこと色々Android/SDKインストール(r21)Android AVDを作成するMiB(メビバイト)、GiB(ギビバイト)と言う単位について

Q.実行したら「The application demetter(process com.android) has stopped unexpectedly. Please try again.」「Unable to find explicit activity class {画面名}; have you declared this activity in your AndroidManifest.xml?」とメッセージが表示される。
A.「AndroidManifest.xml」に新規に追加した画面名の記述(<activity android:name=”画面名”></activity>)が足りていません。(参考サイト:Androidアプリ開発初心者がつまずきやすい6のポイント

Q.実行したら「Failed to install Test.apk on device ‘emulator-5554′: タイムアウト起動はキャンセルされました!」とメッセージが表示される。
A.AVD上にアプリをインストールする時間がかかりすぎたことによります。パソコンの性能が低いと起こるようです。タイムアウトの時間を調整します。Eclipseメニューの「ウィンドウ」→「設定」→「Android」→「DDMS」→「ADB接続タイム・アウト(ミリ秒)」の値が「5000」となっているところを例えば「20000」のように大きくします。

Q.実行したら「the user data image is used by another emulator. aborting」とメッセージが表示される。
A.「DDMS」パースペクティブに切り替え、「Devices」ビュー→「▼ボタン」→「Reset adb」をクリックします。あるいは、エミュレーターを再起動してキャッシュをクリアします。(参考サイト:Android、「emulator-5554 disconnected! Cancelling …」「emulator: エラー: the user data image is used by another emulator. aborting」eclipseのDDMSパースペクティブでandroidエミュレータのDevices情報やファイルエクスプローラが消える時の対処法エミュレータのエラーthe user data image is used by another emulator. aborting

Q.実行したら「警告: Application does not specify an API level requirement!」とメッセージが表示される。
A.
マニフェストファイル「AndroidManifest.xml」内にminSdkVersion が指定されていない
とこの警告が出ます。(参考サイト:GALAXY Tab の画面にフィットしないアプリケーション01.チュートリアル

<+α>

r20以降では「Androidプロジェクト」がないので戸惑いますが、「Androidアプリケーション・プロジェクト」が相当します。参考サイトを以下に記します。

ADTはバージョンにより構成が変わっているので、以前のバージョンで説明した本やサイトをみても話がかみ合いません。参考サイトを以下に記します。

Android プログラムを、Eclipseにインポートする際の参考サイトを以下に記します。

その他

アンドロイドアプリ開発環境を Pleiades All in One 4.2で構築する (Android 4.2 Jelly Bean)

・2012年12月31日 – Java SE 6 バージョンアップ(参考サイト:Oracle Blogs 日本語のまとめ-Java SE Updates)に伴い、 Java SE Development Kit 6 Update 37 →  Java SE Development Kit 6 Update 38 、jdk-6u37-windows-i586.exe → jdk-6u38-windows-i586.exe 、jdk1.6.0_37 → jdk1.6.0_38 といったように記述を修正しました。
・2012年11月25日 – Pleiades All in One のバージョンアップと Android 4.1 → Android 4.2 のバージョンアップに伴い、記述を修正しました。あわせて題字をAndroid 4.1→ Android 4.2に修正しました。
・2012年11月18日 より最新の Eclipse IDE with built-in ADT で Android 4.2 開発環境を構築する を別ページに記述しました。
・2012年10月20日 – Java Update に伴い、Javaのバージョンなどの記述を修正しました。
・2012年10月08日 – Pleiades All in One 4.2.1.v20121007 がリリースされたのに伴い Pleiades All in One のバージョンなどの記述を修正しました。


Eclipse Juno 対応の Pleiades All in One 4.2 の 32ビット版 がリリースされたので、アンドロイドアプリ開発環境を構築し直しました。

私のパソコンは32ビットで、当初の Pleiades All in One 4.2 は 64ビット版しかなかったため、利用をあきらめて Android4.1:Jelly Bean (Java6 update33 + Android SDK r20 + Eclipse4.2 + Pleiades1.3.4 + ADT r20)をインストールしてみた のように環境構築したのですが、Pleiades All in One 4.2 の 32ビット版ができたので開発環境をまっさらにしてインストールし直しました。

《事前事項1 漢字などの全角文字を含まないユーザー名でログインする》

漢字などの全角文字を含んだユーザー名でログインして環境を構築していくと、パスを認識してくれない不具合で、Android仮想端末(エミュレータ)を作成するときにエラーになります。漢字ユーザー名のまま作業した場合面倒になるのでおすすめしません。(参考サイト:全角ログオン名はトラブルの元ですAndroid SDK and AVD Manager が起動しない問題

《事前事項2 ファイルの拡張子が表示されるよう設定する》

Windows標準設定のままでは、ピリオド(.)以降の拡張子が表示されません。圧縮ファイルは「xxxxx.zip」、実行ファイルは「xxxxx.exe」というように、拡張子が表示されるほうがファイルタイプが判別しやすくなります。(参考サイト:ファイルの拡張子を表示するには?

  1. 「Windows」+「E」キーを押してエクスプローラを起動します。
  2. 「Alt」+「T」キーを押して、「フォルダオプション」をクリックします。
  3. 「表示」タブをクリックし「詳細設定」リストの中の「登録されている拡張子は表示しない」のチェックをはずし、「OK」ボタンをクリックします。

《事前事項3 以前の設定を削除する》

Java7、Java6両方と、Eclipse、Android SDK、AVD情報のある「.android」フォルダをすべて削除しました。

Java7とJava6はコントロールパネルの「プログラムと機能」を利用して削除します。Javaの削除は必須ではなく、残していてかまいません。手順1の最後の方で後述しますが、JREあり版のEclipseの場合は、残したJavaがあってもEclipseの起動に利用しません。

Javaを削除した場合、「Windows」キーを押しながら「R」キーを押して”ファイル名を指定して実行”画面の名前欄に「cmd」と入力し、「OK」をクリックして開いた”コマンドプロンプト”画面で、「java -version」と入力すると、「`java`は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチファイルとして認識されていません。」とエラーになります。

Eclipseはレジストリを汚していないのでアンインストールはファルダごと削除するだけです。Eclipse削除前に、過去のソースがある「workspace」フォルダはバックアップします。Eclipseを「Program Files」配下にインストールしていた場合は「.eclipse」フォルダができているので適宜削除します。

Android SDKはインストーラ版を利用していればスタートメニューに「Android uninstall」があるのでこれを選択します。zip版だった場合はAndroid SDKのフォルダごと削除します。

Android SDK Tools をインストールすると、「.android」フォルダが作成されます。「.android」フォルダには、Android SDK Tools のインストール先や、エミュレータの設定などの情報が保管されます。以前にAndroid SDK Tools をインストールしたことがあり、「.android」フォルダが存在する場合は、ADTプラグインインストール後のEclipse 再起動時に、”Android開発へようこそ”画面にならず、この先の説明と動きが異なります。Eclipseは一台のパソコンに複数存在させることが可能ですが、以前のAndroid環境導入済みのEclipseを残したまま、別のEclipseをインストールして別のAndroid開発環境を構築しようとしても、AVD情報などは同一の「.android」フォルダを共有する形になるので、”Android開発へようこそ”画面になりません。

「.android」フォルダの場所はWindowsのバージョンによって異なります。
Windows XP → C:¥Documents and Settings¥<user-name>¥.android
Windows Vista/7 → C:¥User¥<user-name>¥.android
になります。<user-name>はユーザー名(ログイン名)になります。

注意点として、Google Playにアプリを出したのであれば、通常は「.android」フォルダ内に本番用のkeystore(証明書)があります。紛失するとGoogle Playに出したアプリをアップデートできなくなるので退避します。(参考サイト:A_アプリのデジタル署名 

1.Eclipseのインストール

Eclipse日本語化プラグインのPleiadesプラグインを適用済みの、 Pleiades All in One JREあり Platform 版 をインストールします。Androidアプリ開発システム要件で、EclipseはJDT(Java Development Tool:Java開発ツール)プラグインを含んでいることとされており、EclipseのサイトではEclipse Classic 4.2.1版かEclipse IDE for Java Developers版かEclipse IDE for Java EE Developers版、Pleiades All in One 日本語ディストリビューションのサイトではUltimate版かJava版が相当します。Pleiades All in One のPlatform版はJDTプラグインを含まないので、アンドロイドアプリ開発環境構築に適さないようにみえますが、試したところADTプラグインインストールのタイミングでJDTプラグインも入るようです。そこで、軽量なPlatform版をベースに環境を構築することにしました。(プラグインで機能拡張できる開発環境 Eclipse

※私の環境32ビットオペレーティングシステムではPlatform版をベースに問題なく環境を構築できたのですが、64ビットオペレーティングシステム利用の方からUltimate版でなければ環境を構築できなかったという報告をいただきました。

  1. Pleiades All in One 日本語ディストリビューションで、Pleiades All in One 4.2.0.v20120707 (Eclipse 4.2.0 Juno for Windows ベース) 32ビット JREあり Platform Pleiades All in One 4.2.0.v20120804 (Eclipse 4.2.0 Juno for Windows ベース) JREあり Platform Pleiades All in One 4.2.1.v20121007 (Eclipse 4.2.1 SR1 Juno for Windows ベース) PlatformPleiades All in One 4.2.1.v20121123 (Eclipse 4.2.1 SR1 Juno for Windows ベース) 32bit Full Edition のDownloadアイコンをクリックします。
  2. ダウンロードした pleiades-e4.2-platform-32bit-jre_20120707.zip pleiades-e4.2-platform-32bit-jre_20120804.zip pleiades-e4.2-platform-32bit-jre_20121007.zip pleiades-e4.2-platform-32bit-jre_20121123.zip を右クリックし、「すべて展開」をクリックします。
  3. 「圧縮(ZIP形式)フォルダの展開」画面が開いたら、「ファイルを下のファルダヘ展開する」欄のフォルダを「C:\pleiades」(任意)に変えます。任意と書きましたが、「Program Files」フォルダは避けることを勧めます。WindowsVistaとWindows7では、「Program Files」フォルダはアクセス制限が働き、管理者権限で実行しないと更新に失敗するからです。(参考サイト:ANDROID開発環境構築、行き詰った個所まとめ。AndroidSDK Managerでアクセスが拒否されました。と更新に失敗するAndroidアプリを実機で試したいのですが、Android SDK ManagerでGoogle USB Driverをインストールしようとすると「アクセスが拒否されました」と表示されできません。
  4. 「完了時に展開されたファイルを表示する」にチェックを入れたまま「展開」をクリックします。
  5. 展開が終わるとエクスプローラが自動起動し、「C:\pleiades」フォルダが開くので、「pleiades」フォルダをダブルクリック→「eclipse」フォルダをダブルクリックします。
  6. 「eclipse.exe」を右クリック→「プロパティ」をクリック→「互換性」タブをクリックして、「特権レベル」の「管理者としてこのプログラムを実行する」にチェックが入っているのを確認し、「OK」をクリックします。
  7. 「eclipse.exe」をダブルクリックします。(あるいはAndroidアプリ開発環境を 42分で構築する(1時間切りに挑戦)の《2 Eclipse を起動する》を参考に適宜ショートカットを作成し、ショートカットから起動します。)
  8. 「ユーザーアカウント制御」画面が開き、「認識できないプログラムがこのコンピュータへのアクセスを要求しています。」と表示されるので、「許可」をクリックします。なお、前項で説明した「特権レベル」の「管理者としてこのプログラムを実行する」にチェックが入っていない場合は、「開いているファイル-セキュリティの警告」画面が開き、「発行元を確認できませんでした。このソフトウェアを実行しますか?」となります。(参考サイト:Windows Vista で “認識できないプログラムがこのコンピュータへのアクセスを要求しています” !?セキュリティがめんどくさいぞ…Windows7での開発
  9. Eclipseの起動スプラッシュ画面が表示され、「キャッシュのクリーンアップ中…この処理は数分かかる場合があります。しばらくお待ちください。」となるので、30秒ほど待ちます。
  10. 「ワークスペース・ランチャー」画面が開いたら、「ワークスペース」は「../workspace」のまま(変更しても良いですが、空白や漢字交じりのものはトラブルのもとなので避けます)、「この選択をデフォルトとして使用し、今後この質問を表示しない」をチェックし、「OK」をクリックします。(参考サイト:Eclipse の起動または終了時のダイアログ表示についてEclipse 3.5でワークスペースの選択ダイアログをカスタマイズする

ZIPファイルの解凍は、上で示したWindows展開ウィザードを利用します。それ以外の解凍ツールを利用した場合、Eclipse起動時に、Eclipse起動時エラーの傾向と対策に示したように「An error has occured. See the log file (XXXX)¥eclipse:¥configuration¥(起動時のエポック秒).log」とエラーになることがあります。

ZIP ファイルの関連付けが他の解凍ツールになされてるとWindows展開ウィザードになりません。非推奨の解凍ツールでも、解凍先のパス名が「C:\pleiades」といった短いものであれば解凍は失敗しないはずですが、Windows展開ウィザードで解凍したい場合の参考サイトを記します。(参考サイト:zipファイルの規定プログラムを誤って関連付けてしまったZIP ファイルの関連付けの設定を初期化したいWindows の関連づけ設定の仕組み

Javaを削除したことで、JRE(Java Runtime Environment:Java 実行環境)が存在しないはずなのにEclipseは起動します。Pleiades All in One の JREあり版は、Eclipseインストールフォルダ配下の「jre」フォルダにJREが組み込まれており、これを利用するからです。コンピュータ内に他にJava(JREやJDK)が存在したとしても、Eclipse自身が持っているJREが最優先で使用されます。

Eclipseに組み込みのJREがある場合は、環境変数「Path」でJava(JREやJDK)のパスを記述してあってもそれは使用されません。Eclipseメニューの「ヘルプ」→「Eclipseプラットフォームについて」→「インストール詳細」→「構成」タブをクリックして表示される情報の、「-vm」の次の行を見ると起動に使用されたJREを確認することができます。(参考サイト:Eclipse 起動時に使用されている Java VM を確認してみよう

2.JDK(Java SE Development Kit:Java 開発キット)のインストール

Androidアプリ開発システム要件ではJDK6を利用するよう書かれているので、JDK7ではなくJDK6をインストールします。Androidアプリ開発環境を 42分で構築する(1時間切りに挑戦)で利用したPleiades All in One JREあり Java 版は、JDK6を含んでいたので、別途JDKのインストールをしませんでした。けれども、Platform 版は、いずれのJDKも含んでいないので、JDKのインストールをおこないます。

  1. Java SE Downloadsへ進み、Java SE 6  Update 33 Update 34 Update 35 Update 37 Update 38 のJDK のDOWNLOADアイコンをクリックします。
  2. Java SE Development Kit 6 Update 38 の「Accept License Agreement」にチェックを入れ、「jdk-6u38-windows-i586.exe」を選択します。
  3. ダウンロードが終わると自動でインストールが始まります。(自動で開始しない場合はダウンロードした「jdk-6u38-windows-i586.exe」をダブルクリックします。)
  4. 「ユーザーアカウント制御」画面が開き、プログラムを続行する許可を求められるので、「続行」をクリックします。
  5. 「Java(TM)SE Development Kit 6 Update 38 - セットアップ」画面が開くので、「次へ」をクリックします。
  6. 「カスタムセットアップ」画面になり、「開発ツール」・「ソースコード」・「公開JRE」(同一バージョンの「公開JRE」がインストール済みの場合表示されません)・「JavaDB」(JDK7の場合は表示されません)が表示されます。今回は「開発ツール」・「ソースコード」だけインストールしようと思うので、「公開JRE」・「JavaDB」は行頭のドライブアイコン左クリックし「この機能を使用できないようにします。」を選択します。 「開発ツール」・「ソースコード」のインストール先は、デフォルトの「C:\Program Files\Java\jdk1.6.0_38\」のままとし、「次へ」をクリックします。(「JavaDB」をインストールする場合、「JavaDB」のインストール先のデフォルトは「C:\Program Files\Sun\JavaDB\」で、「開発ツール」・「ソースコード」のインストール先とは異なります。)
  7. 「Java(TM)SE Development Kit 6 Update 38 - 完了」画面になったら「完了」をクリックします。
  8. ブラウザが起動し「Java Development Kit (JDK) Registration」画面が開き、利用者登録を促されますが、しなくてもJavaは使用できるので、ブラウザ画面を閉じます。

※よくわからなければ「開発ツール」・「ソースコード」・「公開JRE」・「JavaDB」を全部インストールして問題ないので、デフォルト(規定の設定)のままでインストールしてください。(参考サイト:Java 6のJava DBでデータベースJava DB に関するよくある質問 (FAQ)

※最低限「開発ツール」だけをインストールすればAndroid環境は構築できます。「ソースコード」をインストールしなかった場合、プログラム実行時にエラーになってデバッグモードで標準APIのclassファイルにステップインする際に、「ソースが見つかりませんでした。」と表示され戸惑います。そのため、「ソースコード」もインストールするのが良いと思います。

※最初に「開発ツール」だけをインストールし、後からやはり「ソースコード」もインストールしたいなど、インストールの構成を変えたい場合は、ダウンロードフォルダに残っている「jdk-6u38-windows-i586.exe」をダブルクリックします。「ユーザーアカウント制御」画面に続き、「このソフトウエアは使用中のコンピュータにすでにインストールされています。再インストールしますか?」と問われるので「はい」をクリックします。「カスタムセットアップ」画面で希望するインストールの構成を選択し直します。(「インストールパッケージを開くことができませんでした。パッケージが存在し、アクセスできることを確認してください。またはアプリケーション ベンダに問い合わせ、このパッケージが有効な Windows インストーラ パッケージであることを確認してください。」となってしまった場合は「OK」をクリックし、もう一度やりなおせば再インストールできます。)

※Java SE 6 のサポートは当初2012年7月まででしたが、 2012年11月へ変更され、さらに 2013年2月まで延長されています。(参考サイト:Oracle Java SE サポート・ロードマップOracle Java SE Support Roadmap

3.環境変数の設定

環境変数の設定についてはEclipseとJREとJDKの「パスをとおす」や「「Path」の設定確認」を一読いただくといいかもしれません。

  1. 「Windows」キーを押しながら「Pause」キーを押して「システム」画面を開き、左欄のタスク上から4つ目の「システム詳細設定」をクリックします。(参考サイト:Windows XPマシンで[システムのプロパティ]を簡単に起動したい
  2. 「ユーザーアカウント制御」画面が開いたら「続行」をクリックします。
  3. 「システムのプロパティ」画面が開いたら、詳細設定タブの「環境変数」をクリックします。
  4. 「環境変数」画面が開いたら、システム環境変数の「新規」ボタンをクリックします。
  5. 「新しいシステム変数」画面が開いたら、変数名に「JAVA_HOME」、変数値に「C:\Program Files\Java\jdk1.6.0_38」と入力し、「OK」をクリックします。”Program”と”Files”の間に半角空白がありますが 「”C:\Program Files\Java\jdk1.6.0_38″」とダブルクォーテーションで括る必要はありません。既にシステム環境変数に「JAVA_HOME」が存在する場合は、「JAVA_HOME」をダブルクリックし、変数値を「C:\Program Files\Java\jdk1.6.0_38」に置き換え、「OK」をクリックします。
  6. 次に、システム環境変数「Path」をダブルクリックします。「システム変数の編集」画面が開き、既存の変数値が表示されたら、変数値入力欄をクリックし、左矢印キーで確実に入力値の文字列先頭まで移動し、文字列先頭に「%JAVA_HOME%\bin;」を追記します。
  7. コマンドプロンプトでAndroidツールズを起動する場合を考えて、システム環境変数「Path」の最後に「;C:\android-sdk\tools;C:\android-sdk\platform-tools」も追記します。
  8. 「システム変数の編集」画面で「OK」をクリックします。
  9. 「環境変数」画面で「OK」をクリックします。
  10. 「システムのプロパティ」画面で「OK」をクリックします。
  11. 「Windows」キーを押しながら「R」キーを押して”ファイル名を指定して実行”画面の名前欄に「cmd」と入力し、「OK」をクリックして”コマンドプロンプト”画面を開きます。環境変数を設定するときに既に開いていた”コマンドプロンプト”画面がある場合、その画面には変更した設定が反映されません。新しい別の”コマンドプロンプト”画面を開く必要があります。
  12. 「java -version」と入力すると「java version “1.6.0_38″」が、「javac -version」と入力すると「javac 1.6.0_38」が表示されれば正しく設定されています。期待通りにならない場合は、「Path」と入力して設定を確認します。なお、両コマンドの「-version」オプションの部分はすべて小文字で入力しないと、「Unrecognized option: -VERSION  Could not create the Java virtual machine.」や「javac: -VERSION は無効なフラグです。」といったエラーになります。このように大文字と小文字を違うものとして認識することをケースセンシティブ(Case sensitive)といいます。

※私の環境の場合を例にとると、元々のシステム環境変数「Path」の値が「%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;C:\Program Files\Edy\Edy Library;C:\Program Files\Common Files\Adobe\AGL;C:\Program Files\Common Files\Sony Shared\FeliCaLibrary;c:\Program Files\Common Files\Roxio Shared\DLLShared\;c:\Program Files\Common Files\Roxio Shared\DLLShared\;c:\Program Files\Common Files\Roxio Shared\9.0\DLLShared\;C:\Program Files\Common Files\Ulead Systems\MPEG;C:\Program Files\Justsystems\JSLIB32;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\」 だったので、修正反映後は 「%JAVA_HOME%\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;C:\Program Files\Edy\Edy Library;C:\Program Files\Common Files\Adobe\AGL;C:\Program Files\Common Files\Sony Shared\FeliCaLibrary;c:\Program Files\Common Files\Roxio Shared\DLLShared\;c:\Program Files\Common Files\Roxio Shared\DLLShared\;c:\Program Files\Common Files\Roxio Shared\9.0\DLLShared\;C:\Program Files\Common Files\Ulead Systems\MPEG;C:\Program Files\Justsystems\JSLIB32;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\android-sdk\tools;C:\android-sdk\platform-tools」 となります。

※パソコンのメーカーや、インストールしたソフトの構成により「Path」の値は異なるので、上記の設定はあくまで参考程度にみてください。

4.ADT(Android Development Tools:アンドロイド開発ツール群)プラグイン インストール

ADTプラグインインストール時は、Eclipse画面右下側にプラグインのインストール中をあらわす緑色のメーターが表示されます。ただし、画面解像度の横幅が1125ピクセル以下は、Eclipseを全画面表示にしても、ヒープ・ステータスの表示に隠れてメーターが表示されないようです。ですからHD(1280×720)なら表示されますが、XGA(1024×768)だと表示されません。(参考サイト:画面解像度

Eclipseメニューの「ウィンドウ」→「設定」→「一般」を選択し、右側ペインの「ヒープ・ステータスを表示」のチェックをはずして「OK」をクリックしてから作業をすれば、メーター表示用の領域が確保され、インストール中にメーターが表示されるはずです。また、メーターの右にある「進行状況ビューでバックグラウンド操作を表示」アイコンをクリックするか、Eclipseメニューの「ウィンドウ」→「ビューの表示」→「進行状況」を選択すると、「進行状況」タブが現れ、インストール進行状況を観察できます。

情報表示領域が狭い場合は、「進行状況」タブをダブルクリックすると、進行状況ビューが全画面表示になります。戻すには再度「進行状況」タブをダブルクリックします。

進行状況に気を払えば、プラグインのインストールが終了したと思い込んで次の手順へ進んでしまうミスを防ぐことができます。

  1. Eclipseメニューの「ヘルプ」→「新規ソフトウエアのインストール」をクリックします。
  2. 「インストール」画面が開いたら、作業対象欄の右にある「追加」をクリックします。
  3. 「リポジトリーの追加」画面が開いたら、名前欄に「ADT Plugin」(またはAndroid Pluginなど任意の名前で結構です)と入力し、「ロケーション」欄にリモートアップデートサイトとして「https://dl-ssl.google.com/android/eclipse/」を入力します。
  4. 「インストール」画面の名前欄に「開発ツール」「NDKプラグイン」が表示されているので、「すべて選択」をクリックし、「次へ」をクリックします。
  5. 早ければ1分もかからず次へすすむのですが、時間帯によっては「要件および依存関係を計算。:http://download.eclipse.org/releases/juno/201209280900/からxxx.jarを取り出し中(x.xxkB/sでx.xxMB件中x.xxMB件)」を表示したまま、その文字の下にある進捗メーターがなかなか変化しないことがあります。あまりに反応がない場合、進捗メーター右の赤い四角ボタンをクリックして中止することができます。改めて「次へ」をクリックするとメーターがスムーズに変化することもあります。場合によっては5分以上待たされることもあります。
  6. やがて「インストール詳細」になり、「Android DDMS」・「Android 開発ツール(Android Development Tools)」・「Android 階層ビューアー(Android Hierarchy Viewer)」・「Android ネィティブ開発ツール(Android Native Development Tools)」・「Android トレースビュー(Android Traceview)」・「OpenGL ES用トレーサー(Tracer for OpenGL ES)」が表示されたら、「次へ」をクリックします。
  7. 「ライセンスのレビュー」になったら、「使用条件の条項に同意します」にチェックをし、「完了」をクリックします。
  8. 1分弱かかってインストール進行状況メーターが50%を超えた頃に「セキュリティ警告」画面が開き、「警告: 署名なしコンテンツを含むソフトウエアをインストールしています。このソフトウエアの真正性または妥当性を実証できません。インストールを続行しますか?」と問われるので、「OK」をクリックします。
  9. 「ソフトウエア更新」画面が開き、「変更内容を有効にするには、Eclipse プラットフォーム を再始動する必要があります。すぐに再始動しますか?」と問われたら、「はい」をクリックします。

画面キャプチャーのある参考サイトをあげておきます。(参考サイト:Javaで作って遊ぶ: Eclipse4.2でAndroid開発環境を作る

TraceviewとAndroid Lintの参考サイトトをあげておきます。(参考サイト:Traceviewを使うAndroid Lint の利用方法デバッグと自動ビルド

※「ロケーション」欄に「https://dl-ssl.google.com/android/eclipse/」として接続に失敗する場合は、リモートアップデートサイトを「http://dl-ssl.google.com/android/eclipse/」に変えて試します。

※リモートアップデートはネットワークが不安定だとエラーになりやすく、その場合、あらかじめADTプラグインZIPファイルをダウンロードしておいてインストールする方法があります。まず、Installing the Eclipse Plugin の Download the ADT Plugin zip file (do not unpack it): の下にあるADT 20.0.0.zip ADT 20.0.1.zip ADT 20.0.2.zip」「ADT 20.0.3.zipADT 21.0.0.zip」をクリックしダウンロードします。「リポジトリーの追加」画面で、「ロケーション」欄の右にある「アーカイブ」をクリックし、ファイル選択画面が開いたら、ダウンロード済みの、ADT 20.0.0.zip ADT 20.0.1.zip ADT 20.0.2.zip」「ADT 20.0.3.zipADT 21.0.0.zip」を選択し、「開く」をクリックします。「リポジトリーの追加」画面の「ロケーション」欄に値が入るので、「OK」をクリックし、「リポジトリーの追加」画面を閉じ上記手順4.以降をおこないます。

※「アーカイブ」をクリックし、未解凍の「ADT 21.0.0.zip」を選択するかわりに、「ローカル」をクリックし、「ADT 21.0.0.zip」を解凍したフォルダを選択する方法もあります。

※「リポジトリーの追加」画面で、追加を誤るなどして追加作業対象を破棄したい場合は、作業対象欄の下の「”使用可能なソフトウエア・サイト”」という文字リンクをクリック→破棄したい対象の行をクリック→「除去」をクリックし、「サイトの除去」画面が開いたら「はい」をクリックし、「OK」をクリックします。

※「リポジトリーの追加」画面で、追加しようとしたら「ロケーションの重複」とエラー表示される場合は、作業対象欄の下の「”使用可能なソフトウエア・サイト”」という文字リンクをクリックして、ロケーションの登録状況を確認します。「https://dl-ssl.google.com/android/eclipse/」が登録済みのリストに存在するはずなので、上記の追加作業のかわりに、既存のものを選択すればOKです。

5.Android SDK(Software Development Kit:ソフトウエア開発キット)をインストール

(2012年11月25日 追記) Eclipse が再起動すると、Eclipseの「ようこそ」画面の上に、「Android 開発へようこそ」画面が開き、さらに上に「設定で Android SDK のロケーションが設定されていません。」と表示されます。「閉じる」をクリックします。

「Android 開発へようこそ」画面が開き、「新規SDKのインストール」か、「既存SDKを使用」かを問われます。なお、最初に述べたように、事前に「.android」フォルダが存在していると「Android 開発へようこそ」画面にはなりません。Android開発環境構築済みとみなされるためです。その場合、Eclipse メニューの「ウィンドウ」→「設定」→「Android」をクリックすると、Android設定のSDKロケーション欄に既存のAndroid SDKの場所が表示されるはずです。設定画面を閉じ、6.の手順へ進んでAndroid SDKの内容を更新するとよいでしょう。または以前の環境を破棄してよければ、「.android」を削除し、Eclipse メニューの「ヘルプ」→「Eclipseについて」→「インストール詳細」→「インストール済みのソフトウエア詳細」タブで「ctrl」キーを押しながら「Android DDMS」・「Android 開発ツール(Android Development Tools)」・「Android 階層ビューアー(Android Hierarchy Viewer)」・「Android ネィティブ開発ツール(Android Native Development Tools)」・「Android トレースビュー(Android Traceview)」・「OpenGL ES用トレーサー(Tracer for OpenGL ES)」をクリックし、「アンインストール」をクリックし「完了」をクリックしてから手順4.をやり直してください。

  1. 標準の「新規SDKのインストール」-「Android APIの最新の使用可能なバージョンをインストール(すべての最新フィーチャーをサポート)」のチェックを入れたまま、ターゲット・ロケーションを「C:\android-sdk」(空白や漢字などの全角文字を含まない任意の名前にします。Cドライブ意外に作るとAVDが標準では起動せずシンボリックリンクを作成する手間が増えるので、Cドライブへ作成することが望ましいです。)とし、「次へ」ボタンをクリックします。(参考サイト:Androidのエミュレータがavdファイルを上手く見つけてくれない件について
  2. 使用統計をGoogleへ送信するか問われるので、「はい」「いいえ」どちらかを選択し「完了」ボタンをクリックします。(私は「いいえ」を選びました。後からEclipse メニューの「ウィンドウ」→「設定」→「Android」→「使用統計」→「使用統計をGoogleに送信する。」のチェックを入れるで、「はい」を選んだのと同じにできます。)
  3. “インストールするパッケージの選択”画面になり、”Android SDK Tools”、”Android SDK  Platform-tools”、”SDK platform Android 4.1” ”SDK platform Android 4.2”が表示されます。 「すべて受諾」をチェックし、「インストール」をクリックします。
  4. (2012年11月25日 追記) 「Android SDK マネージャー」の小窓が開き、緑色の進捗メーターが伸びていきます。伸びきるのを待ちます。文字が見れなければ、ドラッグして表示領域を広げることができます。終了すると自動的に閉じます。
  5. (2012年11月25日 追記) 「ようこそ」タブの「×」をクリックして「ようこそ」画面を閉じ、ワークベンチを表示します。
  6. (2012年11月25日 追記) Eclipse メニューの「ウィンドウ」→「パースペクティブのカスタマイズ」→ 「コマンド・グループの可用性」タブで 「Android SDK および AVD マネージャー」のチェックを入れ、「OK」をクリックします。これをしないとEclipseメニューの「ウィンドウ」に「Android SDK マネージャー」と「Android 仮想デバイス・マネージャー」が表示されなくなりました。

Android Developers→Get the SDK→画面左下の「DOWNLOAD FOR OTHER PLATFORMS」をクリックであらわれる Android SDKのインストーラ版installer_r20.0.3-windows.exeinstaller_r21.0.0-windows.exe)を利用する場合は、「Android 開発へようこそ」画面を閉じてください。

インストーラ版は、起動すると最初にJavaの存在チェックがあります。環境変数「JAVA_HOME」にJDKのインストール場所を設定しておけば問題なく通過できます。「Choose Users」画面では規定値の「Install just for me」、インストールフォルダーは「C:\android-sdk」にします。インストールが進むとAndroid SDK Managerが自動起動します。なお、画面起動時にあらかじめインストール候補としてチェックが入っている対象が「Android 開発へようこそ」画面を経由して起動するAndroid SDK Managerのものとは違います。そのまま「Install 9 packeges」ボタンをクリックしてもよいですし、Android4.1エミュレータの作成には関係しない「Documentation for Android SDK」・「Samples for SDK」・「Google APIs」・「Sources for Android SDK」をインストール対象から除いてもよいです。この段階では、Android仮想デバイスでAndroid4.1しかない状態です。Android SDK Managerで希望するバージョンを追加インストールできます。

※Android SDKをインストーラ版でインストールすると、Windows画面左下の「スタートメニュー」→「すべてのプログラム」→「Android SDK Tools」ができ、ここから「AVD Manager」と「SDK Manager」の起動と「Uninstall Android SDK Tools」の実行が可能になります。

6.Android SDK Managerでコンポーネントを追加する

  1. Eclipseメニューの「ウィンドウ」→「Android SDK マネージャー」をクリックし、「Android SDK マネージャー」画面を開きます。起動時の画面幅では文字が隠れて見えない箇所もあるので、枠を広げると見やすくなります。
  2. 画面が起動すると、「Android SDK Tools」、「Android SDK Platform-tools」、Android4.1(API 16) Android4.2(API 17)の「SDK Platform」の計3ヶ所が「Installed」になっています。また、インストール候補としてAndroid4.1(API 16)の「ARM EABI v7a System Image」・「Intel x86 Atom System Image」と「Google USB Driver」にチェックが入っています。 Android4.2(API 17)の「ARM EABI v7a System Image」にチェックを入れます。
  3. そのまま「Install 3 Packages…」(3パッケージのインストール…) 「Install 1 Package…」をクリックします。
  4. 「インストールするパッケージの選択」画面が開くので、「Accept All」(すべて受諾)をチェックし、 「Install」(インストール)をクリックします。
  5. 「Done loading Packages.」(パッケージのロードが完了しました。)と表示されたら右上角の「X」をクリックして画面を閉じます。
  6. Eclipse メニューの「ファイル」→「再開」をクリックし、Eclipseを再起動します。再起動しないと、エミュレータ作成画面にコンポーネントの更新が反映されません。

Android4.0以上では「ARM EABI v7a System Image」が「Not installed」のまま「AVD マネージャー」でエミュレータを作成しようとすると、「Unable to find a ‘userdata.img’ file for ABI armeabi to copy into the AVD folder.」とエラーになるので、「ARM EABI v7a System Image」は必ずインストール対象にします。「Documentation for Android SDK」・「Samples for SDK」・「Google APIs」・「Sources for Android SDK」はエミュレータの作成には関係しないので、必須ではありません。Android SDK Managerで希望するバージョンを追加インストールします。

Intel x86 Atom System Image(参考サイト:Android SDKアップデート、Windows/Macでエミュレータが高速に

Google USB Driver(参考サイト:実機を使ってデバッグする

7.Eclipseの設定

ビルド・コンパイルに使用されるライブラリが先ほどインストールしたJDK6になるよう設定します。(参考サイト:【eclipce】JREからJDKへ変更する方法(jspを使うためには必須)

  1. Eclipse メニューの「ウィンドウ」→「設定」をクリックします。(”設定”画面が開きます。)
  2. 左側ペイン(領域)で「Java」(文字の左側にある三角印をクリックします)→「コンパイラー」をクリックし、右側ペインの「コンパイラー準拠レベル」が「1.6」であることを確認します。なお、下段には、「1.6 準拠を選択する場合は、JREがインストール済みでアクティブにされていることを確認してください。(現在は 1.7)」と警告がでているはずです。
  3. 左側ペインで「Java」→「インストール済みのJRE」をクリックします。(インストール済みのJRE欄に、名前「eclipse」、ロケーション「C:\pleiades\pleiades\eclipse」とEclipse組み込みのJREが表示され、チェックが入っているはずです。)
  4. 「追加」をクリック→「標準VM」を選択し「次へ」をクリック→「ディレクトリー」をクリックします。
  5. フォルダの参照画面から、「コンピュータ」≫「ローカルディスク(C:)」≫「Program Files」≫「Java」≫「jdk1.6.0_38」を選択し、「OK」をクリックします。
  6. JREシステムライブラリー欄にjarファイルが列挙されたのを確認して「完了」をクリックします。
  7. インストール済みのJRE欄に、名前が「jdk1.6.0_38」でロケーションが「C:\Program Files\Java\jdk1.6.0_38\」で追加表示されているので、チェックを入れ選択します。
  8. 「OK」をクリックします。これで、もう一度「Java」→「コンパイラー」で確認すると、先ほどの警告は消えているはずです。

Eclipseをチューニング 設定方法によりその他も自分好みに設定します。Pleiades All in Oneを利用したことで、デフォルトの文字コードがAndroid標準文字コードの「UTF-8」に設定されるので、文字コードを「MS932」から変更する作業は発生しません。

8.AVD(Android Virtual Device:Android仮想端末) Managerでエミュレータを作成

  1. Androidアプリ開発環境を 42分で構築する(1時間切りに挑戦)に同じです。

※AVDの起動には時間がかかります。高速化方法として参考サイトを試してください。(参考サイト:Androidエミュレータの起動が遅いのは一発で高速化できるAndroid爆速エミュレータ環境の作り方

※漢字や空白を含んだユーザー名でログインしている場合や、マイドキュメントの位置をDドライブに移動している場合は、AVDの起動に失敗し、「PANIC: Could not open:~」とエラーになります。(参考サイト:eclipseでエミュレーター起動時に「PANIC: Could not open: C:\Users\xxx\.android/avd/AVD2.1-2.ini」が出た時の対処法

※Android SDK r20 では、android4.1エミュレータが使える代わりに、AVDでパソコンのキーボードからの入力ができなくなったようです。ソフトウェアキーボードしか使えないのでは不便ですから、PCのキーボードで入力する方法として参考サイトを試してください。(参考サイト:Android SDK R20 の emulator でハードウェアキーボードが使えないadbを使って端末にキーイベントを送るAndroidでkeyイベントを発生させるinputコマンドをサクサクにする

※プログラミングの参考になるようなサイトは、プログラミング参考サイトのAndroidの項目にまとめてあります。

※エラーが出る場合はEclipse起動時エラーの傾向と対策Androidエラーの傾向と対策を参考にして下さい。

※Androidプロジェクトを作成する部分がr20から以前とは変わっています。『作りながら覚えるAndroidプログラミング 改訂版』-Android SDK 4.1(Jelly Bean)への対応と修正点についてAndroidアプリ開発環境をVMware上CentOS6.4に構築3/3を参考にするといいでしょう。

以上です。

「ピ!ピ!ピ!ポーン!ポーン!」  うるう秒がらみで日付表示を調べてみる

日本時間2012年7月1日(日)午前8時59分59秒と午前9時00分00秒の間に8時59分60秒がうるう秒として挿入されたのをきっかけとして、少し調べてみたことを記述します。うるう秒の制度は1972年に始まったもので、今回で25回目となります。(時報が「ポーン!ポーン!」と、8時59分60秒と9時の2回続けて鳴るのはひかり電話限定)

1秒の長さは、地球の自転を基にして平均太陽日の86400分の1とされていました。(参考サイト:Wikipedia – 太陽時

1927年に、最初のクォーツ時計がベル研究所で作成され、1932年には、クォーツ時計によって地球の微小な週変化が計測され、地球の自転にはふらつきがあることから1秒の長さも一定ではなく時間の定義にはそぐわないと判断され始めました。

1956年に、1秒の長さは、地球の公転を基にして1900年1月0日12時から1太陽年の31556925.9747分の1と改められました。(参考サイト:Wikipedia – 暦表時

1967年に、1秒の長さは、セシウム133が9192631770回振動する時間(原子時)に見直されました。(参考サイト:Wikipedia – 原子時計7月1日のうるう秒「午前8時59分60秒」を実感するには~将来は廃止の可能性も

ストロンチウム原子に基ずく理論的には300億年に1秒以下の誤差の光格子時計が研究されています。世界最高水準の原子時計は3000万年に1秒以下の誤差なので、1000倍精度が上がることになります。2006年9月、国際度量衡委員会の諮問委員会で、秒の二次表現の候補として採択され、2006年10月に行われた国際度量衡委員会で正式に秒の二次表現にすることが決定されており、将来1秒の定義が変わるかもしれません。(参考サイト:ストロンチウム(Sr)原子を用いた光格子時計の研究開発

天文観測から得られる地球の自転・公転に基づく時系をUT(Universal Time:世界時)といい、細かくはUT0, UT1, UT2にわかれます。UT0は、平均太陽時と呼ばれるもので、天文観測によって得られる恒星時から計算で求められます。地球上の位置・季節により変動します。UT1は、UT0から、地球上の位置による変動を取り除いたものです。UT2は、UT1から、季節変動による影響を取り除いたものです。(参考サイト:IBM – 2012年7月1日のうるう秒のAIXおよびHMC,SDMC への影響について) GMT(Greenwich Mean Time:グリニッジ標準時)はUT1に相当します。(参考サイト:Wikipedia – グリニッジ標準時)、

1955年、セシウム原子時計に基づく時間TAI(Temps Atomique International:国際原子時)が運用され始めました。1958年1月1日0時0分0秒を基点とします。(参考サイト:Wikipedia – 国際原子時

地球の自転は徐々に遅くなっていて、UT1はTAIよりも徐々に遅れていっています。UTC(Coordinated Universal Time:協定世界時)は、1秒の定義は原子時としつつ、うるう秒(leap second)調整によりUT1 の時間に近づけようとしたものです。うるう秒の実施日時は、自転のふらつきが予測できないため定期的ではなく、そのつど予告されます。UTC基点の1972年1月1日0時0分0秒は、TAIの1972年1月1日0時0分10秒です。1972年6月30日に第1回目の「うるう秒」があり、今回の2012年6月30日(日本時間で2012年7月1日午前8時59分60秒)は25回目の「うるう秒」でした。これでUTCは、TAIより「35秒」遅れになりました。1958年から50年ほどの間に、地球の自転が積算値で35秒遅くなったと言えます。(参考サイト:原子時と 「うるう秒」電波時計のしくみ

2つのUTC時刻間の正確な値は、その間に「うるう秒」が何回あったかを参照する必要があるので、複数年にわたる長い時間を正確に測定することが求められるような科学的用途の多くにはUTCよりもTAIが用いられます。(参考サイト:Wikipedia -国際原子時

多くのオペレーティングシステムは、1日を24時間・1440分(60分×24)・86400秒(60秒×60×24)とし、うるう秒を考慮しないUNIX Timeが用いられているようです。「2012-06-30 23:59:60 UTC」といったうるう秒の日付文字列を受けとった場合の動作を確認しておくのがよいでしょう。(参考サイト:Microsoft - うるう秒に関するサポートについてIBM - Linux システムクロックの『うるう秒』調整2012 年 7 月 1 日のうるう秒挿入時に発生した Linux カーネルの不具合に関する情報

UNIX Time(ユニックスタイムスタンプ または エポック秒)

  • UNIX Timeは、1970年1月1日0時0分0秒(UNIX epoch)を基点とする積算秒数です。なお、1970年1月1日は木曜日でした。
  • 多くのシステムでは、POSIX(Portable Operating System Interface for UNIX:UNIXを始めとする各種OSにおける共通インターフェース)仕様でUNIX Timeをカウントしており、この仕様はうるう秒を考慮していません。
  • 23回目のうるう秒直後の2006年1月1日0時0分0秒時点のUNIX Timeは、POSIX仕様では1136073600秒、POSIX仕様でない場合は1136073623秒でした。
  • 24回目のうるう秒直後の2009年1月1日0時0分0秒時点のUNIX Timeは、POSIX仕様では1230768000秒、POSIX仕様でない場合は1230768024秒でした。
  • 25回目のうるう秒直後の2012年7月1日0時0分0秒時点のUNIX Timeは、POSIX仕様では1341100800秒、POSIX仕様でない場合は1341100825秒でした。
  • POSIX仕様の場合、うるう秒の「2012-06-30 23:59:60 UTC」 と 通常秒の「2012-07-01 00:00:00 UTC」は、どちらもUNIX Timeは同じで1341100800秒になります。
  • 日本標準時2005年3月18日10時58分31秒は、UNIX Timeで1111111111秒でした。
  • 日本標準時2009年2月14日8時31分30秒は、UNIX Timeで1234567890秒でした。
  • UNIX Timeを、符号付き32ビット整数で扱うと、2147483647秒(21億4748万3647秒)(2038年1月19日3時14分7秒)を超えると桁あふれが起こります。UNIX Timeを、符号付き32ビット整数で扱っているシステムへの影響が危惧され、2038年問題と呼ばれています。
  • C言語で組まれているシステムの場合、時刻をtime_t型で管理・処理します。time_t型の実装はsigned long int型(符号付き32ビット整数)が多く、2038年問題がおこります。(参考サイト:2038年問題 日付算出
  • unsigned long int型(無符号32ビット整数)とすれば2106年2月7日まで問題を回避できます。
  • 1999年に策定されたC99の規格を反映したtime_t型をunsigned long long型(無符号64ビット整数)で実装している処理系なら、292471210647(2,924億7,121万647)年6月12日まで問題はおこりません。(292471210647年問題?)
  • 2001年9月9日にUNIX Timeが10進法表記で9桁から10桁になりましたが、文字列表現でソートすると「1000000000」<「999999999」となり、項目が正しい順番で並ばなくなることによる不具合が発生し、2001年9月9日問題と呼ばれました。次に桁が増えて10桁から11桁になるのは2286年になります。
  • JavaでSystem.currentTimeMillis()で取得できるシステム現在時刻は、long型(符号付き64ビット整数)のミリ秒単位のUNIX Timeです。カレンダーオブジェクトや日付オブジェクトで、Calendar#getTimeInMillis()、Date#getTime()で取得するUNIX Timeもミリ秒単位です。秒単位ではないので1000で割るなどの処理が必要です。
  • Javaで日付や時刻をあつかうための基本となるクラスは、java.util.Dateとjava.util.Calendarクラスですが、java.util.Dateクラスのほとんどのメソッドが非推奨となっているので、相当するjava.util.Calendarクラスのメソッドを使用します。(参考サイト:Androidにおける日付処理の基本
  • java.util.Dateなどの時刻を表すAPIは、秒数を表すメソッドで0~61秒を表現できますが、実際には、うるう秒を正確に追跡する必要がある実装でのみ使われます。通常、(2012年7月1日12時0分0秒)-(2012年6月30日12時0分0秒)の計算結果は、期間中にうるう秒があるにもかかわらず86401秒ではなく86400秒になります。
  • 2つの日付の差は、最初に 2 つの日付を UNIX Time に変換し、次にその開きを計算し、 でた値を1日の時間である 86,400,000 ミリ秒割ることで求めることができます。(参考サイト:Java 2つの日付の差を求める
  • http://www.convert-unix-time.com/で、UNIX Timeと日時の変換ができます。

NTP Time(Network Time Protocol Time:ネットワーク時刻同期プロトコルで使用される時刻)

  • NTPは、ネットワークに接続される機器において、機器が持つ時計を正しい時刻へ同期するためのプロトコルです。(参考サイト:NTPによる時刻合わせについてWindows OSにおける時刻同期サービスとNTP
  • 一般的なOSでは、NTPサーバ・クライアントモデルのクライアントに相当する機能を持ち、NTPサーバへアクセスし、機器内部の時計の時刻をNTPサーバの時刻に合わせることで内部時計の誤差を少なくするように努めます。
  • NTPは動作が複雑なので、クライアント向けにの簡易版のSNTP(Simple Network Time Protocol)がRFC2030で定義されています。これはサーバに正確な時刻を問い合わせる用途に特化したものです。
  • NTP Timeは、1900年1月1日0時0分0秒を基点とする積算秒数です。
  • 1900年1月1日は月曜日です。
  • NTP timeとUNIX Timeの差は25567日で、秒で表すと2208988800秒(60秒×60分×24時間×25567日)の差があります。
  • うるう秒挿入時は、2秒で1秒進むように調整されます。
  •  NTP Timeは、符号なし32ビット整数で表現され、4294967295秒(42億9496万7295秒)(2036年2月7日 6時28分15秒)の次の秒は、桁あふれして1900年1月1日0時0分0秒と同じ値に見えます。NTPで時刻調整を行っているシステムへの影響が危惧され、2036年問題と呼ばれています。(参考サイト:2036年問題の日付訂正あなたの時計は大丈夫? 「想定外」だった日時の不具合
  • 2036年問題の日時は、Wikipediaなどでは2036年2月6日 6時28分15秒とされていますが、RFC4330では2036年2月7日 6時28分15秒と記述されており、当サイトはこれに従っています。(参考サイト:NTPの西暦2036年問題の日時について
  • 2036年問題については、実際には、NTP の最上位ビットが0の場合を2036年から2104年、最上位ビットが1の場合を1968年から2036年と解釈する仕様があるようです。(参考サイト:ネットで時刻を合わせるプロトコル—SNTPRFC-2030 日本語訳の「3. NTP タイムスタンプ フォーマット」の説明)
  • 日本標準時プロジェクト 公開NTPで、NTPサービスを説明しています。

タイムゾーン(Time zone)

ロケール(Locale)

  • ロケールとは、同じ言語や習慣を共有している、地理的、政治的、または文化的に特定の地域のことで、言語コード、国コード、バリアントコードから成り立ちます。バリアントコードとは、「EURO(ユーロ)」のように言語や国では指定できない地域を識別したり、言語や国をさらに詳述する情報を与えたりするコードです。
  • 日時の表記や通貨の単位の処理はロケールに依存します。(参考サイト:ロケールに依存した処理ローカライゼーション (L10N)
  • java.util.Locale.getDefault()で、現在のロケール情報が取得できます。
  • JavaのCalendarクラスのgetInstance()メソッドを呼び出すと、現在のロケール
    で使用されているカレンダーのインスタンスを作成します。(参考:CalendarとGregorianCalendar
  • 日本のロケールは、言語が「ja」、国が「JP」で、通常「ja_JP」ですが、バリアントコード「JP」を加え「ja_JP_JP」としてCalendarクラスのgetInstance()メソッドを呼び出すと、JapaneseImperialCalendarインスタンスを作成でき、和暦の対応ができます。(参考サイト:Java 6で和暦を使う「Java SE 6完全攻略」第51回 和暦への対応 その1
  • 年数を昭和の下2けたで管理しているシステムの場合、2025年に「昭和100年」となり、桁あふれを起こす可能性があり、2025年問題(昭和100年問題)と呼ばれています。
  • 祝祭日は年代により変化が生じるので注意が必要です。例えば、1998年に「国民の祝日に関する法律の一部を改正する法律」(ハッピーマンデー制度)ができたり、2007年に「祝日と祝日に挟まれた日は国民の休日とする」と改正されたりしました。これら改正のコンボで2015年・2026年・2032年・2037年・2043年・2049年は、9月に「敬老の日」と「秋分の日」に挟まれる日が発生し、国民の休日が増える見込みです。 (参考サイト:国民の休日
  • 青空文庫の西暦(和暦)年の記述文学散歩意の年号(元号)一覧表で、西暦と和暦を対比して確認ができます。
  • Androidでは、getInstance()メソッドを呼び出したときGregorianCalenderインスタンスを作成しないロケールを設定していると、コンパイルエラーになる場合があるようです。(参考サイト:Android Debug certificate expired on xx/xx/xx xx:xx !

ISO8601とRFC3339に沿った日付と時刻の書き方

  •  ISO 8601は、日時表記の国際標準です。
  • 日付の表現は、「yyyy-MM-dd」とします。年・月・日の区切りは「/」ではなく「-」を使用し、年は2桁ではなく4桁で書きます。Javaでは年は「yyyy」、日は「dd」と小文字でよいですが、月は「MM」と大文字で記述します。小文字の「mm」は分をあらわすので注意します。
  • 時刻の表現は、「HH:mm:ss」とします。時・分・秒の区切りは「:」を使用し、時間は24時間であらわします。Javaでは「hh」と小文字にすると12時間での表示になるので、24時間での表示になる大文字の「HH」を用いる点に注意します。
  • 時差の表現は、「±hh:mm」とします。日時を現地時間で表記し、時・分でタイムゾーンオフセットをつけ、 UTCからhh時間mm分進んで(あるいは遅れて)いることを示します。UTCは「+00:00」(「-00:00」とは書きません)あるいは’Z’と書きます。時と分の間にコロン(:)が入ります。日本標準時を明示するなら時刻の後に「+09:00」を付与します。
  • 日付と時刻を連結する場合は、間にTを挟んで<日付>T<時刻>と書きます。
  • 日本標準時2012年7月1日午後3時10分30秒は「2012-07-01T15:10:30+09:00」と書きます。
  • Javaの標準APIでSimpleDateFormatの記法を用いて 「yyyy-MM-dd’T’HH:mm:ssZ」とした場合、「2012-07-01T15:10:30+0900」とタイムゾーンにコロン(:)が入らないRFC822の仕様の表示になります。org.apache.commons.langのFastDateFormatを使用して、「yyyy-MM-dd’T’HH:mm:ssZZ」と大文字2文字の’ZZ’とすることで、「2012-07-01T15:10:30+09:00」とタイムゾーンにコロン(:)が入る表示にすることができます。(参考サイト:JavaでのISO 8601形式の日時の処理
  • FastDateFormatの欠点は、解析(parse)に対応していないことと、和暦が使えないことです。(参考サイト:FastDateFormat
  • 「yyyy-MM-dd HH:mm:ssZ」形式で現在日時を出力するには、「System.out.println(new SimpleDateFormat(“yyyy-MM-dd HH:mm:ssZ”).format(new Date(System.currentTimeMillis())));」とします。
  • 日付文字列をタイムスタンプ型に変換したい場合は、「Timestamp ts = new Timestamp(new SimpleDateFormat(“yyyy/MM/dd HH:mm:ss.SSS”).parse(“2012/07/01 15:10:30.294″).getTime());」とすればできます。これを「System.out.println(ts);」で確認すると、「2012-07-01 15:10:30.294」と表示されます。
  • SimpleDateFormatの”S”はミリ秒なので、マイクロ秒と使い方を誤ると時間がずれます。例えば、「Timestamp ts = new Timestamp(new SimpleDateFormat(“yyyy/MM/dd HH:mm:ss.SSSSSS”).parse(“2011/02/04 06:14:16.483677″).getTime());」とし、「System.out.println(ts);」とすると、483,677マイクロ秒(8分3秒677ミリ秒)なので、「2011-02-04 06:22:19.677」と表示されます。(参考サイト:日付時刻フォーマットは小数にご注意 (お恥ずかしい話)
  • Androidではandroid.text.format.Time#parse3339() を使用すると高速にパースできます。(参考サイト:android.text.format.Timeの利用

ユリウス暦(Julian calendar)とグレゴリオ暦(Gregorian calendar)

  • グレゴリオ暦は『新暦』とも呼ばれ、16世紀以前には存在せず、 18世紀になるまでは普及していませんでした。 ユリウス暦(Julian calendar)に置き替って 世界的に受け入れられたのは20世紀初頭になってからです。 (参考サイト:暦と日誌 – 他の暦との相互変換
  • 1582年10月4日(木曜日)をユリウス暦最終日とし、その翌日は1582年10月15日(金曜日)としグレゴリオ暦初日とすることを、ローマ法王グレゴリオ13世が1582年2月24日に教書のかたちで布告しています。ローマ・カトリック系のイタリア、フランスなどは1582年からグレゴリオ暦を採用しましたが、イギリスでは1752年から採用しました。(参考サイト:ユリウス日(Julian Day)
  • ユリウス日(JD:Julian Day)とは、紀元前4713年1月1日12時0分0秒を0.0日とした連続した通し番号の日数で、天文通算日(Astronomical day number)とも呼びます。
  • 1582年10月4日はユリウス日の2299160日、1582年10月15日はユリウス日の2299161日です。(参考サイト:第17回「ユリウス通日」(その2)
  • 1年1月1日0時0分0秒はユリウス日の1721425.5日です。2000年1月1日0時0分0秒はユリウス日の2451544.5日です。(参考サイト:ユリウス日の計算
  • 準(修整)ユリウス日(MJD:Modified Julian Day)とは、ユリウス日から2400000日と半日(12時間)を引いたもので、1858年11月17日0時0分0秒を0.0日とした連続した通し番号の日数です。 2000年1月1日0時0分0秒は準ユリウス日の51544日です。(参考サイト:OpenVMS では計時開始日を 1858 年 11 月 17 日に設定していますが,その理由は何でしょう
  • Oracle日付(OraDates)は、ユリウス日で表されます。Oracle Applicationsは紀元前の日付をサポートしていません。(参考サイト:Oracle Applications開発者ガイド
  • 1582年から施行されたグレゴリオ暦の暦法を、1582年以前にも適用したものが先発グレゴリオ暦で、MySQL、SQLite、PHP、CIM、Delphi、COBOLでは先発グレゴリオ暦が用いられています。(参考サイト:先発グレゴリオ暦
  • java.util.Dateでは1582年以前の暦はユリウス暦とし、MySQLのDATEでは一律グレゴリオ暦としているので、西暦1000年2月29日の判定に違いがあります。(参考サイト:西暦1000年は閏年かそうじゃないのか?
  • UNIXで「man cal」とコマンドを入力し、オンライン・マニュアルを参照すると、「グレゴリオ暦への切り替えが1752年9月3日に行われた」となっています。「cal 9 1752」とコマンドを入力すると、1752年9月2日の次の日は1752年9月14日で表示されます。(参考サイト:calであそぶ
  • 英語では、西暦である事を明示するためには、AD(Anno domini(キリスト紀元))を年数の前に書き、紀元前はBC(Before Christ)を年数の後に書きます。(参考サイト:西暦
  • 3BC→2BC→1BC→AD1→AD2→AD3のようになっており、西暦0年(AD0・0BC))がないので、紀元前4713年(4713 BC)は、西暦-4712年(AD -4712)になります。(参考サイト:ミレニアムと2000年の違い
  • ユリウス暦では400年間にうるう年100回で1年は365.25日(31557600秒)、グレゴリオ暦では400年間にうるう年97回で1年は365.2425日(31556952秒)となります。
  • 太陽が春分点から春分点へ戻ってくる期間を「太陽年」と呼び、日数では365.24219日とされ、これは3,200年で約1,168,775日となります。グレゴリオ暦の365.2425日は3,200年で1,168,776日となるので約1日の差異があります。そこで、「年が4で割り切れるとうるう年だが100で割り切れるとうるう年ではない。しかし400で割り切れるとうるう年」という一般的なルールに加えて、「年が3,200で割り切れるとうるう年ではない。しかし80,000で割り切れるとうるう年」とするとより精密になるようです。(参考サイト:Leap Day

祝日

お役立ち

Excel上でUNIX Timeを日本時間の日時で表示する

  • Excel 内部の日時を示すシリアル値が1900年1月1日0時0分0秒を1として、1日ごとに1、1秒ごとに1/86400ずつ増える形式であることをふまえて計算式をたてます。
  • セルA1にUNIX Timeを置きます。
  • セルB1に「= A1/(60*60*24)+DATE(1970,1,1)+TIME(9,0,0)」(あるいは 「= A1/86400+25569+9/24」、「= A1/86400+25569.375」)と式を置きます。
  • セルC1に「=TEXT(B1,”yyyy/mm/dd hh:mm:ss”)」と式を置くと、セルC1に日本時間の日時で表示できます。
  • 別の方法として、セルB1で、セルの表示形式を「yyyy年m月d日 hh:mm:ss」と書式設定をユーザー定義すれば、日本時間の日時で表示できます。
  • あるいは、セルB1に「=TEXT(A1/86400+25569.375,”yyyy/mm/dd hh:mm:ss”)」とする方法もあります。
  • 逆に、A1にシリアル値がある場合、「=(A1-25569.375)*86400」とすれば、UNIX Timeにすることができます。