JDK7 の jarsigner に問題あり?
水曜日, 8 月 17th, 2011NetBeans で簡単に署名付き apk ファイルをつくる ではまった Android の apk ファイルに署名をつける件を調べた。
と言ってもちょっとググってみただけなんですが・・・
やはり JDK7 の jarsigner が失敗するみたいですね。
Android な人は注意しましょう。
NetBeans で簡単に署名付き apk ファイルをつくる ではまった Android の apk ファイルに署名をつける件を調べた。
と言ってもちょっとググってみただけなんですが・・・
やはり JDK7 の jarsigner が失敗するみたいですね。
Android な人は注意しましょう。
NetBeans に NBAndroid プラグインをインストールして Android アプリを作成している人は少ないと思うので
自分用φ(..)メモメモ
プロジェクトを右クリックして [ Export Signed Android Package ] をクリックします。
keystore ファイルを作成するためのウィンドウが表示されます。
keystore ファイル を初めてつくる、または新たにつくる場合は Create new keystore ラジオボタンをクリックして選択します。
出力先を設定します。
そしてパスワードを設定して [ 次へ > ] ボタンをクリックします。
非公開鍵をさきほどの keystore ファイルを使って作ります。
すでに keystore ファイルがありそれを使う場合は Alias のドロップダウンリストより選んで非公開鍵用のパスワードを入力します。
Add new key ラジオボタンを選択します。
[ 次へ ] ボタンをクリックします。
非公開鍵の署名内容をそれぞれ入力します。
ここでのパスワードは非公開鍵ようのパスワードになります。
あとはそれなりに入力するだけですが key の入力内容(key の名前)は解りやすいものにしておくと再利用の時に迷わずにすみます。
署名付き apk ファイルの出力さきと署名の有効期間が表示されます。
[ 完了 ] ボタンをクリックしてできあがるのを待つだけです。
ここで嬉しいことに、アプリケーションの最適化も NetBeans はおこなってくれます。
zipalign はもう必要ないですね。
本当にできてるか確認しました。
keystore ファイル 指定の場所にありました。
もちろん署名付き apk ファイルも!
さて、疑り深い私はちゃんと署名されているかも確認!
ちゃんと検証されました。
これでハッピーエンドとなるはずだったんですが・・・
実は大きな問題がありました。
今までの作業は Windows Vista 64 bit JDK6 u26 NetBeans 7.0.1 で非常に簡単に問題なくできました。
実は最初は Windows 7 JDK7 NetBeans 7.0.1 でこの作業をしていました。
署名付き apk ファイルをつくって、署名の確認をせずに Android マーケットにアプリを登録しました。
無事にアプリをアップロードすることができ、Android マーケットにも反映されていたので安心していたのですが・・・
なんと! インストールできない(><)
で、署名の確認をしたところ お・か・し・い・・・・・・・・・・!
時間がないので少ししか検証してないのですが
どうも JDK7 の jarsigner かなっ?
ちなみに JDK7 でつくった keystore ファイルをつかって JDK6 環境のコンピュータで署名付きアプリをつくり、
Android マーケットに登録したらこの問題は解決しました。
ちなみにその apk ファイルを JDK7 環境で署名確認すると警告がでます。( ・_・;)
たまたま Android マーケット側の問題がこのタイミングで発生して修正されたのかもしれません。
ただ Android マーケットで登録アプリの削除の方法が解らないので気軽に検証することができない。゜(゜´Д`゜)゜。
せっかくのお盆休みなのにもやもやした気分でブルーが少しはいりました。
この前に紹介した Arun Gupta さんのブログ記事を試してみました。
Screencast #35: JDK 7 Project Coin Features in NetBeans IDE 7.0 Beta
今回の目的は、ブログに動画を貼り付けるということです(^^;;;
よって、 NetBeans を使って JDK 7 の Project Coin の機能を試すことが目的ではありません。
それらに興味のあるかたは上のリンクをたどって次期 NetBeans と JDK 7 の新機能をご確認くださいませ。(感動ものです!)
とりあえず、ふらだんすという無料の動画プレーヤーを使わせていただきました。
ファイルサイズが 190.36MB くらいあるので超おもいです。
ブロードバンドコンテンツということで・・・ 許してください。
ついでに YouTube で全く同じものを(ごめんね~)
こういうことに慣れていないので、たったこれだけのために丸一日費やしてしまった(><)
追記 : NetBeans IDE 7.0 Beta 2 & JDK 7 build 131 で ARM も正常動作を確認しました(^^)
12月の初旬にリリースされた NetBeans 6.8 を使って JDK 7 に組み入れられる予定の ForkJoin フレームワークを試してみました。
Fork Jion フレームワークの情報は日本語でも少しありましたのでネット上の情報を元に英語の API ドキュメントをちらちら見ながら適当にプログラムを組んでみました。
素人の私がそういう状況で作ったので間違いがあるかもしれないの見つけられた方は優しく解りやすく間違いを正してくれることを望みます。(^^;
まず、JDK 7 build 77 をインストールして NetBeans 6.8 でそれを使えるようにします。(現在は build 78 が最新です)
Java プラットフォームマネージャーにて JDK 7 を登録します。
メニューバーの [ ツール ] から [ Java プラットフォーム ] をクリックして表示される画面の指示に従って入力していきます。
プラットフォーム名は自分の好みでつけてかまいません。
以上で NetBeans 6.8 でターゲット JDK を JDK 7 build77 にすることが簡単にできます。
新規プロジェクトを作成したらデフォルトがターゲット JDK と異なってる場合はプロジェクトのプロパティで Java プラットフォームを変更できます。
先ほど登録した JDK 7 build 77 が利用可能になってますのでそれを選択します。
また、下のほうに「ソース / バイナリ形式」 に JDK 7 が選択可能となりますのでそれを選択します。
以上のようにして下図のようなプロジェクト構成のサンプルプログラムを作ってみました。
分割統治型アルゴリズムで有名なマージソートです。
ちなみに JDK 6 ではこのマージソートアルゴリズムが使われているらしいです。
この JDK 7 build 77 からは java.util.Arraysクラスの定義されている基本データ型の配列のソートは、Dual Pivot Quicksortを呼び出すように書き換えられています。
参照型の配列の場合には、TimSortですので、Java 7ではソートのアルゴリズムが新しくなります。
と ForkJoin フレームワークの情報を探していたときにみつけました。(余計な情報><
RandomNumber2009.RandomNumber.java
package RandomNumber2009;
import java.util.Random;
public class RandomNumber {
private final int[] number = new int[300000];
public RandomNumber() {
Random generator = new Random(1982);
for (int i = 0; i < number.length; i++) {
number[i] = generator.nextInt(300000);
}
}
public int[] getNumber() {
return number;
}
}
forkjointest.MergeSort.java
package forkjointest;
import java.util.Arrays;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveAction;
public class MergeSort {
public int[] sort(int[] number) {
int nThreads = Runtime.getRuntime().availableProcessors();
ForkJoinPool pool = new ForkJoinPool(nThreads);
SortImpl sort = new SortImpl(number);
pool.invoke(sort);
return sort.result;
}
private class SortImpl extends RecursiveAction {
private int[] number;
private int[] result;
SortImpl(int[] number) {
this.number = number;
}
@Override
protected void compute() {
if ((number.length < 5)) {
result = Arrays.copyOf(number, number.length);
Arrays.sort(result, 0, result.length);
} else {
int midpoint = number.length / 2;
int[] left = Arrays.copyOfRange(number, 0, midpoint);
int[] right = Arrays.copyOfRange(number, midpoint, number.length);
SortImpl task1 = new SortImpl(left);
SortImpl task2 = new SortImpl(right);
invokeAll(task1, task2);
left = task1.result;
right = task2.result;
merge(left, right, number);
result = number;
}
}
private void merge(int[] left, int[] right, int[] number) {
int i = 0, j = 0;
while (i < left.length || j < right.length) {
if (j >= right.length || (i < left.length && left[i] < right[j])) {
number[i + j] = left[i];
i++;
} else {
number[i + j] = right[j];
j++;
}
}
}
}
}
forkjointest.Main.java
package forkjointest;
import RandomNumber2009.RandomNumber;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
RandomNumber test = new RandomNumber();
int[] beforeNumber = test.getNumber();
System.out.println("Before");
System.out.println(Arrays.toString(beforeNumber));
MergeSort ms = new MergeSort();
int[] result = ms.sort(beforeNumber);
System.out.println("After");
System.out.println(Arrays.toString(result));
}
}
このプロジェクトを構築し、実行させると無事に動きました。
さて、ここで本当に並列化しているか確認してみます。
プロファイラを接続して ForkJoinPool のワーカースレッドが起動しているか?
プロファイラによると起動されてますね。
実行中から待機状態になり新たに4っつのワーカースレッドがありますね。
ちなみに CPU コア数は 8個なので8つのワーカースレッドが作成されます。
実行が終了し待機状態になってなんで新たにスレッドが4っつ起動されているのかは謎です。(こういう仕様なのか?)
では、生成されるワーカースレッド数を変更してみます。
int nThreads = Runtime.getRuntime().availableProcessors();
nThreads = 1;
ForkJoinPool pool = new ForkJoinPool(nThreads);
このようにワーカースレッド数を1に変更してみました。
次に 2に変更
4の場合
ちゃんと指定した数のワーカースレッドが生成されるようですね。
ついでにプロファイラの CPU でアプリケーションのパフォーマンスを調べてみようとしたところ
見れなかった(><)
ヒープを大きくしても変わらず・・・ なんでだろう?
JDK 7 に標準搭載予定の ForkJoin フレームワークについての情報はネット上にも少し流れていますので興味のあるかたはググってみてくださいね。
大切なことを忘れてました。
ノーマルのマージソートとのパフォーマンスの比較はまだしていませんので気になる方は比較してみてください。(爆
NetBeans を使って JDK 7 build 58 を試してみました。
試すといっても私は素人ですし、英語もだめなのでこちらのサイトで紹介されているものをまんま試してみました。
その一部始終はこちらです。
NetBeans に JDK を一度登録したらプロジェクトのプロパティでいつでも選択できるようになります。
JavaDoc も登録して使用できます。
便利です!
プログラム実行時のコマンドライン引数も設定できますのでいちいち長いコマンド入力をしなくてすみます。
気軽に試せます。
また、エラーやヒントも対応してくれます。(たぶん・・・)
新しい物好きな人で楽なのがいい人向けの隠れた使い方でしょうか(^^;