2015年3月20日 星期五

BufferQueue Address Space

Android因為Binder的關係, 使得IPC的使用變得很直覺, 但有時也會讓Debug變得令人困擾. BufferQueue是其中一種. BufferQueue通常用來做Producer與Consumer兩個Process之間的溝通. AOSP提供一些helper class簡化developer的工作. 一般而言, BufferQueue是這樣產生的

這會產生一個BufferQueue以及producer與consumer, 但是要注意的是producer與consumer是代表BufferQueue兩端使用的interface (AOSP有兩個class實作這兩個interface), 並不是代表真正的Producer與Consumer物件. 簡單的說, 真正的Producer object只能使用producer這個interface來操作BufferQueue, 而真正的Consumer object則只能使用consumer這個interface來操作BufferQueue. 它的用意是希望developer可以專注在真正Producer與Consumer的部份. 由於AOSP提供大部份的implementation, 所以Producer與Consumer的實作就可以大大簡化. 實作是簡化了, 但是Debug並不見就簡單.


一般而言, BufferQueue的產生是在Consumer的Process裡, Consumer再將producer interface傳回給Producer process, 兩者的溝通就開始了, Producer是透過Binder使用producer interface, Consumer則是與consumer helper執行在同一個process裡. 從上圖來看, 大部份的BufferQueue的code都執行在Consumer process裡, 之所以要強調這件事是因為當我們在debug的時候, 有時候會搞不清楚某些code在哪個process執行, 再加上AOSP裡, 有些class的名字其實很類似, 尤其是trace到BufferQueue以及它的helper class裡.

2015年3月15日 星期日

Factory Reset Protection

Android L MR1新增了一個功能叫做Factory Reset Protection. 這個功能是為了避免手機或平板被偷走, 然後做Factory Reset, 將機器據為己用. 這個功能概念其實很簡單, 只要想辦法得知做Factory Reset的人是否是機器的主人或被機器的主人授權即可. 問題來了, 要怎麼知道呢? 很簡單, 只要使用者能夠解除Lock Screen, 就代表他被授權, 它就能從Settings裡啟動factory reset. 這種reset稱為trusted reset.  可是系統可不是只有這條路徑可以做factory reset, 利用fastboot一樣可以將/data清除掉, 跟factory reset有一樣效果. fastboot在清除/data之前必須先做OEM unlock的動作. 因此, 必須避免未經授權的oem unlock被執行. 如何避免呢?

在MR1裡, 要啟動factory reset partition的功能, OEM必須設定一個partition, 並mount起來, 將它的路徑寫在ro.frp.pst這個property裡. Framework新增一個PersistenceDataBlockService, 用來管理這個Partition. 它的layout如下圖所示.


Byte 0~31是利用SHA-256計算的checksum, marker是一個4 byte的magic number (0x19901873), size則是payload的大小, Partition最後一個byte稱為oem unlock. 如果這個是1, 代表這個機器的主人允許fastboot是做oem unlock, 如果是0則不允許. 所以, 當使用者是fastboot裡要執行oem unlock時, OEM必須檢查這個byte, 確認它的值是1才能做oem unlock. 在Developer option裡有一個選項是允許oem unlock. 如果使用者可以解除lock screen, 進到developer option打開這個選項, 就表示oem unlock是被授權的.

另一個問題來了, 如果機器的主人忘了解除unlock screen的密碼, 而且也沒在developer option裡允許oem unlock怎麼辦? 別擔心, Google有Android Device Manager, 透過網路, 它可以鎖定你的手機或平板, 使用者可以遠端將他的機器做factory reset. 基本上要啟動這樣的功能, 使用者的機器必須裝有Google GMS的軟體, 並有Gmail的帳號登錄. 不過, 對大部份的Android 機器而言, 這應該都不是問題.

在上圖的layout中, payload的用途主要是GMS在使用的, 它如何使用不得而知. PersistenceDatatBlockService有提供interface允許GMS讀寫這塊區域, 但是不是只用GMS可以寫, OEM也可以設計APP去讀寫這一塊, 但要避免和GMS同時使用.