ティップスチップスと言うんじゃあない。Android先日、独自のカスタムパーミッションを使用するアプリを開発していた時に見事にこの現象にハマったので対策方法をメモっておく。検索しても意外と日本語の情報がなかったので誰かの参考になれば幸いです。おまけ:なぜ独自パーミッションがカブると駄目なのかAndroid5.0でINSTALL_FAILED_DUPLICATE_PERMISSIONまず最初に、この現象はAndroid5.0以降でしか起こらず、Android4.4(Kitkat)以前だと全く同じ設定でも発生しない。このエラーが発生する原因は、別々の開発者によって同一の名前で独自パーミッションが定義された場合、後からインストールしようとしたアプリはインストールさせないという制限がAndroid5.0から追加されたからである。名前が同一の独自パーミッションαをマニフェストに定義しているアプリAとアプリBがあった場合、lolipop以降の端末ではアプリAをインストールしてからアプリBをインストールしようとした場合、INSTALL_FAILED_DUPLICATE_PERMISSIONのエラーが出てアプリBのインストールに失敗する。同様に、アプリBをインストールしてからアプリAをインストールしようとしてもアプリAのインストールに失敗する。この動作はKitkatからLolipopで変更された点で、よく調べてみるとリファレンスにもしっかり書いてある。installation.https://developer.android.com/about/versions/android-5.0-changes.html#custom_permissions上記の太字箇所に記載されている通り、Lolipop以降では別々の署名でビルドされたアプリで同一名称のパーミッションが定義されていた場合、後からインストールしようとしたアプリはインストールできないという仕様が追加された。こんな現象は自分一人で開発しているとなかなか気が付かず、アプリをリリースしてから初めて発覚する類のもので、しかもアプリのインストールすらできないという最悪の結果をもたらすが、あまり広くは知られていないようである(そもそも独自パーミッションを必要とするもの自体がそんなにないけど)。別々のアプリで独自パーミッションの定義が同一になるケースというのはあまりないが、実際に発生しそうな事例もリファレンスに記載されている。definitions.https://developer.android.com/about/versions/android-5.0-changes.html#custom_permissions上記の引用では独自パーミッション定義がカブる可能性について以下の3つが指摘されている。独自パーミッションを定義しているサンプルコードを使用する場合1についてはおそらくあまり気にする必要はないと思われる。いうのも、基本的にはパーミッション名はアプリパッケージ名のリバースドメイン方式で定義することがほとんどだと思われるので、全く別々の開発者がたまたま同一のパーミッションを定義してしまう可能性はおそらく非常に低いと考えられるからである。2はかなり危ういケースで、実際に大きな問題が発生するとしたらこの場合なんじゃなかろうか。自分は独自パーミッションを定義してるライブラリは知らないが、実際にこのケースで問題が発生した場合、使用するライブラリを変更するかライブラリをカスタマイズする必要が出てくるので影響範囲が大きそうである。実際に一番起こりやすいのが3のケースである。検索して出てくるのはほとんどこのケースで、Google公式のGCMのサンプルで独自パーミッションが定義されているため、このサンプルコードをそのまま使っているアプリが5.0からインストールできなくなったという相談がstackoverflowに数多く挙げられている。この場合は原因さえ知っていれば対策は簡単で、独自パーミッションの定義値を自分のアプリのパッケージ名のリバースドメイン方式等に変更すればいいだけである。参考:http://stackoverflow.com/questions/27043933/install-failed-duplicate-permission-c2d-messageおまけ:なぜ独自パーミッションがカブると駄目なのか最後に、なぜ4.4以前はOKだったのに5.0以降でこのようなインストール制限が追加されたのかについて補足しておく。カスタムパーミッションをその名前で追跡します。一度パーミッションが定義されると、他のアプリケーションはそれを変更できません。保護レベルで定義したとします。インストールする前に、不正なアプリケーション「B」をインストールしていました。保護されたデータを読み込む許可を得ます。Androidのカスタムパーミッションで顧客情報流出のおそれ上記はトレンドマイクロセキュリティブログからの引用であるが、要するに先にパーミッション名を押さえてしまえば後から同一の名前のパーミッションを持つアプリに対して、任意のデータを取得することができるからということである。要するにただのセキュリティホールだったわけです。それが5.0で対策された、と。中国の商標登録ビジネスみたいな感じ?ですね。先日AndroidStudioの1.5がリリースされたが、AndroidStudio1.5にしたら急にそれまでビルドできていたプロジェクトがビルドできないという現象が発生した。調べて見ると同じ現象...記事を読む[Android]ロードバイクギア比チェッカーをリリースしました!先日、Androidアプリロードバイクギア比チェッカーをリリースしました。このアプリは、ギア比を知りたいコンポの組み合わせをポチポチするだけで簡単にギア比が一覧表示されるという便利アプ...記事を読む[Android]ArrayAdapterをカスタマイズする時に絶対にやってはいけないこと先日、ArrayAdapterに対してadd()やclearなどの操作をしてもなぜか画面に反映されないという原因不明のバグを調査していたが、原因が判明したのでメモしておく。このバグはプログラミ...記事を読む[Android]ServiceのonRebindが呼ばれない原因と対策Androidで独自のServiceを実装する際、bindとunbindを繰り返すような実装を行わなければならないことがある。この時、最初のbind時にはonBindが実行され、unbind後に再...記事を読む[Mac]作業効率が劇的にアップするEclipseの必須キーボードショートカット15選そろそろAndroidの開発環境も徐々にAndroidStudioに移行してきているところも多いかと思いますが、実際の開発現場ではまだまだEclipseが主流派かと思います。コメントをキャンセルメールアドレスが公開されることはありません。