2010年 02月 05日







意外と空の写真を撮ってるなぁ。空ほど、写真にしてあとで見てがっかりするするものはない。







こういうシーンだとケータイの撮って出しでもいい感じ (一番下のはたぶん素子の許容量超えて光が入って飽和して色が変わってる? フレアがでたらいいなぁと思って撮ったらこうなった……)

Android の組込みアプリ以外のパーミッションの取り扱い

はてなアカウント管理を作るにあたり、最初は Android のパーミッションの仕組みにのっかろうと考えていましたが、調べていくうちにセキュリティリスクがあることがわかったので、別途自力でユーザにオプトインする仕組みを入れました。(はてな以外からリリースされるアプリケーションでは、アカウント管理に情報を渡す際に本当に渡すかをユーザに同意を求めるようになっています)

Android のパーミッションの仕組みは「先に定義したもん勝ち」という感じのようなので、端末デフォルトでインストールされていて、アンインストールが不可能になっているアプリケーションでのみ、安全に働くようでした。なんかやりかたがあるのかよくわかりませんが、そんな感じでしたので、今のところ一番確実な方法を選んでいます。

手元の実機 (Android 1.6) での検証では

  • <permission android:name="com.example.permission.FOOBAR" android:protectionLevel="dangerous".../> というパーミッションを定義する、アプリケーションA
  • それを uses-permission で定義する、アプリケーションB
  • <permission android:name="com.example.permission.FOOBAR" android:protectionLevel="normal".../> というパーミッションを定義する、悪意あるアプリケーションC

A の signature と B, C の signature は別

A → B とインストール

  1. A インストール
    • permission が定義される
  2. B インストール
    • uses-permission の内容が表示される
  3. B で該当パーミッションAに対し使おうとする
    • 成功する

→ 正常

B → A とインストール

  1. B インストール
    • uses-permission は表示されない (Unknown permission)
  2. A インストール
    • permission が定義される
  3. B で該当パーミッションAに対し使おうとする
    • 該当パーミッションは定義されていないためセキュリティエラー Permission Denial

→ 正常 (この場合 B をインストールしなおすしかないのでユーザビリティ的に問題があるため採用できない)

C → A → B とインストール

  1. C インストール
    • permission が定義される (protectionLevel="normal" == ユーザに確認がでないパーミッション)
  2. A インストール
    • permission は定義されない (既に存在するので無視される)
  3. B インストール
    • uses-permission の内容が表示されないが C で定義された permission が grant される
  4. B で該当パーミッションAに対し使おうとする
    • 成功する

Bがユーザへの確認なしに、不正にパーミッションを行使していることになる。

インストール関係のインテントとかをコマンドラインから発行する

パーミッションのテストみたいなのは死ぬほどめんどいです。コマンドラインからやってもめんどい。

adb install は PackageManager を使わないのでダメです。もちろんちゃんと sign した apk じゃないとダメです。

adb push Foo.apk /sdcard
adb shell am start -a android.intent.action.VIEW -t application/vnd.android.package-archive -d file:///sdcard/Foo.apk

でインストール

adb uninstall com.example.foo

でアンインストール (パッケージ名を指定するみたいです)


ちまたの sdcard からアプリをインストールするやつは、上記 Intent を投げているだけなので、特別パーミッションがいらないはずですが、なんかやたらパーミッションを要求するのが多くて、開発者以外にテストしてもらう際に困ります。

全くパーミッションを要求しないやつには com.mmg.appin というものがあるっぽいです。

ウェブアプリとAndroidアプリの対応

  • ページ表示 (View, Controller) → Activity
  • モデル → ContentProvider
  • ワーカー → Service
  • cron バッチ → AlarmManager