home ホーム search 検索 -  login ログイン  | reload edit datainfo version cmd icon diff delete  | help ヘルプ

技術/Android/SamePackageName

技術/Android/SamePackageName

技術 / Android / SamePackageName
id: 994 所有者: msakamoto-sf    作成日: 2011-07-09 22:56:29
カテゴリ: Android 

パッケージ名が同じ二つのアプリケーションをインストールするとどうなるか?
結論:アプリケーションのアップデートと状況は一緒。

基本的にパッケージ名に対してユニークなuid/gidが発行されるため、パッケージ名が同じであればインストール先/uid/gidも同一となり、アプリケーションのバージョンアップを行う事になる。

ただしapkに署名した場合、証明書が同一である必要がある。後述するが、パッケージ名が同じだが署名が異なる場合、二つ目のアプリはインストール出来ない。

実験1

同じ証明書で署名するパターン。

SamePackage1

先にインストールするアプリ。

package test.android;
 
import java.io.FileOutputStream;
 
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
 
public class Main extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        Log.i("test-getPackageCodePath", getPackageCodePath());
        Log.i("test-getPackageName", getPackageName());
        Log.i("test-getPackageResourcePath", getPackageResourcePath());
 
        String string = "hello world!";
        try {
            FileOutputStream fos = openFileOutput("file1",
                    Context.MODE_PRIVATE);
            fos.write(string.getBytes());
            fos.close();
        } catch (Exception e) {
            Log.e("test", "fileoutput", e);
        }
 
    }
}

インストール:

> adb install SamePackage1.apk
602 KB/s (8022 bytes in 0.013s)
        pkg: /data/local/tmp/SamePackage1.apk
Success

実行時LogCat:

07-09 05:43:01.585: INFO/test-getPackageCodePath(579): /data/app/test.android.apk
07-09 05:43:01.585: INFO/test-getPackageName(579): test.android
07-09 05:43:01.585: INFO/test-getPackageResourcePath(579): /data/app/test.android.apk

/data/app:

-rw-r--r-- system   system       7586 2011-07-09 05:42 test.android.apk

/data/data:

drwxr-xr-x app_28   app_28            2011-07-09 05:43 test.android

/data/data/test.android/files/:

-rw-rw---- app_28   app_28         12 2011-07-09 05:43 file1
# cat file1
cat file1
hello world!

SamePackage2

二番目にインストールするアプリ。

package test.android;
 
import java.io.FileOutputStream;
 
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
 
public class Main extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        Log.i("test-getPackageCodePath", getPackageCodePath());
        Log.i("test-getPackageName", getPackageName());
        Log.i("test-getPackageResourcePath", getPackageResourcePath());
 
        String string = "hello world!";
        try {
            FileOutputStream fos = openFileOutput("file2",
                    Context.MODE_PRIVATE);
            fos.write(string.getBytes());
            fos.close();
        } catch (Exception e) {
            Log.e("test", "fileoutput", e);
        }
 
 
    }
}

インストール:

> adb install SamePackage2.apk
522 KB/s (8026 bytes in 0.015s)
        pkg: /data/local/tmp/SamePackage2.apk
Failure [INSTALL_FAILED_ALREADY_EXISTS]

"-r"で再インストールさせる。

> adb install -r SamePackage2.apk
712 KB/s (8026 bytes in 0.011s)
        pkg: /data/local/tmp/SamePackage2.apk
Success

実行時LogCat:

07-09 05:51:22.646: INFO/test-getPackageCodePath(1569): /data/app/test.android.apk
07-09 05:51:22.656: INFO/test-getPackageName(1569): test.android
07-09 05:51:22.656: INFO/test-getPackageResourcePath(1569): /data/app/test.android.ap

/data/app:

-rw-r--r-- system   system       7591 2011-07-09 05:51 test.android.apk

/data/data:uid/gidがSamePackage1と変わっていない。パッケージ名が同じなので、そのまま上書きされたと思われる。

drwxr-xr-x app_28   app_28            2011-07-09 05:43 test.android

/data/data/test.android/files/:SamePackage1で作成されたfile1が残っている。

-rw-rw---- app_28   app_28         12 2011-07-09 05:51 file2
-rw-rw---- app_28   app_28         12 2011-07-09 05:50 file1
# cat file2
hello world!

実験2

SamePackage1と2で証明書が異なるパターン。

> adb install SamePackage2.apk
391 KB/s (8027 bytes in 0.020s)
        pkg: /data/local/tmp/SamePackage2.apk
Failure [INSTALL_FAILED_ALREADY_EXISTS]

> adb install -r SamePackage2.apk
653 KB/s (8027 bytes in 0.012s)
        pkg: /data/local/tmp/SamePackage2.apk
Failure [INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES]

このように、"証明書が一致しない"としてインストール出来ない。



プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2011-07-09 23:10:55
md5:6cf00121d34f0b33d2711a8181a45c7e
sha1:6a0dca6d20a53d9b2932ec68daffb340cdc78edb
コメント
コメントを投稿するにはログインして下さい。