ラベル Android の投稿を表示しています。 すべての投稿を表示
ラベル Android の投稿を表示しています。 すべての投稿を表示

2016/11/10

Smaller APKs : Android におけるAPKを小さく保つためのテクニック

Android Performance Patterns Session にいい動画が上がっていたので、備忘録として中身を書き出しておく

Removing Unused Resources

gradle file にて以下の minifyEnabledshrinkResources をセットしておく。

android {
    ...
    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'),
            'proguard-rules.pro'
        }
    }
}

これらはアプリ内で使用していないリソースを除去してくれます。

Multi Resources Support

Android がサポートしているリソースサイズを全て揃えるとそれだけで結構な量になるので、必要なものだけ使う。

ldpi mdpi から自動で作られる
mdpi
tvdpi 使わない
hdpi xxhdpi から自動で作られる
xhdpi xxhdpi から自動で作られる
xxhdpi
xxxhdpi
  • mdpi
  • xxhdpi
  • xxxhdpi

のみ使用する

Vector Drawables

PNG や JPEGの代わりに vector 画像を使うようにする。

Reuse Existing Resources

可能であれば画像の再利用を行う、
例えば、下向きの矢印を上向き矢印に変更するなど。 他にもAndroid の機能を使って、以下のものを変更できる。

  • color tint(色味)
  • shapes(形)

Removing Unused Code

  • ProGuard を使う
  • ProGuard を使う時は、minifyEnabled true を使って ProGuard の仕事量を減らす。
  • 必要なライブラリの軽いバージョンを見つける、どうしてもない場合は必要な箇所のソースだけ抜いてくる。

Apk Analyzer

Android Studio 2.2 から搭載された apk analyzer を使う。

2016/02/03

Android 5.0.2 以上でBLEが動かない

Occurrence -事象-

機材とAndroid を BLE (Bluetooth low energy) で繋ごうとしたところ、Android 5.0.2以上の端末で Security Exception が発生した。
5.0.1 や 4.2 などは問題ないが、5.1や6.0で発生する。

エラー内容は以下のようになっている。

java.lang.SecurityException: Need BLUETOOTH_PRIVILEGED permission: Neither user 99999 nor current process has android.permission.BLUETOOTH_PRIVILEGED.

発生箇所は BluetoothGatt#setCharacteristicNotification

Causes -原因-

StackOverflow にほぼ発生事例そのままの報告がある、

Android 5.0.2 onwards don’t allow HID access through Bluetooth LE

さらに、Android Issues に [BLE] Reading/writing char/descr of a HID service throws an exception があり、その中で

“Enforce BLUETOOTH_PRIVILEGED permission for HID-over-GATT”

のメッセージのコミットが原因でHIDに対する GATTのコネクションに BLUETOOTH_PRIVILEGED が要求されるようになったと書かれている。

HID とは ?

HID(Human Interface Device)のことで、
マウスやキーボードなどの入力装置を無線化するためのBluetooth用のプロファイル。
本来上記の通り、マウスキーボードなどに使われるものだが、健康器具などにも使われているケースがある。確かに人が使うものだけど。

BLUETOOTH_PRIVILEGED とは?

Android Developers によれば、

Allows applications to pair bluetooth devices without user interaction, and to allow or disallow phonebook access or message access. This is not available to third party applications.

HIDに関係ありそうなのは、メッセージに対するアクセスかな?
全然HIDと関係なさそうに見える。
ただ一番大事なのは最後のサードパーティアプリはこれを有効に出来ないという一文。
ビルドインアプリを開発するか、OSのビルド署名を貰えるようなアプリ開発の時は問題ないが、普通にアプリを作っている場合は、この権限を有効化する方法はない。

see also AndroidDevelopers::Manifest.permission::BLUETOOTH_PRIVILEGED

Summary -まとめ-

HID を使ってるかの判断

以下のコミットによると、HIDの判断は, Characteristic UUID が
https://android.googlesource.com/platform/packages/apps/Bluetooth/+/02bebee

00002A4A-0000-1000-8000-00805F9B34FB
00002A4B-0000-1000-8000-00805F9B34FB
00002A4C-0000-1000-8000-00805F9B34FB
00002A4D-0000-1000-8000-00805F9B34FB

のいずれかに該当した場合となる。

上記 Characteristic を引数にしてい BluetoothGatt#setCharacteristicNotification をコールすると SecurityException が発生するようになっている。

禁止された Characteristic UUID

Bluetooth Developer portal で Characteristic UUID の区分け確認できる。

Characteristic UUID 内容
00002A4A-0000-1000-8000-00805F9B34FB HID Information
00002A4B-0000-1000-8000-00805F9B34FB Report Map
00002A4C-0000-1000-8000-00805F9B34FB HID Control Point
00002A4D-0000-1000-8000-00805F9B34FB Report

see also Bluetooth Developer portal : Characteristics

なぜ禁止されたのか?

わからない。
結論から言うとわからない。なんらかのバグ修正としてコミットされているが、
どのような背景があるのかはわからなかった。

2013/11/01

JB_MR2(4.3)とKitKat(4.4)のPermission比較(メーカー署名関係)

Android 4.3 (JELLY_BEAN_MR2) が出て結構時間がたちました、恒例のsignatureがらみのPermission比較やらなきゃーと思って放置してたら4.4(Kitkat)が出ちゃったので慌てて更新します。
前回までのPermission比較は


にあります。


何調べてるの?

本記事は署名関係の Android Permission に注目してバージョン間の差分を比較しています。
これらの Permission が要求されるAPIに関してはOSビルド時の署名が必要になります。
メーカー端末であれば販売メーカーに依頼を出して署名をしてもらう必要がありますが、
通常出来ません。
よって3rdパーティアプリを作成する場合これらの Permission を要求されるAPIは使用不可能になります。
Androidはバージョンアップを重ねる毎にこれら Permission の締め付けがきつくなってるのでバージョンアップ毎にチェックしています。

JB MR2 と KitKatのプロテクションレベルの一覧比較


JB MR2
  • dangerous
  • signature|system
  • normal
  • signature
  • signature|system|development
  • system|signature
  • signatureOrSystem
KitKat
  • dangerous
  • signature|system
  • normal
  • signature
  • signature|system|development
  • system|signature
  • signatureOrSystem
特に変更なし


Permission増減調査(JB MR1(4.2) > JB MR2(4.3))

[signature]


これはメーカー署名がないと使用出来ないもの
android.permission.BLUETOOTH_STACK
android.permission.ACCOUNT_MANAGER
android.permission.HARDWARE_TEST
android.permission.NET_ADMIN
android.permission.REMOTE_AUDIO_PLAYBACK
android.permission.INTERACT_ACROSS_USERS_FULL
android.permission.GET_DETAILED_TASKS
android.permission.REMOVE_TASKS
+ android.permission.MANAGE_ACTIVITY_STACKS
android.permission.START_ANY_ACTIVITY
android.permission.SET_SCREEN_COMPATIBILITY
android.permission.ACCESS_ALL_EXTERNAL_STORAGE
android.permission.FORCE_STOP_PACKAGES
android.permission.SET_PREFERRED_APPLICATIONS
android.permission.ASEC_ACCESS
android.permission.ASEC_CREATE
android.permission.ASEC_DESTROY
android.permission.ASEC_MOUNT_UNMOUNT
android.permission.ASEC_RENAME
android.permission.DIAGNOSTIC
android.permission.STATUS_BAR_SERVICE
android.permission.FORCE_BACK
android.permission.INTERNAL_SYSTEM_WINDOW
android.permission.MANAGE_APP_TOKENS
android.permission.FREEZE_SCREEN
android.permission.INJECT_EVENTS
android.permission.FILTER_EVENTS
android.permission.RETRIEVE_WINDOW_INFO
android.permission.TEMPORARY_ENABLE_ACCESSIBILITY
android.permission.MAGNIFY_DISPLAY
android.permission.SET_ACTIVITY_WATCHER
android.permission.GET_TOP_ACTIVITY_INFO
android.permission.READ_INPUT_STATE
android.permission.BIND_INPUT_METHOD
android.permission.BIND_ACCESSIBILITY_SERVICE
+ android.permission.BIND_PRINT_SERVICE
+ android.permission.BIND_NFC_SERVICE
+ android.permission.BIND_PRINT_SPOOLER_SERVICE
android.permission.BIND_TEXT_SERVICE
android.permission.BIND_VPN_SERVICE
android.permission.BIND_DEVICE_ADMIN
android.permission.SET_ORIENTATION
android.permission.SET_POINTER_SPEED
android.permission.SET_KEYBOARD_LAYOUT
android.permission.CLEAR_APP_USER_DATA
android.permission.GRANT_REVOKE_PERMISSIONS
android.permission.ACCESS_SURFACE_FLINGER
android.permission.CONFIGURE_WIFI_DISPLAY
android.permission.CONTROL_WIFI_DISPLAY
android.permission.BRICK
android.permission.DEVICE_POWER
android.permission.NET_TUNNELING
android.permission.FACTORY_TEST
android.permission.BROADCAST_PACKAGE_REMOVED
android.permission.BROADCAST_SMS
android.permission.BROADCAST_WAP_PUSH
android.permission.CONFIRM_FULL_BACKUP
android.permission.CHANGE_BACKGROUND_DATA_SETTING
android.permission.GLOBAL_SEARCH_CONTROL
android.permission.READ_DREAM_STATE
android.permission.WRITE_DREAM_STATE
android.permission.COPY_PROTECTED_DATA
android.permission.MANAGE_NETWORK_POLICY
android.intent.category.MASTER_CLEAR.permission.C2D_MESSAGE
android.permission.BIND_PACKAGE_VERIFIER
android.permission.ACCESS_CONTENT_PROVIDERS_EXTERNALLY
+ android.permission.ACCESS_KEYGUARD_SECURE_STORAGE
+ android.permission.CONTROL_KEYGUARD
android.permission.BIND_NOTIFICATION_LISTENER_SERVICE


全権限新規追加

[signature|system]


メーカー署名があるか、プリインストールのシステムアプリでしか使用出来ないもの

android.permission.SEND_RESPOND_VIA_MESSAGE
android.permission.RECEIVE_EMERGENCY_BROADCAST
android.permission.BIND_DIRECTORY_SEARCH
android.permission.INSTALL_LOCATION_PROVIDER
android.permission.LOCATION_HARDWARE
android.permission.CONNECTIVITY_INTERNAL
android.permission.RECEIVE_DATA_ACTIVITY_CHANGE
android.permission.LOOP_RADIO
android.permission.MANAGE_USB
android.permission.ACCESS_MTP
android.permission.CAMERA_DISABLE_TRANSMIT_LED
android.permission.MODIFY_PHONE_STATE
android.permission.READ_PRIVILEGED_PHONE_STATE
android.permission.WRITE_MEDIA_STORAGE
+ android.permission.MANAGE_DOCUMENTS
android.permission.MANAGE_USERS
android.permission.SET_TIME
android.permission.WRITE_GSERVICES
android.permission.RETRIEVE_WINDOW_CONTENT
android.permission.WRITE_APN_SETTINGS
android.permission.ALLOW_ANY_CODEC_FOR_PLAYBACK
+ android.permission.MANAGE_CA_CERTIFICATES
android.permission.STATUS_BAR
android.permission.UPDATE_DEVICE_STATS
android.permission.UPDATE_APP_OPS_STATS
android.permission.SHUTDOWN
android.permission.STOP_APP_SWITCHES
android.permission.BIND_WALLPAPER
+ android.permission.MANAGE_DEVICE_ADMINS
android.permission.INSTALL_PACKAGES
android.permission.DELETE_CACHE_FILES
android.permission.DELETE_PACKAGES
android.permission.MOVE_PACKAGE
android.permission.CHANGE_COMPONENT_ENABLED_STATE
android.permission.READ_FRAME_BUFFER
+ android.permission.CAPTURE_AUDIO_OUTPUT
+ android.permission.CAPTURE_AUDIO_HOTWORD
+ android.permission.CAPTURE_VIDEO_OUTPUT
+ android.permission.CAPTURE_SECURE_VIDEO_OUTPUT
+ android.permission.MEDIA_CONTENT_CONTROL
android.permission.REBOOT
android.permission.MASTER_CLEAR
android.permission.CALL_PRIVILEGED
android.permission.PERFORM_CDMA_PROVISIONING
android.permission.CONTROL_LOCATION_UPDATES
android.permission.ACCESS_CHECKIN_PROPERTIES
android.permission.PACKAGE_USAGE_STATS
+ android.permission.BATTERY_STATS
android.permission.BACKUP
android.permission.BIND_REMOTEVIEWS
android.permission.BIND_APPWIDGET
android.permission.BIND_KEYGUARD_APPWIDGET
android.permission.MODIFY_APPWIDGET_BIND_PERMISSIONS
android.permission.GLOBAL_SEARCH
android.permission.SET_WALLPAPER_COMPONENT
android.permission.ACCESS_CACHE_FILESYSTEM
android.permission.CRYPT_KEEPER
android.permission.READ_NETWORK_USAGE_HISTORY
android.permission.MODIFY_NETWORK_ACCOUNTING
+ android.permission.MARK_NETWORK_SOCKET
android.permission.PACKAGE_VERIFICATION_AGENT
android.permission.SERIAL_PORT
android.permission.ACCESS_NOTIFICATIONS
+ android.permission.INVOKE_CARRIER_SETUP
+ android.permission.ACCESS_NETWORK_CONDITIONS



android.permission.BATTERY_STATS がdangerous(誰でも実行可能)より移動してきた。これによりなんらかの機能に影響が出る可能性がある。その他は全て新規追加。
MANAGE_CA_CERTIFICATESとか気になるものが増えてる。


[system|signature]


[signature|system]と同じ
+ android.permission.BLUETOOTH_PRIVILEGED
+ android.permission.BIND_CALL_SERVICE
android.permission.MOUNT_UNMOUNT_FILESYSTEMS
android.permission.MOUNT_FORMAT_FILESYSTEMS

追加は両方とも新規。signature|systemとマージしない内部事情でもあるのだろうか?


 [signature|system|development]


メーカー署名、システムアプリ、もしくは開発中に使用出来るもの
android.permission.INTERACT_ACROSS_USERS
android.permission.CHANGE_CONFIGURATION
android.permission.SET_ANIMATION_SCALE
android.permission.WRITE_SECURE_SETTINGS
android.permission.DUMP
android.permission.READ_LOGS
android.permission.SET_DEBUG_APP
android.permission.SET_PROCESS_LIMIT
android.permission.SET_ALWAYS_FINISH
android.permission.SIGNAL_PERSISTENT_PROCESSES
android.permission.GET_APP_OPS_STATS

変更無し


[signatureOrSystem]


[signature|system]と同じ

android.permission.UPDATE_LOCK

変更無し

JB_MR1(4.2)とJB_MR2(4.3)のPermission比較(メーカー署名関係)

Android 4.3 (JELLY_BEAN_MR2) が出て結構時間がたちました、恒例のsignatureがらみのPermission比較やらなきゃーと思って放置してたら4.4(Kitkat)が出ちゃったので慌てて更新します。
前回までのPermission比較は


にあります。


何調べてるの?

本記事は署名関係の Android Permission に注目してバージョン間の差分を比較しています。
これらの Permission が要求されるAPIに関してはOSビルド時の署名が必要になります。
メーカー端末であれば販売メーカーに依頼を出して署名をしてもらう必要がありますが、
通常出来ません。
よって3rdパーティアプリを作成する場合これらの Permission を要求されるAPIは使用不可能になります。
Androidはバージョンアップを重ねる毎にこれら Permission の締め付けがきつくなってるのでバージョンアップ毎にチェックしています。

JB MR1 と JB MR2 のプロテクションレベルの一覧比較


JB MR1
  • dangerous
  • signature|system
  • normal
  • signature
  • signature|system|development
  • system|signature
  • signatureOrSystem
JB MR2
  • dangerous
  • signature|system
  • normal
  • signature
  • signature|system|development
  • system|signature
  • signatureOrSystem
特に変更はありませんね。


Permission増減調査(JB MR1(4.2) > JB MR2(4.3))

[signature]


これはメーカー署名がないと使用出来ないもの
android.permission.BLUETOOTH_STACK
android.permission.ACCOUNT_MANAGER
android.permission.HARDWARE_TEST
android.permission.NET_ADMIN
android.permission.REMOTE_AUDIO_PLAYBACK
android.permission.INTERACT_ACROSS_USERS_FULL
android.permission.GET_DETAILED_TASKS
android.permission.REMOVE_TASKS
android.permission.START_ANY_ACTIVITY
android.permission.SET_SCREEN_COMPATIBILITY
android.permission.ACCESS_ALL_EXTERNAL_STORAGE
android.permission.FORCE_STOP_PACKAGES
android.permission.SET_PREFERRED_APPLICATIONS
android.permission.ASEC_ACCESS
android.permission.ASEC_CREATE
android.permission.ASEC_DESTROY
android.permission.ASEC_MOUNT_UNMOUNT
android.permission.ASEC_RENAME
android.permission.DIAGNOSTIC
android.permission.STATUS_BAR_SERVICE
android.permission.FORCE_BACK
android.permission.INTERNAL_SYSTEM_WINDOW
android.permission.MANAGE_APP_TOKENS
android.permission.FREEZE_SCREEN
android.permission.INJECT_EVENTS
android.permission.FILTER_EVENTS
android.permission.RETRIEVE_WINDOW_INFO
android.permission.TEMPORARY_ENABLE_ACCESSIBILITY
android.permission.MAGNIFY_DISPLAY
android.permission.SET_ACTIVITY_WATCHER
+ android.permission.GET_TOP_ACTIVITY_INFO
android.permission.READ_INPUT_STATE
android.permission.BIND_INPUT_METHOD
android.permission.BIND_ACCESSIBILITY_SERVICE
android.permission.BIND_TEXT_SERVICE
android.permission.BIND_VPN_SERVICE
android.permission.BIND_DEVICE_ADMIN
android.permission.SET_ORIENTATION
android.permission.SET_POINTER_SPEED
android.permission.SET_KEYBOARD_LAYOUT
android.permission.CLEAR_APP_USER_DATA
android.permission.GRANT_REVOKE_PERMISSIONS
android.permission.ACCESS_SURFACE_FLINGER
android.permission.CONFIGURE_WIFI_DISPLAY
android.permission.CONTROL_WIFI_DISPLAY
android.permission.BRICK
android.permission.DEVICE_POWER
android.permission.NET_TUNNELING
android.permission.FACTORY_TEST
android.permission.BROADCAST_PACKAGE_REMOVED
android.permission.BROADCAST_SMS
android.permission.BROADCAST_WAP_PUSH
android.permission.CONFIRM_FULL_BACKUP
android.permission.CHANGE_BACKGROUND_DATA_SETTING
android.permission.GLOBAL_SEARCH_CONTROL
android.permission.READ_DREAM_STATE
android.permission.WRITE_DREAM_STATE
android.permission.COPY_PROTECTED_DATA
android.permission.MANAGE_NETWORK_POLICY
android.intent.category.MASTER_CLEAR.permission.C2D_MESSAGE
android.permission.BIND_PACKAGE_VERIFIER
android.permission.ACCESS_CONTENT_PROVIDERS_EXTERNALLY
+ android.permission.BIND_NOTIFICATION_LISTENER_SERVICE

両権限共に新規追加

[signature|system]


メーカー署名があるか、プリインストールのシステムアプリでしか使用出来ないもの

- android.permission.SEND_SMS_NO_CONFIRMATION
+ android.permission.SEND_RESPOND_VIA_MESSAGE
android.permission.RECEIVE_EMERGENCY_BROADCAST
android.permission.BIND_DIRECTORY_SEARCH
android.permission.INSTALL_LOCATION_PROVIDER
+ android.permission.LOCATION_HARDWARE
android.permission.CONNECTIVITY_INTERNAL
android.permission.RECEIVE_DATA_ACTIVITY_CHANGE
+ android.permission.LOOP_RADIO
android.permission.MANAGE_USB
android.permission.ACCESS_MTP
+ android.permission.CAMERA_DISABLE_TRANSMIT_LED
android.permission.MODIFY_PHONE_STATE
android.permission.READ_PRIVILEGED_PHONE_STATE
android.permission.WRITE_MEDIA_STORAGE
android.permission.MANAGE_USERS
android.permission.SET_TIME
android.permission.WRITE_GSERVICES
android.permission.RETRIEVE_WINDOW_CONTENT
android.permission.WRITE_APN_SETTINGS
android.permission.ALLOW_ANY_CODEC_FOR_PLAYBACK
android.permission.STATUS_BAR
android.permission.UPDATE_DEVICE_STATS
+ android.permission.UPDATE_APP_OPS_STATS
android.permission.SHUTDOWN
android.permission.STOP_APP_SWITCHES
android.permission.BIND_WALLPAPER
android.permission.INSTALL_PACKAGES
android.permission.DELETE_CACHE_FILES
android.permission.DELETE_PACKAGES
android.permission.MOVE_PACKAGE
android.permission.CHANGE_COMPONENT_ENABLED_STATE
android.permission.READ_FRAME_BUFFER
android.permission.REBOOT
android.permission.MASTER_CLEAR
android.permission.CALL_PRIVILEGED
android.permission.PERFORM_CDMA_PROVISIONING
android.permission.CONTROL_LOCATION_UPDATES
android.permission.ACCESS_CHECKIN_PROPERTIES
android.permission.PACKAGE_USAGE_STATS
android.permission.BACKUP
android.permission.BIND_REMOTEVIEWS
android.permission.BIND_APPWIDGET
android.permission.BIND_KEYGUARD_APPWIDGET
android.permission.MODIFY_APPWIDGET_BIND_PERMISSIONS
android.permission.GLOBAL_SEARCH
android.permission.SET_WALLPAPER_COMPONENT
android.permission.ACCESS_CACHE_FILESYSTEM
android.permission.CRYPT_KEEPER
android.permission.READ_NETWORK_USAGE_HISTORY
android.permission.MODIFY_NETWORK_ACCOUNTING
android.permission.PACKAGE_VERIFICATION_AGENT
android.permission.SERIAL_PORT
+ android.permission.ACCESS_NOTIFICATIONS


追加権限は全て新規追加、そして初めて権限の削除を見た。


[system|signature]


[signature|system]と同じ
m android.permission.CHANGE_CONFIGURATION
android.permission.MOUNT_UNMOUNT_FILESYSTEMS
android.permission.MOUNT_FORMAT_FILESYSTEMS

ある意味変更無し、1権限だけ重複してた  [signature|system|development] にマージされる。


 [signature|system|development]


メーカー署名、システムアプリ、もしくは開発中に使用出来るもの
android.permission.INTERACT_ACROSS_USERS
android.permission.CHANGE_CONFIGURATION
android.permission.SET_ANIMATION_SCALE
android.permission.WRITE_SECURE_SETTINGS
android.permission.DUMP
android.permission.READ_LOGS
android.permission.SET_DEBUG_APP
android.permission.SET_PROCESS_LIMIT
android.permission.SET_ALWAYS_FINISH
android.permission.SIGNAL_PERSISTENT_PROCESSES
+ android.permission.GET_APP_OPS_STATS

新規追加のみ


[signatureOrSystem]


[signature|system]と同じ

android.permission.UPDATE_LOCK

特に変化なし(これもどっかにマージして欲しい)

2013/09/06

Androidのシステムアップデートを抑止する方法

しばらく出先でWIFIがない環境だったり、仕事携帯の制約だったりとかで
端末のOSアップデートをしたくない時があります。

そんな時通知領域にあるあのアイコンをタップしないで済む方法。

Android 4.0以上 かつ Samsung社製

設定 > アプリケーション管理 > 全て > ソフトウェア更新の詳細画面 > 「無効」を押す


Android 4.1以上 かつ Nexus系

設定 > アプリケーション管理 > 全て > Googleサービスフレームワークの詳細画面 > 「通知を表示」のチェックを外す



他の場合

システムアップデートの仕様は各社違うので上記の端末以外も他の操作、または同じ操作でいけるかもしれません、やる時は各自自己責任でお願いします。

2013/09/04

Xperia Z tablet の初期化(no Companion)

ロックパスワードが不明な状態の Xperia Z tablet を初期化で救う方法をネットで検索したらCompanionを使う方法ばかりだったので、 macの人が困るのでハードキーのみを使用したリセット方法を見つけたのでメモ。 


  1. 電源落とす
  2. ボリュームキーの下を押しながら電源ボタン長押しで再起動
  3. 初期化画面が出てくる

2012/12/12

JB(4.1)とJB_MR1(4.2)のPermission比較(メーカー署名関係)

Android 4.2 (JELLY_BEAN_MR1) が出ましたので、恒例のsignatureがらみのPermission比較したいと思います。
前回までのPermission比較は


にあります。


何調べてるの?

本記事は署名関係の Android Permission に注目してバージョン間の差分を比較しています。
これらの Permission が要求されるAPIに関してはOSビルド時の署名が必要になります。
メーカー端末であれば販売メーカーに依頼を出して署名をしてもらう必要がありますが、
通常出来ません。
よって3rdパーティアプリを作成する場合これらの Permission を要求されるAPIは使用不可能になります。
Androidはバージョンアップを重ねる毎にこれら Permission の締め付けがきつくなってるのでバージョンアップ毎にチェックしています。

JB と JB MR1 のプロテクションレベルの一覧比較


JB
  • dangerous
  • signature|system
  • normal
  • signature
  • signature|system|development
  • signatureOrSystem
JB MR1
  • dangerous
  • signature|system
  • normal
  • signature
  • signature|system|development
  • system|signature
  • signatureOrSystem
増えた?と思ったらパイプラインで区切られたフラグの順番が逆転していただけでした。
これは signature|system と同一ですね。
しかし signatureOrSystem の件といい、段々適当になってきてる気がする。

Permission増減調査(JB(4.1) > JB MR1(4.2))


[signature]


これはメーカー署名がないと使用出来ないもの

+ android.permission.BLUETOOTH_STACK
android.permission.ACCOUNT_MANAGER
android.permission.HARDWARE_TEST
android.permission.NET_ADMIN
android.permission.REMOTE_AUDIO_PLAYBACK
+ android.permission.INTERACT_ACROSS_USERS_FULL
android.permission.GET_DETAILED_TASKS
android.permission.REMOVE_TASKS
android.permission.START_ANY_ACTIVITY
android.permission.SET_SCREEN_COMPATIBILITY
+ android.permission.ACCESS_ALL_EXTERNAL_STORAGE
+ android.permission.SET_SCREEN_COMPATIBILITY
android.permission.FORCE_STOP_PACKAGES
android.permission.SET_PREFERRED_APPLICATIONS
android.permission.ASEC_ACCESS
android.permission.ASEC_CREATE
android.permission.ASEC_DESTROY
android.permission.ASEC_MOUNT_UNMOUNT
android.permission.ASEC_RENAME
android.permission.DIAGNOSTIC
android.permission.STATUS_BAR_SERVICE
android.permission.FORCE_BACK
android.permission.INTERNAL_SYSTEM_WINDOW
android.permission.MANAGE_APP_TOKENS
+ android.permission.FREEZE_SCREEN
android.permission.INJECT_EVENTS
+ android.permission.FILTER_EVENTS
+ android.permission.RETRIEVE_WINDOW_INFO
+ android.permission.TEMPORARY_ENABLE_ACCESSIBILITY
+ android.permission.MAGNIFY_DISPLAY
android.permission.SET_ACTIVITY_WATCHER
android.permission.READ_INPUT_STATE
android.permission.BIND_INPUT_METHOD
android.permission.BIND_ACCESSIBILITY_SERVICE
android.permission.BIND_TEXT_SERVICE
android.permission.BIND_VPN_SERVICE
android.permission.BIND_DEVICE_ADMIN
android.permission.SET_ORIENTATION
android.permission.SET_POINTER_SPEED
android.permission.SET_KEYBOARD_LAYOUT
android.permission.CLEAR_APP_USER_DATA
android.permission.GRANT_REVOKE_PERMISSIONS
android.permission.ACCESS_SURFACE_FLINGER
+ android.permission.CONFIGURE_WIFI_DISPLAY
+ android.permission.CONTROL_WIFI_DISPLAY
android.permission.BRICK
android.permission.DEVICE_POWER
+ android.permission.NET_TUNNELING
android.permission.FACTORY_TEST
android.permission.BROADCAST_PACKAGE_REMOVED
android.permission.BROADCAST_SMS
android.permission.BROADCAST_WAP_PUSH
android.permission.CONFIRM_FULL_BACKUP
android.permission.CHANGE_BACKGROUND_DATA_SETTING
android.permission.GLOBAL_SEARCH_CONTROL
+ android.permission.READ_DREAM_STATE
+ android.permission.WRITE_DREAM_STATE
android.permission.COPY_PROTECTED_DATA
android.permission.MANAGE_NETWORK_POLICY
android.intent.category.MASTER_CLEAR.permission.C2D_MESSAGE
android.permission.BIND_PACKAGE_VERIFIER
android.permission.ACCESS_CONTENT_PROVIDERS_EXTERNALLY

[signature|system]


メーカー署名があるか、プリインストールのシステムアプリでしか使用出来ないもの

android.permission.SEND_SMS_NO_CONFIRMATION
android.permission.RECEIVE_EMERGENCY_BROADCAST
+ android.permission.BIND_DIRECTORY_SEARCH
android.permission.INSTALL_LOCATION_PROVIDER
android.permission.CONNECTIVITY_INTERNAL
+ android.permission.RECEIVE_DATA_ACTIVITY_CHANGE
android.permission.MANAGE_USB
android.permission.ACCESS_MTP
android.permission.MODIFY_PHONE_STATE
android.permission.READ_PRIVILEGED_PHONE_STATE
android.permission.WRITE_MEDIA_STORAGE
+ android.permission.MANAGE_USERS
android.permission.SET_TIME
android.permission.WRITE_GSERVICES
android.permission.RETRIEVE_WINDOW_CONTENT
android.permission.WRITE_APN_SETTINGS
android.permission.ALLOW_ANY_CODEC_FOR_PLAYBACK
android.permission.STATUS_BAR
android.permission.UPDATE_DEVICE_STATS
android.permission.SHUTDOWN
android.permission.STOP_APP_SWITCHES
android.permission.BIND_WALLPAPER
android.permission.INSTALL_PACKAGES
android.permission.DELETE_CACHE_FILES
android.permission.DELETE_PACKAGES
android.permission.MOVE_PACKAGE
android.permission.CHANGE_COMPONENT_ENABLED_STATE
android.permission.READ_FRAME_BUFFER
android.permission.REBOOT
android.permission.MASTER_CLEAR
android.permission.CALL_PRIVILEGED
android.permission.PERFORM_CDMA_PROVISIONING
android.permission.CONTROL_LOCATION_UPDATES
android.permission.ACCESS_CHECKIN_PROPERTIES
android.permission.PACKAGE_USAGE_STATS
android.permission.BACKUP
android.permission.BIND_REMOTEVIEWS
android.permission.BIND_APPWIDGET
+ android.permission.BIND_KEYGUARD_APPWIDGET
android.permission.MODIFY_APPWIDGET_BIND_PERMISSIONS
android.permission.GLOBAL_SEARCH
android.permission.SET_WALLPAPER_COMPONENT
android.permission.ACCESS_CACHE_FILESYSTEM
android.permission.CRYPT_KEEPER
android.permission.READ_NETWORK_USAGE_HISTORY
android.permission.MODIFY_NETWORK_ACCOUNTING
android.permission.PACKAGE_VERIFICATION_AGENT
+ android.permission.SERIAL_PORT

[system|signature]


[signature|system]と同じ

+ android.permission.CHANGE_CONFIGURATION
+ android.permission.MOUNT_UNMOUNT_FILESYSTEMS
+ android.permission.MOUNT_FORMAT_FILESYSTEMS

 [signature|system|development]


メーカー署名、システムアプリ、もしくは開発中に使用出来るもの

+ android.permission.INTERACT_ACROSS_USERS
+ android.permission.CHANGE_CONFIGURATION
android.permission.SET_ANIMATION_SCALE
android.permission.WRITE_SECURE_SETTINGS
android.permission.DUMP
android.permission.READ_LOGS
android.permission.SET_DEBUG_APP
android.permission.SET_PROCESS_LIMIT
android.permission.SET_ALWAYS_FINISH
+ android.permission.SIGNAL_PERSISTENT_PROCESSES

[signatureOrSystem]


[signature|system]と同じ

android.permission.UPDATE_LOCK

突っ込みどころ

CHANGE_CONFIGURATIONが[system|signature] と [signature|system|development] の両方に記載されている。どっちだ?

2012/10/01

Androidで共通鍵暗号化でつまづいたので記録に残す

Androidで文字列をセキュアに保存したい場合、
暗号化してsqliteに保存するのがよろしいと思われる。

ここではAndroid自体のセキュリティがアレだとか、Rooted端末とapktoolがあればアレをこうしてアレ出来るだとかいう話はとりあえず置いとく。

まず以下のようなソースを書いた。

内容は、

  • 共通鍵の秘密鍵を生成している箇所のみ抽出。
  • DBに鍵が保存されていない初回はif文を迂回して生成ロジックで生成後DBに保存。
  • DB保存後はDBから復元する。
private final static String ARGOLISM = "PBEWithSHA1And256BitAES-CBC-BC";

private SecretKey getSecretKey()
throws NoSuchAlgorithmException, InvalidKeySpecException, NameNotFoundException {

   // check saved secret key is exist.
   byte[] savedSecretKey = DBHelper.readByteData(context, "hoge");

   if(savedSecretKey != null && savedSecretKey.length > 0){
      return new SecretKeySpec(savedSecretKey, ARGOLISM);
   }

   // generate new secret key.
   char[] pw = generatePassword();
   int iteratorCount = 1024;
   int keySize = 256;
   int saltLength = 8;
   byte[] salt = "00000000".getBytes();

   KeySpec keySpec = new PBEKeySpec(pw, salt, iteratorCount, keySize);

   SecretKeyFactory factory = SecretKeyFactory.getInstance(ARGOLISM);
   SecretKey secretKey = factory.generateSecret(keySpec);

   // here

   // save secret key.
   DBHelper.writeByteData(context, "hoge", secretKey.getEncoded());

   return secretKey;
}
※DBHelperはsqliteへの簡便なアクセスを提供するクラスとする。
ここで使用しているDBHelperの先にあるテーブルはマップのようにkey/valueのデータ構造をしているものとする。

上記実行したところ、
生成後のDBから読み出した鍵が暗号化した鍵とは違うとのExceptionが発生。
secretKey.getEncoded()の値をDB書き込み前と後で見比べてみても同じ。
ワケワカラーン

結局、Exceptionの原因はクラス差でした。
生成前 : com.android.org.bouncycastle.jce.provider.JCEPBEKey
生成後 : javax.crypto.spec.SecretKeySpec

<guchi>
両方共 SecretKey を実装してるんだから、うまく動いてくれよ。
後、com.android.org.bouncycastle.jce.provider.JCEPBEKey の太字部位が出力されるのってバグじゃないの?
</guchi>

解決方法は
secretKey = new SecretKeySpec(secretKey.getEncoded(), ARGOLISM);
を先ほどのコードのDB書き込み直前(コードの //here の箇所)に追加して問題解決。

注意:saltの値は上記では簡易てますが、本当に使う場合はきちんとランダム値を生成するように変更してください。

2012/08/13

JBとICSのPermission比較(メーカー署名関係)

以前書いた、ICSとGingerbreadのPermission比較(メーカー署名関係)の続編。


注意:今回の記事は https://android.googlesource.com/platform/manifest/android-4.1.1_r4 を元に書いてます。

またしてもJBで色々と Permission 関係が変わっているのでまとめてみた。
まず プロテクションレベルの表記が変わっている。
以前は signatureOrSystem と書かれていた箇所が signature|system に変更。
また謎の development も追加(詳細がドキュメントされていないので後日調査予定)

まず ICS と JB のプロテクションレベルの一覧比較


ICS

  • dangerous
  • signatureOrSystem
  • normal
  • signature

JB

  • dangerous
  • signature|system
  • normal
  • signature
  • signature|system|development
  • signatureOrSystem

JB に signatureOrSystem が混じっているのは誤表記にあらず。
一個だけ何故か(恐らくミスだと思うけど) signatureOrSystem が混ざっている。

次それぞれのプロテクションレベル毎の比較
JB 方式の書き方だと今回はまとめにくいので、ICS方式で signature と signatureOrSystemでまとめてみる。

[signature]

赤字は追加分、新規追加のみ signatureOrSystem からの格上げなし
android.permission.ACCOUNT_MANAGER
android.permission.HARDWARE_TEST
android.permission.NET_ADMIN
android.permission.REMOTE_AUDIO_PLAYBACK
android.permission.GET_DETAILED_TASKS
android.permission.REMOVE_TASKS
android.permission.START_ANY_ACTIVITY
android.permission.SET_SCREEN_COMPATIBILITY
android.permission.FORCE_STOP_PACKAGES
android.permission.SET_PREFERRED_APPLICATIONS
android.permission.ASEC_ACCESS
android.permission.ASEC_CREATE
android.permission.ASEC_DESTROY
android.permission.ASEC_MOUNT_UNMOUNT
android.permission.ASEC_RENAME
android.permission.DIAGNOSTIC
android.permission.STATUS_BAR_SERVICE
android.permission.FORCE_BACK
android.permission.INTERNAL_SYSTEM_WINDOW
android.permission.MANAGE_APP_TOKENS
android.permission.INJECT_EVENTS
android.permission.SET_ACTIVITY_WATCHER
android.permission.READ_INPUT_STATE
android.permission.BIND_INPUT_METHOD
android.permission.BIND_ACCESSIBILITY_SERVICE
android.permission.BIND_TEXT_SERVICE
android.permission.BIND_VPN_SERVICE
android.permission.BIND_DEVICE_ADMIN
android.permission.SET_ORIENTATION
android.permission.SET_POINTER_SPEED
android.permission.SET_KEYBOARD_LAYOUT
android.permission.CLEAR_APP_USER_DATA
android.permission.GRANT_REVOKE_PERMISSIONS
android.permission.ACCESS_SURFACE_FLINGER
android.permission.BRICK
android.permission.DEVICE_POWER
android.permission.FACTORY_TEST
android.permission.BROADCAST_PACKAGE_REMOVED
android.permission.BROADCAST_SMS
android.permission.BROADCAST_WAP_PUSH
android.permission.CONFIRM_FULL_BACKUP
android.permission.CHANGE_BACKGROUND_DATA_SETTING
android.permission.GLOBAL_SEARCH_CONTROL
android.permission.COPY_PROTECTED_DATA
android.permission.MANAGE_NETWORK_POLICY
android.intent.category.MASTER_CLEAR.permission.C2D_MESSAGE
android.permission.BIND_PACKAGE_VERIFIER
android.permission.ACCESS_CONTENT_PROVIDERS_EXTERNALLY

[signatureOrSystem]

赤字新規追加、青字は削除。
ただし[signature|system|development]への移動だから除外というのは当てはまらないかも。
android.permission.SEND_SMS_NO_CONFIRMATION
android.permission.RECEIVE_EMERGENCY_BROADCAST
android.permission.INSTALL_LOCATION_PROVIDER
android.permission.CONNECTIVITY_INTERNAL
android.permission.MANAGE_USB
android.permission.ACCESS_MTP
android.permission.MODIFY_PHONE_STATE
android.permission.READ_PRIVILEGED_PHONE_STATE
android.permission.WRITE_MEDIA_STORAGE
android.permission.WRITE_SECURE_SETTINGS
android.permission.WRITE_GSERVICES
android.permission.DUMP
android.permission.RETRIEVE_WINDOW_CONTENT
android.permission.SET_TIME
android.permission.WRITE_APN_SETTINGS
android.permission.ALLOW_ANY_CODEC_FOR_PLAYBACK
android.permission.STATUS_BAR
android.permission.UPDATE_DEVICE_STATS
android.permission.SHUTDOWN
android.permission.STOP_APP_SWITCHES
android.permission.BIND_WALLPAPER
android.permission.INSTALL_PACKAGES
android.permission.DELETE_CACHE_FILES
android.permission.DELETE_PACKAGES
android.permission.MOVE_PACKAGE
android.permission.CHANGE_COMPONENT_ENABLED_STATE
android.permission.READ_FRAME_BUFFER
android.permission.REBOOT
android.permission.MASTER_CLEAR
android.permission.CALL_PRIVILEGED
android.permission.PERFORM_CDMA_PROVISIONING
android.permission.CONTROL_LOCATION_UPDATES
android.permission.ACCESS_CHECKIN_PROPERTIES
android.permission.PACKAGE_USAGE_STATS
android.permission.BACKUP
android.permission.BIND_REMOTEVIEWS
android.permission.BIND_APPWIDGET
android.permission.MODIFY_APPWIDGET_BIND_PERMISSIONS
android.permission.GLOBAL_SEARCH
android.permission.SET_WALLPAPER_COMPONENT
android.permission.ACCESS_CACHE_FILESYSTEM
android.permission.CRYPT_KEEPER
android.permission.READ_NETWORK_USAGE_HISTORY
android.permission.MODIFY_NETWORK_ACCOUNTING
android.permission.PACKAGE_VERIFICATION_AGENT
android.permission.WRITE_SECURE_SETTINGS
android.permission.DUMP

その他

今回新規追加のプロテクションレベル signature|system|development と 仲間はずれの signatureOrSystem

[signature|system|development]

青字の二つは signatureOrSystem からそれ以外は dangerous からの格上げ、これのおかげで開発補助系のアプリに影響が出まくる。
android.permission.SET_ANIMATION_SCALE
android.permission.WRITE_SECURE_SETTINGS
android.permission.DUMP
android.permission.READ_LOGS
android.permission.SET_DEBUG_APP
android.permission.SET_PROCESS_LIMIT
android.permission.SET_ALWAYS_FINISH

[signatureOrSystem]

一個だけぽつんとあるミスっぽいやつ。変換ミスかと思ったが以前は無かったものなのでその線は薄いか?内容的に Nexus 7 作った ASUS で足したものかもしれない。
android.permission.UPDATE_LOCK


今回は以上
情報追加次第、色々手出して調べてみます。

2011/11/28

ICSとGingerbreadのPermission比較(メーカー署名関係)

ICSのテストをしていると、前まで動いていたところでSecurityExceptionをはきました。
端末不具合かソースが変わったのかを調べる為に
公開されているICS(Android 4.0)とGingerbread(Android 2.3.3)のAndroidManifest.xmlを比較してみました。

AndroidではAndroid自体をビルドする時に使用されている署名(所謂メーカー所有の署名)とその他の署名の間に格差があり、特定のAPIを叩く際に必要となるpermissionの値が、"signatureOrSystem" もしくは"signature"となっている時は、実行する為にこのメーカー署名が必要となります。

それらAPIを叩くためには、メーカーに依頼して出来たAPKに署名を入れてもらうか、
rootを取る、もしくは自分でAndroidをビルドして実機に焼く等を行う必要があります。

それぞれ、frameworks/base/core/res/AndroidManifest.xml
を比較し、ICSで増えた箇所を赤字+太字で表示しました。
※ICSで減ったものはなかった。

[signatureOrSystem]
android.permission.SEND_SMS_NO_CONFIRMATION
android.permission.RECEIVE_EMERGENCY_BROADCAST
android.permission.INSTALL_LOCATION_PROVIDER
android.permission.CONNECTIVITY_INTERNAL
android.permission.MANAGE_USB
android.permission.ACCESS_MTP
android.permission.MODIFY_PHONE_STATE
android.permission.READ_PRIVILEGED_PHONE_STATE
android.permission.WRITE_MEDIA_STORAGE
android.permission.WRITE_SECURE_SETTINGS
android.permission.WRITE_GSERVICES
android.permission.DUMP
android.permission.RETRIEVE_WINDOW_CONTENT
android.permission.SET_TIME
android.permission.WRITE_APN_SETTINGS
android.permission.STATUS_BAR
android.permission.UPDATE_DEVICE_STATS
android.permission.SHUTDOWN
android.permission.STOP_APP_SWITCHES
android.permission.BIND_WALLPAPER
android.permission.INSTALL_PACKAGES
android.permission.DELETE_CACHE_FILES
android.permission.DELETE_PACKAGES
android.permission.MOVE_PACKAGE
android.permission.CHANGE_COMPONENT_ENABLED_STATE
android.permission.READ_FRAME_BUFFER
android.permission.REBOOT
android.permission.MASTER_CLEAR
android.permission.CALL_PRIVILEGED
android.permission.PERFORM_CDMA_PROVISIONING
android.permission.CONTROL_LOCATION_UPDATES
android.permission.ACCESS_CHECKIN_PROPERTIES
android.permission.PACKAGE_USAGE_STATS
android.permission.BACKUP
android.permission.BIND_REMOTEVIEWS
android.permission.BIND_APPWIDGET
android.permission.GLOBAL_SEARCH
android.permission.SET_WALLPAPER_COMPONENT
android.permission.ACCESS_CACHE_FILESYSTEM
android.permission.CRYPT_KEEPER
android.permission.READ_NETWORK_USAGE_HISTORY
android.permission.MODIFY_NETWORK_ACCOUNTING
android.permission.PACKAGE_VERIFICATION_AGENT

[signature]
android.permission.ACCOUNT_MANAGER
android.permission.HARDWARE_TEST
android.permission.NET_ADMIN
android.permission.REMOVE_TASKS
android.permission.FORCE_STOP_PACKAGES
android.permission.SET_PREFERRED_APPLICATIONS
android.permission.ASEC_ACCESS
android.permission.ASEC_CREATE
android.permission.ASEC_DESTROY
android.permission.ASEC_MOUNT_UNMOUNT
android.permission.ASEC_RENAME
android.permission.DIAGNOSTIC
android.permission.STATUS_BAR_SERVICE
android.permission.FORCE_BACK
android.permission.INTERNAL_SYSTEM_WINDOW
android.permission.MANAGE_APP_TOKENS
android.permission.INJECT_EVENTS
android.permission.SET_ACTIVITY_WATCHER
android.permission.READ_INPUT_STATE
android.permission.BIND_INPUT_METHOD
android.permission.BIND_TEXT_SERVICE
android.permission.BIND_VPN_SERVICE
android.permission.BIND_DEVICE_ADMIN
android.permission.SET_ORIENTATION
android.permission.SET_POINTER_SPEED
android.permission.CLEAR_APP_USER_DATA
android.permission.ACCESS_SURFACE_FLINGER
android.permission.BRICK
android.permission.DEVICE_POWER
android.permission.FACTORY_TEST
android.permission.BROADCAST_PACKAGE_REMOVED
android.permission.BROADCAST_SMS
android.permission.BROADCAST_WAP_PUSH
android.permission.CONFIRM_FULL_BACKUP
android.permission.CHANGE_BACKGROUND_DATA_SETTING
android.permission.GLOBAL_SEARCH_CONTROL
android.permission.COPY_PROTECTED_DATA
android.permission.MANAGE_NETWORK_POLICY
android.intent.category.MASTER_CLEAR.permission.C2D_MESSAGE
android.permission.BIND_PACKAGE_VERIFIER