●ザウルス版Java高速起動ツール Mercurius
  Ver:0.1
  形式:ipk
  言語:Java, Ruby
  環境:Zaurus SL-C760
  備考:
                            ⇒ Download


■紹介
  Javaアプリケーションの起動速度を高速にするツールとして、Torutkさん
 の「Mercury版Javaクラス高速起動ツール」というものがあります。それを
 ザウルス用に改造してみました。

  どのような処理を行い、高速化しているかなどの解説は、Torutkさんの
 ページを参照してください。簡単に言うと、Java実行環境をあらかじめ立
 ち上げておいて、そこに実行したいプログラムをロードし、実行する方法
 らしいです。
  なお、ポート12345のソケット通信を使用しますが、ローカル127.0.0.1
 以外からの接続は拒否するようにしてあります。


■Java高速起動ツールの効果
  あまりにも遅いJavaアプリケーションの起動速度向上が見込めます。
 Java起動までのストレスが軽減されるかもしれません。ただし、使用した
 いアプリケーション以外のプログラムもメモリにロードしている状態とな
 るので、メモリ消費量は多少増大します。

【制限事項1】
  現在のバージョンでは、一度に1つのアプリケーションしか起動しませ
 ん。アプリケーション実行中に、再度下記のRUNコマンドを送信すると、
 起動中のアプリケーションを解放し、新たに指定されたアプリケーション
 が起動します。(終了するわけではありません)
  また、アプリケーションの作りによっては、KeyHelperのShift+Home
 起動で切替が出来ない場合があります。その場合は、再度高速起動用の
 アイコンから起動しなおしてください。

【制限事項2】
  二回目の高速起動後、十秒ほどで画面が一瞬消えますが、高速起動ツー
 ルの画面がアクティブになれば再表示されます。
 (そのままにしておけば、すぐに再表示されます)


■画面
 Mercurius画面

 ・Application  : 起動中のアプリケーション
 ・Free Memory  : Java仮想マシンの空メモリ量
 ・Total Memory : Java仮想マシンの総メモリ量
 ・テキスト領域 : システムプロパティのリスト
 ・切替ボタン   : 起動中アプリケーションに切替ます
 ・更新ボタン   : メモリ情報を更新します
 ・終了ボタン   : Mercuriusを終了します


■ダウンロード
 「mercurius_0.1_arm.ipk」をダウンロード後、ザウルスのメニュー
 からインストールしてください。
  また、アプリケーションを高速起動するためには、高速起動ツールの
 他に、高速起動に対応するためのソフトウェアをインストールする必要
 があります。

 → ザウルス版Java高速起動ツール mercurius_0.1_arm.ipk


■高速起動ツールを試してみる
  私が公開しているツールで高速起動を試してみます。

 → ザウルス用Ftpクライアント JFtp(jftp_0.18_arm.ipk)
 → ザウルス用ダウンロードツール JLoader(jloader_1.5_arm.ipk)
 → ザウルス向けJavaメーラー 鳴家(yanari_0.8.1_arm.ipk)
 → 高速起動用Rubyスクリプト fastup_test4_all.ipk

  上記のipkファイルをインストールしてください。
  インストール後、JFtpFSSアイコンまたはJLoaderFSSアイコンから起動
 時、2回目以降から起動時間が短縮されます。JFtpアイコンやJLoaderア
 イコンからの起動は通常起動となり、起動時間は短縮されないことに注
 意してください。


■Java高速起動ツールへの対応方法
  Javaアプリケーション起動時、以下のコマンドを使用して高速起動ツー
 ルに起動するクラスを指定する必要があります。私はRubyでスクリプトを
 書きましたが、ソケット通信ができるものであれば何でも良いです。
 (ただし、Javaだとその起動に時間がかかって意味がなくなります)

【コマンド】
 ・PATH classpath(必須)
   クラスパスを追加するコマンドです。クラスパスが設定されていない
  と、下記のコマンドを送信してもエラーとなってしまいます。
   「file:/home/QtPalmtop/java/JFtp.jar」のように、インストール
  先のパスやJarファイルを指定します。

  例:"PATH file:/home/QtPalmtop/java/JFtp.jar"


 ・CLASS classname(CLASS or NEW必須)
   起動クラスを指定するコマンドです。インスタンスは作成しないため、
  インスタンスを作成し、起動クラスを指定する場合は、以下のNEWコマン
  ドを使用してください。
   スタティックメソッドからアプリケーションを起動する場合に、この
  コマンドを使用します。

  例:"CLASS jp.ne.sakura.andyou.jftp.JFtp"


 ・NEW classname(CLASS or NEW必須)
   起動クラスを指定するコマンドです。CLASSコマンドとは異なり、イン
  スタンスを作成し、そのオブジェクトに対してメソッドを実行すること
  になります。

  例:"NEW jp.ne.sakura.andyou.jftp.JFtp"


 ・RUN method args(必須)
   指定されたメソッドおよび引数を用いて、アプリケーションを起動し
  ます。クラスやインスタンス指定がない場合は、実行できません。
   なお、引数はString配列または引数なしのものしか指定できません。
   また、main(String args[])のようにString配列を引数として持つメ
  ソッドを指定する場合、引数を渡す必要がなくとも何か適当な値を与え
  てください。

  例:"RUN main Fastup"


 ・QUIT(必須)
   ソケット接続を切断します。最後に必ず送信してください。

  例:"QUIT"


  以下にJFtpの高速起動用Rubyスクリプトを公開しておきます。
  (fastup_test_all.ipkに含まれているスクリプトです)
  → JFtpFSS.rb
  → JLoaderFSS.rb


【アプリケーション側の対応】
 ・System.exit(0)を使用しない
   Java高速起動ツールでは1つのJVMで複数のJavaアプリを実行させる
  ため、System.exit(0)でJVMを終了されると高速起動の恩恵が受けられ
  ません。
   引数を与えられてmainから起動された場合はSystem.exit(0)を呼ば
  ないようにするなどの、対応を入れておいてください。

  【例:staticクラス起動】
	public class Test{
		// 高速起動判定用フラグ
		private static Boolean Fastup;
		private static Frame myFrame;

		// アプリケーション起動
		public static void main( String args[] ){
			if( args.length != 0 ){
				Fastup = Boolean.TRUE;
				// 起動済みなら再表示
				if( myFrame != null ){
					myFrame.show();
					return;
				}
			}
			〜 色々な処理 〜
		}

		// アプリケーション終了
		public static void exit(){
			myFrame.hide();
			myFrame.dispose();
			if( FastUp == null ){
				System.exit(0);
			}
		}
	}

 ・GUIアプリは起動クラスでWindowまたはFrameを継承
   GUIアプリの場合は、起動クラスでWindowまたはFrameを継承しておき、
  「NEW classname」で起動クラスを指定し、「RUN show」で起動した方
  がよいです。
   今の所、指定クラスがWindowのサブクラスでインスタンスが作成され
  ている場合、起動ツールのウィンドウがアクティブになった時点で起動
  中のアプリに対してshowするので、KeyHelperのShift+Homeで切替を行っ
  た時に前面に表示されます。

  【例:インスタンス起動】
	public class Test extends java.awt.Frame{
		// 高速起動判定用フラグ
		private static boolean Fastup = true;

		// アプリケーション起動(アイコンから起動)
		public static void main( String args[] ){
			Fastup = false;
			Test test = new Test( args[] );
			test.show();
		}

		// コンストラクタ(高速起動ツールから起動)
		public Test(){
			this();
		}

		// コンストラクタ
		public test( String args[] ){
			〜 色々な処理 〜
		}

		// アプリケーション終了
		public void exit(){
			this.hide();
			this.dispose();
			if( !FastUp ){
				System.exit(0);
			}
		}
	}


■高速起動ツールの変更点
  このページで公開している「ザウルス版Java高速起動ツール」は、
 Torutkさんの「Mercury版Javaクラス高速起動ツール」とは多少異なって
 います。
  ザウルスでも満足に使えるように試行錯誤しているうちに、変更点をま
 とめるのが面倒になってそのままです。クラスやメソッドに対してコメン
 トがまったくない部分は、確実に私が原因です(^^;

【変更点】
 ・ザウルスでは動作しないString.splitメソッドの削除
 ・ローカル127.0.0.1以外からの通信は受け付けないように修正
 ・QUITコマンドが送信されるまでソケット接続を維持するように修正
 ・デフォルトの待受けポート番号を2345→12345に変更(なんとなく)
 ・Java仮想マシン部は常にコマンドを受け付けるようにしました
 ・処理実行Method.invokeメソッドを別スレッドにしました
 ・起動メッセージ出力時期の変更(スクリプトで応答を取得するため)
 ・その他もあるかも(試行錯誤を繰り返してるうちに忘れました)


■ライセンス
  ザウルス版Java高速起動ツールはGPLです。
  ソースはクラスファイルと同じくjarに固めてあります。

  ライセンスには疎いので、必要なコメントなどはごっそり抜けてると思
 います。(何回か読んだけど、難しくてよくわかりません)

  また、GPLが伝播する状況は、静的リンクおよび動的リンク、リフレク
 ションを行われた側がGPLだった場合だと思うので、単に高速起動ツール
 を使用して高速起動を行った場合は、GPLは伝播しないと思っています。
  起動そのものを高速起動ツールに依存しているわけでもないですし。

  何か誤りがありましたら、教えていただければ幸いです。


■履歴
 ザウルスでJava高速起動に挑む
 ・2004/08/01公開
【 Back 】