106
TS-6 まだ間に合う!Androidの最新機能 を使ったアプリ開発 Android2.3のシェアが20%を切った今、ターゲ ットバージョンを切り替えるチャンス!~ AVCマルチメディアソフト株式会社 浜田 怜実 株式会社システナ 祥太郎 AVCマルチメディアソフト株式会社 小林 慎治 AVCマルチメディアソフト株式会社 木村 尭海

Etwest2014 ts 6

Embed Size (px)

DESCRIPTION

ETWest 2014 7/30 テクニカルセッションの資料です。 まだ間に合う!Androidの最新機能を使ったアプリ開発 ~Android2.3のシェアが20%を切った今、ターゲットバージョンを切り替えるチャンス!~

Citation preview

Page 1: Etwest2014 ts 6

TS-# TS-6

まだ間に合う!Androidの 新機能を使ったアプリ開発

~Android2.3のシェアが20%を切った今、ターゲ

ットバージョンを切り替えるチャンス!~

AVCマルチメディアソフト株式会社 浜田 怜実 株式会社システナ 森 祥太郎

AVCマルチメディアソフト株式会社 小林 慎治 AVCマルチメディアソフト株式会社 木村 尭海

Page 2: Etwest2014 ts 6

TS-# TS-6 2

目次

1.  Androidの 新動向 AVCマルチメディアソフト株式会社 浜田 怜実  

2.  AndroidアプリにGoogleAnalyticsを 導入しよう 株式会社システナ 森 祥太郎  

3.  AndroidのBLE対応手法 AVCマルチメディアソフト株式会社 小林 慎治  

4.  これからのセキュリティ AVCマルチメディアソフト株式会社 木村 尭海

Page 3: Etwest2014 ts 6

TS-# TS-6

1.Androidの 新動向

AVCマルチメディアソフト株式会社 浜田 怜実

Page 4: Etwest2014 ts 6

TS-# TS-6

自己紹介

•  浜田 怜実(はまだ としみ)

•  所属

– AVCマルチメディアソフト株式会社

•  担当業務 •  Android端末のドライバ、OS開発

•  プリインストール用アプリケーション開発

•  特定用途向け技術研究・開発

•  個人的な活動 •  AndroidのカスタムROM開発 •  Firefox OSの世界初の技術系同人誌執筆(共著)

Page 5: Etwest2014 ts 6

TS-# TS-6

目次

•  現在のAndroid Version分布

•  Androidの変遷

•  Androidを取り巻くデバイス –  iBeacon / BLE – Google Glass – Android Wear – Android Auto

Page 6: Etwest2014 ts 6

TS-# TS-6

Version 分布

6

約14%

https://developer.android.com/about/dashboards/index.html

Page 7: Etwest2014 ts 6

TS-# TS-6

Androidの変遷

10/22 4/30 9/15 10/26 1/5 5/20 12/6 2/22

10/19 6/27 11/13 7/24 10/31 2014秋

2010 2009

2012 2013

2011 2008

2011 2014

L

Page 8: Etwest2014 ts 6

TS-# TS-6 8

過去の遺物は捨て去って、 もっと大きな世界に打って出ませんか?

Page 9: Etwest2014 ts 6

TS-# TS-6

iBeacon / BLE

•  iBeacon – AppleがBLEを拡張して開発した、近接する端末

に対して情報をプッシュできるデバイス

•  BLE(Bluetooth Low Energy) – Bluetooth 4.0で追加された超低消費電力規格

•  低電力通信に特化した仕様 •  通信速度は非常に遅い •  フィットネス、医療機器、

腕時計などでの利用を想定

9

Page 10: Etwest2014 ts 6

TS-# TS-6

Google Glass

•  2012年4月発表 •  メガネ型ウェアラブル

コンピュータ

•  Androidベースだが、AndroidアプリケーションではなくGlasswareと呼ばれる専用のWebアプリケーションを使用する

•  GoogleI/O 2014でAndroid Wear対応を発表

10

Page 11: Etwest2014 ts 6

TS-# TS-6

Android Wear

•  2014年3月発表

•  ウェアラブル端末専用のAndroid platform •  端末形状は時計に限らない

– Google GlassがAndroid Wearに対応 •  Androidスマートフォンと連携して使う

11

Page 12: Etwest2014 ts 6

TS-# TS-6

Android Wear

12

Page 13: Etwest2014 ts 6

TS-# TS-6

既存アプリのAndroid Wear対応:通知

13

Notification notif = new Notification.Builder(mContext) .setContentTitle("New mail from " + sender.toString()) .setContentText(subject) .setSmallIcon(R.drawable.new_mail) .extend(new Notification.WearableExtender() .setContentIcon(R.drawable.new_mail)) .build(); NotificationManager notificationManger = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManger.notify(0, notif);

④通知の発行

①WearableExtender    インスタンスの生成

②WearableExtender    に内容を設定する

③WearableExtender    をnotificationにセット

Page 14: Etwest2014 ts 6

TS-# TS-6

既存アプリのAndroid Wear対応:通知

•  WearableExtenderで設定できる主な項目 – 背景       :setBackground() – アイコン     :setContentIcon() – ページの追加  :addPage() / addPages() – アクション    :addAction() / addActions()

•  通知はAndroid Auto / Android TVでも同じ手法で対応可能(!)

14

※ android.app.Notification.WearableExtender

Page 15: Etwest2014 ts 6

TS-# TS-6

Android Auto

•  2014年6月発表(in Google I/O 2014) •  Android端末を車に接続し、端末の機能を車

側から操作・利用できるようにするシステム

15

Page 16: Etwest2014 ts 6

TS-# TS-6

まとめ

•  Androidと繋がるデバイスが作る世界は拡大される方向にある – ウェアラブルに限らない

•  手の中の端末とインターネットの世界の時代から、より大きな外の世界と繋がる時代へ – OSが新しいほど世界は大きい

16

Page 17: Etwest2014 ts 6

TS-# TS-6 17

2.AndroidアプリにGoogleAnalyticsを 導入しよう

株式会社システナ 森 祥太郎

Page 18: Etwest2014 ts 6

TS-# TS-6

自己紹介

•  森 祥太郎(もり しょうたろう) •  所属

– 株式会社システナ •  業務経歴

– Androidアプリケーション開発 – Androidデバイス開発

18

Page 19: Etwest2014 ts 6

TS-# TS-6

目次

•  GoogleAnalyticsとは

•  なぜGoogleAnalyticsなのか

•  アプリへの導入方法 •  注意点 •  まとめ

Page 20: Etwest2014 ts 6

TS-# TS-6

GoogleAnalyticsとは

•  以下のようなことを収集できる

– アクティブユーザー数

– 世界中のどこで使用されているか

– 導入や特定の機能の使われ方

– アプリのクラッシュや例外発生

– アプリ内課金および、取引

Page 21: Etwest2014 ts 6

TS-# TS-6

GoogleAnalyticsを使う理由

•  無料ではじめられる

•  DeveloperConsoleとの連携が容易

•  Google Play Servicesに統合されている

Page 22: Etwest2014 ts 6

TS-# TS-6

Google Play Services

Page 23: Etwest2014 ts 6

TS-# TS-6

アプリへの導入方法

•  導入

•  画面遷移のトラッキング

•  イベントのトラッキング

•  クラッシュと例外のトラッキング

Page 24: Etwest2014 ts 6

TS-# TS-6

アプリへの導入方法

•  AndroidManifest.xmlの修正

– パーミッションの付与     <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

Page 25: Etwest2014 ts 6

TS-# TS-6

アプリへの導入方法

•  Trackerの生成(Applicationクラス) private Tracker mTracker; private static final String TRACKING_ID = "UA-XXXXXXX-Y"; @Override protected void onCreate() { super.onCreate(); // Trackerの生成と初期化     GoogleAnalytics analytics = GoogleAnalytics.getInstance(this); mTracker = analytics.newTracker(TRACKING_ID); } public Tracker getTracker() { return mTracker; }

Page 26: Etwest2014 ts 6

TS-# TS-6

画面遷移のトラッキング

•  Activityの場合(APILevel14以上)

– Applicationクラス

@Override protected void onCreate() { super.onCreate(); // Trackerの生成と初期化 GoogleAnalytics analytics = GoogleAnalytics.getInstance(this); mTracker = analytics.newTracker(TRACKING_ID); // 画面遷移の自動トラッキング有効化 analytics.enableAutoActivityReports(this); mTracker.enableAutoActivityTracking(true); }

Page 27: Etwest2014 ts 6

TS-# TS-6

画面遷移のトラッキング

•  Activityの場合(APILevel13以下)

– Activityクラス

@Override public void onStart(){ super.onStart(); mAnalytics.reportActivityStart(this); } @Override public void onStop() { super.onStop(); mAnalytics.reportActivityStop(this); }

Page 28: Etwest2014 ts 6

TS-# TS-6

画面遷移のトラッキング

•  Fragmentの場合

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Trackerの取得 Tracker t = mApplication.getTracker(); // スクリーン名の設定 t.setScreenName(Fragment.class.getName()); // 送信 t.send(new HitBuilders.AppViewBuilder().build()); }

Page 29: Etwest2014 ts 6

TS-# TS-6

画面遷移のトラッキング

スクリーンビュー画像

Page 30: Etwest2014 ts 6

TS-# TS-6

画面遷移のトラッキング

ユーザー行動フロー画像

Page 31: Etwest2014 ts 6

TS-# TS-6

イベントのトラッキング

•  EventとしてTrackingできる内容

– Category •  文字列

– Action •  文字列

– Label •  文字列

– Value •  long型の値

Page 32: Etwest2014 ts 6

TS-# TS-6

イベントのトラッキング

•  実装例

– Menuクリックの場合 Public Map generat(MenuItem item) { Map event = null; switch (item.getItemId()) { case R.id.menu_scan:      event = generateEvent("scan", "start", "menu"); break; case R.id.menu_stop:      event = generateEvent("scan", "stop", "menu"); break; } if (event != null) { mTracker.send(event); } return true; }

Page 33: Etwest2014 ts 6

TS-# TS-6

イベントのトラッキング

•  イベント生成部分

public Map generateEvent(String category, String action, String label) { HitBuilders.EventBuilder builder = new HitBuilders.EventBuilder(); builder.setCategory(category); builder.setAction(action); builder.setLabel(label); return builder.build(); }

Page 34: Etwest2014 ts 6

TS-# TS-6

イベントのトラッキング

画像カテゴリリスト

Page 35: Etwest2014 ts 6

TS-# TS-6

イベントのトラッキング

画像アクションリスト

Page 36: Etwest2014 ts 6

TS-# TS-6

クラッシュのトラッキング

•  クラッシュのトラッキング

@Override public void onCreate() { super.onCreate();

(略)        UncaughtExceptionHandler myHandler = new ExceptionReporter( mTracker,//Tracker Thread.getDefaultUncaughtExceptionHandler(),// default Handler this// app context ); Thread.setDefaultUncaughtExceptionHandler(myHandler); }

Page 37: Etwest2014 ts 6

TS-# TS-6

例外のトラッキング

•  例外のトラッキング

– 例外としてトラッキングできる値

•  Description – 文字列

例外クラス名(@クラス名:メソッド名:行数){スレッド名} •  Fatal

– 真偽値

Page 38: Etwest2014 ts 6

TS-# TS-6

例外のトラッキング

•  実装例

private int convertStringToInt(String num) { int ret = 0;// 初期値 try { ret = Integer.parseInt(num); } catch (NumberFormatException e) { ExceptionBuilder builder = new ExceptionBuilder(); builder.setFatal(false); StandardExceptionParser parser = new StandardExceptionParser(this, null); String description = parser.getDescription(Thread.currentThread() .getName(), e); builder.setDescription(description); mTracker.send(builder.build()); } return ret; }

Page 39: Etwest2014 ts 6

TS-# TS-6

クラッシュと例外のトラッキング

Page 40: Etwest2014 ts 6

TS-# TS-6

XMLファイルでの設定

•  Trackerの設定

–  res/xml/tracker.xml

<resources> <!-- トラッキングID --> <string name=“ga_trackingId” >UA-********-2</string> <!-- Activityの自動トラッキング有効化 --> <bool name="ga_autoActivityTracking" >true</bool> </resources>

Page 41: Etwest2014 ts 6

TS-# TS-6

XMLファイルでの設定

•  Activityの自動トラッキング

– XMLの設定を読み込む

@Override protected void onCreate() { super.onCreate(); // Trackerの生成と初期化      GoogleAnalytics analytics = GoogleAnalytics.getInstance(this); mTracker = analytics.newTracker(R.xml.tracker); }

Page 42: Etwest2014 ts 6

TS-# TS-6

XMLファイルでの設定

•  Analyticsの設定

–  res/values/analytics.xml

<resources> <!-- Activityの自動トラッキング有効化 --> <bool name="ga_autoActivityTracking" >true</bool> <!-- Activityの自動トラッキング有効化 --> <bool name="ga_reportUncaughtExceptions">true</bool> </resources>

Page 43: Etwest2014 ts 6

TS-# TS-6

注意点など

•  収集データの送信タイミング

•  収集機能のオン/オフ

•  導入のコスト

Page 44: Etwest2014 ts 6

TS-# TS-6

収集データの送信タイミング

•  デフォルトでは30分毎に送信

– GoogleAnalytics#setDispatchLocalPeriod()

•  手動での送信

– GoogleAnalytics#dispatchLocalHits()

Page 45: Etwest2014 ts 6

TS-# TS-6

収集機能のオン/オフ

•  データを収集することを、ユーザに通知する必要がある

– 収集機能をオフに出来る機能を提供する

– 同意が得られない場合アプリを終了する

Page 46: Etwest2014 ts 6

TS-# TS-6

導入コスト

•  完成後のアプリケーションへの導入

– コスト大

Page 47: Etwest2014 ts 6

TS-# TS-6

まとめ

•  開発ドキュメントをよく読む(特にV3) •  プライバシーに配慮する •  導入を考えて居るなら開発初期から設計に

盛り込む

Page 48: Etwest2014 ts 6

TS-# TS-6 48

3.AndroidのBLE対応手法

AVCマルチメディアソフト株式会社

エンジニア  小林 慎治

Page 49: Etwest2014 ts 6

TS-# TS-6

自己紹介

•  小林 慎治(こばやし しんじ) –  Twitter:@kobashinG

•  所属 –  AVCマルチメディアソフト株式会社

•  業務経歴 –  Androidデバイス開発 –  Androidアプリケーション開発

•  執筆 –  プロの力が身につくAndroidプログラミングの教科書 –  Androidタブレットアプリ開発ガイド など

49

Page 50: Etwest2014 ts 6

TS-# TS-6

目次

•  BLEとは? •  AndroidにおけるBLE対応

50

Page 51: Etwest2014 ts 6

TS-# TS-6

BLEとは?

51

Page 52: Etwest2014 ts 6

TS-# TS-6

BLEの特徴

•  Bluetooth3.0までと4.0の違い – Bluetooth 3.0まで

•  240Mbps •  ペアリング必要

– Bluetooth 4.0 •  1Mbps(パケット長 47octet) •  Classicとの互換性無 •  低電力(ボタン電池で駆動可) •  ペアリング必要無し

52

Page 53: Etwest2014 ts 6

TS-# TS-6

BLEの通信手法

53

Peripheral Central

Scan

1. Scan & Discover 2. Connect

3. Scan Service(Profile) 4. Read / Write / Notify

Peripheral Central

Peripheral

Find Me Profile

Proximty Profile

Peripheral Central

Profile

Service R / W

Notify

Advertise

Page 54: Etwest2014 ts 6

TS-# TS-6

BLEの通信手法

54

Peripheral Central

Scan

1. Scan & Discover 2. Connect

3. Scan Service(Profile) 4. Read / Write / Notify

Peripheral Central

Peripheral

Find Me Profile

Proximty Profile

Peripheral Central

Profile

Service R / W

Notify

Advertise

- Peripheral - Advertise Packet - 一定間隔で発信 - Central - Scan - Advを検出

Page 55: Etwest2014 ts 6

TS-# TS-6

BLEの通信手法

55

Peripheral Central

Scan

1. Scan & Discover 2. Connect

3. Scan Service(Profile) 4. Read / Write / Notify

Peripheral Central

Peripheral

Find Me Profile

Proximty Profile

Peripheral Central

Profile

Service R / W

Notify

Advertise

- Central - 検出したPeripheralへ 接続

Page 56: Etwest2014 ts 6

TS-# TS-6

BLEの通信手法

56

Peripheral Central

Scan

1. Scan & Discover 2. Connect

3. Scan Service(Profile) 4. Read / Write / Notify

Peripheral Central

Peripheral

Find Me Profile

Proximty Profile

Peripheral Central

Profile

Service R / W

Notify

Advertise - Central - (P)のServiceを検索

- Peripheral - Notify(Charcteristicの 変化通知) - Central - Read / Write

Page 57: Etwest2014 ts 6

TS-# TS-6

BLEの通信手法

57

Peripheral

Proximty Profile

Immediate Alert

Link Loss

Tx Power

Generic Access

Battery Service

Services Characteristics

Device Name

Appearance

Peripheral Privacy Flag

Reconnection Address

Page 58: Etwest2014 ts 6

TS-# TS-6

Service & Profile

•  Profile / Service / Characteristicの定義 –  https://developer.bluetooth.org/gatt/Pages/default.aspx

58

Page 59: Etwest2014 ts 6

TS-# TS-6

AndroidにおけるBLE対応

59

Page 60: Etwest2014 ts 6

TS-# TS-6

BLE対応

•  対応バージョン – Android 4.3からCentralに対応

Android 4.4.2以降を推奨 – Peripheralには非対応(Android L以降で対応)

•  対応デバイス(例) – Nexus 4 – Nexus 5 – Nexus 7(2013) – Etc…

60

Page 61: Etwest2014 ts 6

TS-# TS-6

iBeaconとは何か

•  iBeacon – BLEのAdv Packetを使った機能 – RSSI(電波強度)をAdv Packetに含め、機器から

のおおよその距離を判別

•  AndroidでiBeaconの利点 –  iOSと共用のハードウェアが利用可 – Android / iOS間の通信

•  簡単なメッセージのやりとりに利用できる

61

Page 62: Etwest2014 ts 6

TS-# TS-6

iBeaconとは何か

•  AndroidでiBeacon? – もちろん対応可能

•  距離判断の仕組みをアプリで持つ必要有り

– Estimote SDKが利用可 •  https://github.com/Estimote/Android-SDK •  iOSのインターフェースを真似ており、

プロトタイプなどの短期開発に向いている •  距離判断の仕組みを含む

62

Page 63: Etwest2014 ts 6

TS-# TS-6

iBeaconとは何か

•  AndroidでiBeaconの注意点 –  iBeaconでできることをキチンと伝える

•  細かな距離の取得はできない

– AndroidとiOSはできることが異なる •  AndroidはPeripheralになれない •  iOSはPacketスニファにはなれない

–  iOSに合わせたAndroidの距離判別アルゴリズム •  同位置でデバイス毎に取得できるRSSIが異なることも

– アプリのみで解決しようとしない •  デバイス側を工夫することでできることもある

63

Page 64: Etwest2014 ts 6

TS-# TS-6

BLEを使う

•  AndroidでBLEを使う一連の流れ 1.  BLE setup 2.  機器検索 3.  Peripheral接続 4.  Characteristic読み書き 5.  BLE close

64

Page 65: Etwest2014 ts 6

TS-# TS-6

BLE setup

•  必要なPermission

•  BLEが利用できるデバイスか確認

65

android:name="android.permission.BLUETOOTH”!android:name="android.permission.BLUETOOTH_ADMIN”

if (!getPackageManager().hasSystemFeature(! PackageManager.FEATURE_BLUETOOTH_LE)) {!! //  BLE非対応時の処理!    finish();!}

Page 66: Etwest2014 ts 6

TS-# TS-6

機器検索

•  スキャン開始:BluetoothAdapter#startLEScan() •  スキャン終了:BluetoothAdapter#stopLEScan()

66

@Override  public  void  handleMessage(Message  msg)  {          switch  (msg.what){          case  SERVICE_ACTION_BLE_SCAN:                  sendEmptyMessageDelayed(                                  SERVICE_ACTION_BLE_STOP_SCAN,  10000);                  mBtAdapter.startLeScan(mLeCallback);                  break;            case  SERVICE_ACTION_BLE_STOP_SCAN:                  mBtAdapter.stopLeScan(mLeCallback);                  break;          }  }  

Page 67: Etwest2014 ts 6

TS-# TS-6

機器検索

•  結果は登録したCallbackで取得

67

BluetoothAdapter.LeScanCallback  mLeCallback    =  new  BluetoothAdapter.LeScanCallback()  {          @Override          public  void  onLeScan(BluetoothDevice  bluetoothDevice,                            int  i,  byte[]  bytes)  {                  //  任意の処理          }  };

Callback内で重たい処理を行うと呼び出し頻度が下がる   ログのみ 6.4回/1秒 1000ms wait 1回/1秒

Page 68: Etwest2014 ts 6

TS-# TS-6

機器検索

•  onLeScanの呼び出され方が異なる – Nexus7, Nexus4 – 

– Nexus5, XperiaZ

–  Issue

•  https://code.google.com/p/android/issues/detail?id=65863

68

AdvPacketは以下の場合に取得   ・ 新しいデバイスを発見したとき   ・ 接続できないデバイス(non-connectable)

AdvPacketは以下の場合に取得   ・ 常時取得可

Page 69: Etwest2014 ts 6

TS-# TS-6

機器検索

•  注意点まとめ – スキャン時はバッテリー消費高

– スキャン間隔はCallback内処理時間に依存

– スキャンはClassicBTと競合する

69

必要に応じてスキャン実施。常時スキャンは避ける Handler等を使ったタイマー処理stopを推奨

Callback内処理負荷を下げれば、間隔を短くできる

スキャン以外は競合しないが、スキャンはNG

Page 70: Etwest2014 ts 6

TS-# TS-6

Peripheral接続

•  BLEの接続状態

70

切断状態 接続状態 検索完了状態

接続要求: connectGatt()

検索要求: discoverService()

BluetoothGatt経由でRead/Writeが可能に。

Page 71: Etwest2014 ts 6

TS-# TS-6

Peripheral接続

•  接続要求:BluetoothDevice#connectGatt()

–  接続結果は第三引数に設定したCallback(onConnectionStateChange)で受ける

–  取得したBluetoothGattインスタンスで、接続後R/W可能

71

mBluetoothGatt  =  bluetoothDevice.connectGatt(                  getApplicationContext(),  false,  mGattCallback);

Page 72: Etwest2014 ts 6

TS-# TS-6

Peripheral接続

•  Service検索: BluetoothGatt#discoverService() –  検索結果は同Callback(onServicesDiscovered)で受ける

72

BluetoothGattCallback  mGattCallback                    =  new  BluetoothGattCallback()  {                    @Override                  public  void  onConnectionStateChange(                                  BluetoothGatt  gatt,  int  status,  int  newState)  {                              switch  (newState){                                  case  BluetoothProfile.STATE_CONNECTED:                                              //  Service検索                                        gatt.discoverServices();                                          break;                          }                  }

Page 73: Etwest2014 ts 6

TS-# TS-6

Peripheral接続

•  検索完了状態: BluetoothGattCallback.onServicesDiscovered()  –  Service  /  Characteristicの検索完了時に呼ばれる

73

@Override  public  void  onServicesDiscovered(BluetoothGatt  gatt,  int  status)  {          switch  (status)  {                  case  BluetoothGatt.GATT_SUCCESS:  {  //  0x00                          //  Enable  Reading  or  Writing                              break;                  }                  case  BluetoothGatt.GATT_FAILURE:  {  //  0x101                                          break;                  }          }  }    

Page 74: Etwest2014 ts 6

TS-# TS-6

Peripheral接続

•  検索完了状態: BluetoothGattCallback.onServicesDiscovered()  –  Service  /  Characteristicの検索完了時に呼ばれる  –  呼び出し時に以下ログが出力される

74

$ adb logcat BluetoothGatt:* BluetoothAdapter:* *:S

Page 75: Etwest2014 ts 6

TS-# TS-6

Characteristic読み書き

•  BluetoothGatt経由で CharacteristicsやDescriptorを取得できる

75

 static  final  String  UUID_SERVICE_GENERIC_ACCESS                  =  "00001800-­‐0000-­‐1000-­‐8000-­‐00805f9b34fb";    static  final  String  UUID_CHAR_DEVICE_NAME                =  "00002a00-­‐0000-­‐1000-­‐8000-­‐00805f9b34fb";        BluetoothGattService  service  =                      mBluetoothGatt.getService(                                    UUID.fromString(UUID_SERVICE_GENERIC_ACCESS));    if(service  !=  null){            BluetoothGattCharacteristic  charcteristic  =            service.getCharacteristic(                            UUID.fromString(UUID_CHAR_DEVICE_NAME));            mBluetoothGatt.readCharacteristic(charcteristic);    }

Page 76: Etwest2014 ts 6

TS-# TS-6

Characteristic読み書き

• Service検索と同じくCallback(onCharacteristicRead)で受信  

76

@Override    public  void  onCharacteristicRead(BluetoothGatt  gatt,                    BluetoothGattCharacteristic  characteristic,  int  status)  {              if(characteristic  !=  null)  {                    try  {                            Log.i(“xxx",  "get  device  name  :  "                                    +  new  String(characteristic.getValue(),  "UTF-­‐8"));                    }  catch  (UnsupportedEncodingException  e)  {                            e.printStackTrace();                    }            }  }

Page 77: Etwest2014 ts 6

TS-# TS-6

Characteristic読み書き

• Read/Writeでfalseになる?  – もう一度接続(connect~discover)を行い  

状態を確認すると良い  

77

BluetoothGatt# discoverService()

接続確認

切断状態 初めからやり直し。

接続異常状態 初めからやり直しがベター。

接続OK

true

false

false

true

BluetoothGatt# connect()

Page 78: Etwest2014 ts 6

TS-# TS-6

BLE close

•  Close処理 – 忘れるとスキャン不可、不安定動作などの要因に

78

public void close() {!    if (mBluetoothGatt == null) {!        return;!    }!    mBluetoothGatt.close();!    mBluetoothGatt = null;!}

Page 79: Etwest2014 ts 6

TS-# TS-6

まとめ

79

•  Android 4.4.2以前は機種差が大きい – 端末毎に動作が異なることも – 不安定な端末はサポートから外す等の対応を

•  iBeaconをiOS/Androidで両対応する –  iOSと出来ることが異なる点に注意

•  Callbackベースでの実装に注意する – 読み書きはCallback経由で取得する必要あり

Page 80: Etwest2014 ts 6

TS-# TS-6

4. これからのセキュリティ

AVCマルチメディアソフト株式会社 木村 尭海

80

Page 81: Etwest2014 ts 6

TS-# TS-6

自己紹介

•  木村 尭海(きむら たかうみ) –  Twitter:@muchiki0226

•  所属 –  AVCマルチメディアソフト株式会社

•  業務経歴 –  家電連携Androidアプリケーション開発 –  Androidメディアフレームワーク開発 –  Androidデバイス開発

•  執筆 –  プロの力が身につくAndroidプログラミングの教科書 –  Effective Android

81

Page 82: Etwest2014 ts 6

TS-# TS-6

目次

•  近のセキュリティトラブル

•  Androidのセキュリティとは

•  これからのセキュリティ – SELinux – Hardware Credential Storage – KeyStore

82

Page 83: Etwest2014 ts 6

TS-# TS-6

近のセキュリティトラブル

•  OpenSSL HeartBleedの脆弱性 –  Android 4.1.1からAndroid4.2.2(一部)がこの脆弱性を抱える

•  秘密鍵/証明書が盗まれる –  通信内容が覗き放題

83

サーバ Android

個人情報

偽造サーバ

Page 84: Etwest2014 ts 6

TS-# TS-6

Androidセキュリティ

•  Androidアプリのセキュリティによるトラブルが減少 –  2012年の半分ぐらいに減少

•  減少しているが複雑な障害が発生しているケースが多数 –  アプリ –  カーネル –  フレームワーク –  アプリのプラグイン –  etc

84

0

20

40

60

80

100

120

2010 2011 2012 2013

5

21

118

59 障害件数

JVNデータ(2014/5月調べ)

Page 85: Etwest2014 ts 6

TS-# TS-6

Androidセキュリティ

•  トラブル減少している主な要因

– アプリ開発者 •  セキュリティに対する知識を持った人が増えてきている •  開発手法でのトラブルについてWebに多数掲載 •  ノウハウの蓄積 •  アプリが洗練されてきている

– Google •  OSにセキュリティに対する実装が増えいる

– パーミッション機能の追加など

85

Page 86: Etwest2014 ts 6

TS-# TS-6

セキュリティは新しい課題に直面している

•  特定のトラブルが増大 –  ファイルアクセス関連:19件/59件 –  鍵関連:5件/59件

•  Androidセキュリティはどこまで確保するのか –  個人情報 –  端末のroot –  アプリ情報

•  セキュリティは考え始めるといくらでも時間がかかる –  端末の機能を知っていると効率的に保証が出来る

86

保証されている部分を活用したアプリ開発を行う必要がある

Page 87: Etwest2014 ts 6

TS-# TS-6

これからのセキュリティ

87

新しい機能を知らないと無駄な実装が増える

どこまでセキュリティ 対策したらいいの?

ファイルアクセスは どうせ防げないので 対策は何もしないでおこう

Androidはセキュリティに 問題があるので端末に 鍵は置けないな

Page 88: Etwest2014 ts 6

TS-# TS-6

セキュリティ機能

•  セキュリティの機能がクローズアップ –  Android4.3 –  Android4.4

•  追加されたセキュリティ機能

–  Hardware Credential Storage •  ハードウェア的に安全な領域に鍵などを保存可能

–  TrustZoneなど

–  KeyStore •  アプリ用に暗号化鍵の生成/保存の機能が提供

–  SELinux •  2000年から続くLinuxカーネルのモジュール

88

Page 89: Etwest2014 ts 6

TS-# TS-6

Hardware Credential Storage

89

Page 90: Etwest2014 ts 6

TS-# TS-6

Hardware Credential Storageとは

•  証明書を安全な領域に保存する機能 –  Hardware的に保証されている領域に保存される

•  TrustZone –  Linuxカーネル上からのアクセス不可 –  エクスポートはできない →安心して鍵を保存することができる  ※ただしハードウェアが対応していることが条件

•  KeyChainを拡張して実現されている –  デジタル証明書や秘密鍵を登録/管理するAPI

•  Android 4.0で追加された機能を拡張している

90

Page 91: Etwest2014 ts 6

TS-# TS-6

確認方法

•  ハードウェアが対応しているか確認 –  デバイス情報を確認する

•  [設定]>[セキュリティ]>[ストレージのタイプ]

–  ソースコード上で確認する

91

// 暗号化方式はRSA、DSA、ECを使うことが可能 if (KeyChain.isBoundKeyAlgorithm("RSA")) { // ハードウェア的に対応されている時の処理をここに書く } else { // ハードウェア的に対応されていない時の処理をここに書く }

Page 92: Etwest2014 ts 6

TS-# TS-6

KeyStore

92

Page 93: Etwest2014 ts 6

TS-# TS-6

KeyStoreとは

•  秘密鍵/証明書を管理する機能 –  他のアプリがアクセス出来ない場所で保管する –  Android 4.0で追加された機能

•  ただし全アプリで共用化される

•  Android 4.3で機能拡張 –  アプリごとに秘密鍵/証明書を管理が可能

93

Page 94: Etwest2014 ts 6

TS-# TS-6

KeyStoreの使い方

•  秘密鍵/証明書の作成

94

Context ctx = this; Calendar notBefore = Calendar.getInstance(); Calendar notAfter = Calendar.getInstance(); notAfter.add(1, Calendar.YEAR); KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(ctx).setAlias("key1") .setSubject(new X500Principal(String.format("CN=%s, OU=%s", "test”,ctx.getPackageName()))) .setSerialNumber(BigInteger.ONE).setStartDate(notBefore.getTime()).setEndDate(notAfter.getTime()) .build(); KeyPairGenerator kpGenerator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore"); kpGenerator.initialize(spec); KeyPair kp = kpGenerator.generateKeyPair();

アプリA アプリB

10075_ USRCERT _key1

10075_ USRPKEY _key1

生成

生成

Page 95: Etwest2014 ts 6

TS-# TS-6

KeyStoreの使い方

•  秘密鍵/公開鍵の取得

95

KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); keyStore.load(null); // 別アプリからアクセスされるとnullが返される KeyStore.PrivateKeyEntry keyEntry = (KeyStore.PrivateKeyEntry)keyStore.getEntry("key1", null); // 公開鍵 RSAPublicKey pubKey = (RSAPublicKey)keyEntry.getCertificate().getPublicKey(); // 秘密鍵 RSAPrivateKey privKey = (RSAPrivateKey) keyEntry.getPrivateKey();

アプリA アプリB

10075_ USRCERT _key1

10075_ USRPKEY _key1

取得

取得

取得できない

Page 96: Etwest2014 ts 6

TS-# TS-6

SELinux

96

Page 97: Etwest2014 ts 6

TS-# TS-6

rootを取られるとデータ取られ放題

•  Androidの下にはLinuxカーネル –  rootだとすべてのファイルの操作ができる

•  コピー •  削除 •  etc

•  rootが取られると防ぎようがないのが課題 →Linux発祥の対策モジュールSELinux

97

Page 98: Etwest2014 ts 6

TS-# TS-6

SELinuxとは

•  Security-Enhanced Linux

•  アメリカの国家安全保障局が2000年に提供

•  ライセンス –  GPL

•  Linuxカーネルに組み込むセキュアモジュール –  CentOSには標準で導入されている –  Android4.3で導入された

98

Page 99: Etwest2014 ts 6

TS-# TS-6

SELinuxって

•  導入すると次のことは必要なくなるのか? –  ファイアーウォール

•  通信の許可/不許可制御 –  IDS/IPS

•  侵入検知/攻撃ブロック機能

–  アクセス制御 •  不正ユーザのアクセス制限

–  セキュリティパッチ •  脆弱性対策パッチ

–  ウィルス対策ソフト •  ウィルス駆除など

99

Page 100: Etwest2014 ts 6

TS-# TS-6

SELinuxって

•  導入すると次のことは必要なくなるのか? –  ファイアーウォール

•  通信の許可/不許可制御 –  IDS/IPS

•  侵入検知/攻撃ブロック機能

–  アクセス制御 •  不正ユーザのアクセス制限

–  セキュリティパッチ •  脆弱性対策パッチ

–  ウィルス対策ソフト •  ウィルス駆除など

100

答えはNO

Page 101: Etwest2014 ts 6

TS-# TS-6

SELinuxのできること

•  SELinuxの特徴 –  Mandatory Access Control (MAC)

•  リソースやプロセスへのアクセスする権限を自由に制御できない

•  MAC実現のための機能 –  Type Enforcement (TE)

•  プロセスがファイルへアクセスするのを制限する仕組み

–  Role Base Access Control (RBAC) •  ユーザアカウントの権限を制限する仕組み(rootも含む)

→アカウントが乗っ取られてもアクセス範囲を制限

101

SELinuxは侵入された際に被害が拡大しないようにすること

Page 102: Etwest2014 ts 6

TS-# TS-6

SELinuxの動作

•  アクセスの制限は大きく2種類 – Permissiveモード

•  何も制限しないモード •  ファイルやプロセスのアクセスはすべて許可 •  ルール違反のアクセスはログに記載されるのみ

– Enforcingモード •  制限モード •  ルール違反した場合のアクセスは

すべて遮断される

102

Page 103: Etwest2014 ts 6

TS-# TS-6

Permissiveモードの動作の流れ

103

プロセス カーネル ファイル

•  ファイルアクセスの例

read/writeコマンド実行

Linux標準の権限確認 SELinuxの権限確認(MAC)

違反した場合はログに情報出力

Page 104: Etwest2014 ts 6

TS-# TS-6

Enforcingモードの動作の流れ

104

プロセス カーネル ファイル

•  ファイルアクセスの例

read/writeコマンド実行

Linux標準の権限確認 SELinuxの権限確認(MAC)

違反した場合はエラー

Page 105: Etwest2014 ts 6

TS-# TS-6

AndroidのSELinuxは発展途上

•  Enforcingモードだがルールの定義が不完全 –  ほとんど動作していない →今後対応が進む可能性が非常に高い

•  ルールはネットワークからアップデート可能 –  Compatibility Definition Documentに記載されている –  事例あり

•  SamsungがGalaxyのルールアップデートを行った

105

SELinuxは時間が経つにつれてセキュリティが強固になる

Page 106: Etwest2014 ts 6

TS-# TS-6

まとめ

•  障害報告減っている –  特定の障害報告が増えている

•  鍵/証明書、ファイルアクセスなど

•  KeyChain –  デジタル証明書を守るために使いましょう

•  KeyStore –  アプリ内用暗号鍵を守るために使いましょう

•  SELinux –  rootを取られてもファイルアクセスに制限がある

※時間経過とともに強固になる

106