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
2010年 02月 04日

Fotolife for Android リリース

Fotolife for Androidがリリースされました。

期間的にはだいたい1ヶ月で、そんなに短かいわけではないのですが、割と大変でした。Android ケータイはもちろん持っていて、使っていたわけですが、開発は Scala で rake 使って Hello, World! を動かす程度しかやっておらず (いろいろ間違ってる)、Java 自体、Rhino、Scala で間接的に一部 API を使ったことがあるだけで、ちゃんと Java のコードを書いたのは開発が決まってからでした。

「Java の文法・API」と「Android の API・バッドノウハウ」の二重でハマるので、特に最初の2週間は、アプリケーションも形にならず (アップロードもできず、表示もろくにできなかった)、たいへんしんどかったです。ちゃんとしたマルチスレッドも、普段 Perl, JavaScript ばかりなので同期方に慣れずに苦労しました (Ruby も割とシングルスレッド脳で書いてるし)、というか、いまもしてます。

スレッドまわりに関しては「Java 言語で学ぶデザインパターン入門 マルチスレッド編」を借りて読んだり、「Java 並行処理プログラミング」を買ってもらって読んだりしてみました。どちらも解りやすく、後者は特に何を使うべきかが明確で実践に即応用できたので良かったです。java.util.concurrent スゲー! ってことで使いまくってます。ソースコードは Future だらけです。new Thread() を全然書いてないです。

基本的に、Android の開発は Google のオフィシャルのドキュメントをちゃんと熟読するのが近道だと思いました。あと、それだけだと、僕みたいなのは頭に入ってこないので、android のレポジトリを全部落としてきてデフォルトで入っているアプリのソースを読むのがいいと思いました。SDK のサンプルは最小限で、それはそれでいいのですが、もっと具体的にどうするのかがよくわからなかったりするので、やっぱちゃんと動いてるコードは偉大です。

Java は食わず嫌いでしたが、やってみると案外楽しくて、思ったより書いていてイライラしない言語だなぁと思いました。基本部分のAPI (特に Stream 系) は死ぬほど冗長で意味がわからないのですが、Android 関係の API は割と普通に使える印象でした。(そのうち書きますが Eclipse と Vim を連携させて書いてます) 匿名クラス萌えです。

id:secondlife さんディレクションのもと開発し、id:nagayama さんに各種アイコンのデザイン、id:aaron さんに英語リソースのチェックをしてもらい、id:tikeda さん、id:hakobe932 さんに直前にフィードバックを貰いました。

しばらく社内用に書いたノウハウを公開していこうと思います。Fotolife for Android のAPI (インテント) も公開するので少々お待ちください。


2010年 01月 25日

gerry++

2010年 01月 24日

gerry++

2010年 01月 22日

語尾に「キリッ」とかつきそうな文章にまさに「(キリッ)」を追加する userjs

2010年 01月 15日

はてなスター ×☆☆☆ (はてなスター ほしみっつ!)

ひだまりスケッチ×☆☆☆ (ほしみっつ) が始まったので、この日記ではてなスターを3個ずつ付くようにしました。スタイルシート欄に以下を書くと同じことができます。

.hatena-star-star-image {
    background-image: url('http://img.f.hatena.ne.jp/images/fotolife/c/cho45/20100115/20100115025432.gif');
}
.hatena-star-green-star-image {
    background-image: url('http://img.f.hatena.ne.jp/images/fotolife/c/cho45/20100115/20100115025631.gif');
}
.hatena-star-red-star-image {
    background-image: url('http://img.f.hatena.ne.jp/images/fotolife/c/cho45/20100115/20100115025800.gif');
}
.hatena-star-blue-star-image {
    background-image: url('http://img.f.hatena.ne.jp/images/fotolife/c/cho45/20100115/20100115025902.gif');
}
.hatena-star-temp-star-image {
    background-image: url('http://img.f.hatena.ne.jp/images/fotolife/c/cho45/20100115/20100115030003.gif');
}
2010年 01月 14日

tig.rb のアップデート

最近いろいろ入ったのですが、先日の twitter の API のアップデートにともない動かなくなってアップデートする人がハマらないように FAQ を書いておきます

SSL の verification に失敗する

たぶん証明書がインストールされてないのでインストールしてください。

Ubuntu (Debian) だと

sudo apt-get install ca-certificates

でいけると思います。

DNS 書きかえられたときに入った変更です。

API 上限を超える

lists に対応した関係で API アクセスの数が増えています。とくに大量に lists を作っていると結構食います。自動的に頻度調節をしていますが、割と適当なので溢れるかもしれません。

超えるのが頻発するのは、バグなのでどっかでつっつくか直してください。

2010年 01月 08日

Chemr と chmlib ruby binding を git 化