#navi_header|技術| パッケージ名が同じ二つのアプリケーションをインストールするとどうなるか? ''結論:アプリケーションのアップデートと状況は一緒。'' 基本的にパッケージ名に対してユニークなuid/gidが発行されるため、パッケージ名が同じであればインストール先/uid/gidも同一となり、アプリケーションのバージョンアップを行う事になる。 - Security and Permissions | Android Developers -- http://developer.android.com/guide/topics/security/security.html --- "User IDs and File Access" 参照 ''ただしapkに署名した場合、証明書が同一である必要がある。'' 後述するが、パッケージ名が同じだが署名が異なる場合、二つ目のアプリはインストール出来ない。 #more|| * 実験1 同じ証明書で署名するパターン。 ** SamePackage1 先にインストールするアプリ。 #code|java|> 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 二番目にインストールするアプリ。 #code|java|> 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で証明書が異なるパターン。 #pre||> > 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] ||< このように、"証明書が一致しない"としてインストール出来ない。 #navi_footer|技術|