ラベル Android の投稿を表示しています。 すべての投稿を表示
ラベル Android の投稿を表示しています。 すべての投稿を表示

2013年3月6日水曜日

AndroidとOpenJDKのRandom.javaの実装を比較しました

JavaのRandomに同じseedを渡せば、どんな環境でも同じ値が得られるのか?という疑問から、AndroidとOpenJDKの実装を比較することにしました。

java.utilのRandom.javaです。
乱数を得るメソッドはいくつもありますが、これらは最終的にnext(int)を呼びます。
なので、このnext(int)について比較します。

これがAndroid4.2のnext(int)です。
private static final long multiplier = 0x5deece66dL;
 
protected synchronized int next(int bits) {
    seed = (seed * multiplier + 0xbL) & ((1L << 48) - 1);
    return (int) (seed >>> (48 - bits));
}

これがOpenJDK6のnext(int)です。
private final static long multiplier = 0x5DEECE66DL;
private final static long addend = 0xBL;
private final static long mask = (1L << 48) - 1;
 
protected int next(int bits) {
    long oldseed, nextseed;
    AtomicLong seed = this.seed;
    do {
        oldseed = seed.get();
        nextseed = (oldseed * multiplier + addend) & mask;
    } while (!seed.compareAndSet(oldseed, nextseed));
    return (int)(nextseed >>> (48 - bits));
}

肝となる処理はどちらも同じですが、OpenJDKの方が一部の値を定数として保持している分綺麗だと思います。
違いはOpenJDKがAtmicLong#compareAndSet(long, long)でdo whileを回していることです。
AtmicLong#compareAndSet(long, long)はこちらの情報によると「この変数をこの新しい値に更新すること。ただし、このメソッドが最後に参照した後で他のスレッドによって値が変更された場合は、更新処理を失敗すること」とあります。
つまり、複数のスレッドから操作した場合にAndroidとOpenJDKで別の結果を得ることになるかもしれません。

2012年12月17日月曜日

OrmLiteを使う時のProgurdの設定

AndroidでSQLiteを使うときはだいたいOrmLiteを使っています.
ProguardとOrmLiteを併用すると,OrmLiteから使用するメソッドをProguardが消してしまったりリネームしてしまったりするので,proguard-project.txtで適切に設定する必要があります.
-keepattributes *Annotation*
-keep class com.j256.**
-keepclassmembers class com.j256.** { *; }
-keep enum com.j256.**
-keepclassmembers enum com.j256.** { *; }
-keep interface com.j256.**
-keepclassmembers interface com.j256.** { *; }
-keep public class パッケージ.model.** {
public <init>();
}
-keep public class * extends com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper {
public <init>(android.content.Context);
}
僕はこのように書いています.

project.propertiesにproguard.config=${sdk.dir}/tools/proguard/proguard-android-optimize.txt:proguard-project.txtを書くのを忘れずに.

2012年12月2日日曜日

AndroidアプリをXtendで開発する方法

Ubuntu12.04の64bit版,Eclipse3.7を使用しています.

XtendでAndroidアプリを開発を試してみたので,手順をブログに残します.


XtendとJavaの関係はJavaScriptとCoffeeScriptの関係によく似ています.
Xtendで書かれたソースコードはJavaのソースコードへと変換され,そのJavaソースコードはJavaのバイトコードへと変換されます.
今回はAndroidなので,そこからさらにDexに変換されることになります.

続きは手順です.

2012年11月16日金曜日

暗黙的Intentの対象のServiceが複数あった場合の挙動について

Androidの暗黙的IntentでActivityを起動する場合には,どのActivityを起動するか選択するダイアログが表示されます.
ではServiceの場合ではどういう挙動をするのか.社内で話題になったので確認してみました.
Activityのように選択のダイアログが出てくるんじゃないか,両方起動するんじゃないか,パッケージ名でソートした結果上に来たものなどの予想をしていましたが,結果は先にインストールされたものが優先される,でした.
検証方法です.
  1. 起動するとToastを表示するServiceを持ったアプリを二つ作ります. 
  2. そのサービスを呼ぶ共通の暗黙的IntentをAndroidManifestに書きます.
  3. 第三のアプリから暗黙的Intentを投げて表示されるToastを確認します.
そもそもServiceを暗黙的Intentで呼び出すことなんてあるのでしょうか.

以下は検証に使用したソースコードです.

2012年11月8日木曜日

Eclipseでエディタを分割して同一のファイルを表示する方法

Eclipseを使っていて,同じファイルの上の方を見ながら下の方に追記したい場合などに便利なテクニックです.
Eclipse4.2をまだ使っていないので4.2で行う方法は分かっていません.僕はまだ3.7を使っています.




2012年11月7日水曜日

Java(Android)でOAuthEchoをする方法

最近までOAuthEchoという仕組みを知らなかったのですが,この仕組みを使う機会を得たので作ってみました.
検索してもコピペでサクッと使えるようなものが見つからなかったので,コピペでサクッと使ってもらえるようにコピペでサクッと使えそうな感じに書いておきます.
Twitter4Jの2.2.6を使用しています.
Androidで実行しましたが,Twitter4Jさえ使えればAndroid以外のJava環境でも動作すると思います.

2012年11月6日火曜日

ActionBarSherlockのActionBarの色を変える方法

ICSやJerryBeanを搭載した端末が増えてきましたが,まだまだGingerBread以下も多いため,ActionBarを使いたくてActionBarSherlockを使うことが多いと思います.
ActionBarSherlockでActionBarの色を変えるのが思いの外手間取ったのでメモを残します.
次のSupportLibraryにはActionBarが含まれるらしいですが,いつ公開されるのでしょう.

ActionBarSherlockの4.2.0で確認しています.
android:theme="@style/Theme.Sherlock"を指定した,ICSというかActionBarSherlockのデフォルトがこれです.


2012年5月24日木曜日

WebViewClientのonPageStartedが二度呼ばれる

AndroidのWebViewClientのonPageStartedが二度呼ばれるという問題に遭遇しました.
URLにアクセスできなかった場合に起きるようです.
バグなのかと思いましたが,仕様のようです.
onPageStartedはWebページの読み込みを開始した時点で呼ばれます.
AというURLにアクセスした時に一回目が呼ばれ,Aにアクセスしようとしたが,接続出来なかった場合のエラーページを読み込み始めた時に二回目が呼ばれるようです.

2012年5月18日金曜日

WebSettings#setPluginEnabledはdeprecated,WebSettings#setPluginStateを使う

APIレベル7のAndroid2.1向けにアプリを開発していたので気がついていなかったのですが,APIレベル8のAndroid2.2からWebSettingsのsetPluginEnabledが非推奨になっていました.
代わりにsetPluginStateを使います.
setPluginStateはAPIレベル8で追加されたメソッドです.

2012年5月17日木曜日

Android2.3のエミュレータではWebView#addJavaScriptInterfaceが使えない

Android2.3のエミュレータのバグにより,WebViewのaddJavaScriptInterfaceを使用してJavaScriptからJavaのメソッドを呼び出すとアプリが落ちます.
この問題は2.3のエミュレータでのみ発生するようです.