パッケージ名が同じ二つのアプリケーションをインストールするとどうなるか?
結論:アプリケーションのアップデートと状況は一緒。
基本的にパッケージ名に対してユニークなuid/gidが発行されるため、パッケージ名が同じであればインストール先/uid/gidも同一となり、アプリケーションのバージョンアップを行う事になる。
ただしapkに署名した場合、証明書が同一である必要がある。後述するが、パッケージ名が同じだが署名が異なる場合、二つ目のアプリはインストール出来ない。
同じ証明書で署名するパターン。
先にインストールするアプリ。
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!
二番目にインストールするアプリ。
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!
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]
このように、"証明書が一致しない"としてインストール出来ない。