2017年11月14日 星期二

Android Interacting with Other Apps using Messenger or AIDL

在Linux階層上的IPC,Android用了iBinder來包裝之間溝通的管道。iBinder有兩種形式可以傳遞資料。預備知識是使用android的service並且exported,可使其他application能夠喚起該service。


第一種是用Messenger封裝起來,使用Message來傳遞,開啟Service後,建立一個Messenger instance,使用Messenger的getBinder提出傳給service,而client也是透過取得的binder來創建Messenger來溝通。並且可以使用Messenger.replyTo來建立一個收訊息的接口來跟遠端service溝通。溝通的單位是bundle。

第二種是使用Android Interface Definition Language,簡單的說就是iBinder中定好溝通的規則,也就是functions。在server(service端)建立好iInterface的aidl實作的binder,在service中回傳該binder,然後在client端中也是用aidl檔承接轉型該ibinder至iInterface,雙方就透過iInterface中定義好的functions溝通。





一些概念解釋:


iBinder就是android中建立在ipc上的java層,用來使用ipc來溝通的。

Messenger其實就是封裝iBinder,使用Messenger類來透過ibinder來溝通。

AIDL則是在ibinder層先定義好傳輸資料,接著雙方用該接口來互動。該檔案需在sdk中編譯,並且對應相同的pacakge name,比如說你aidl package name是com.handsome.hydra你就得放在src/main/aidl/com/handsome/hydra/的資料夾下放IInterface.aidl,此後sdk編譯好後你才能使用IInterface.stub方法。

若你有使用ipc shared memory, message queue的經驗,基本上java那層就是封裝過的實作層,讓你用他們定義好的資料傳輸方式來使用ipc就是了。

2017年7月31日 星期一

Build nexus player AOSP

我用Virtualbox裝了Ubuntu14.04來安裝,比較保險,I like to do it in an old fashion way.

基本上全部的步驟都在document裡面了
https://source.android.com/source/requirements

我列出過程中需要注意的地方

  • adb usb driver跟fastboot usb driver是不同的
基本上用sdk的universal usb driver都可以support. 只是兩個是不同的,都得assign進vm
  • fastboot某些權限需要root user. 只能跑在root user裡
build好以後用fastboot燒時指定product directory.
export ANDROID_PRODUCT_OUT="/home/hydrated/Android/out/target/product/fugu"


之後flashall進去以後如果順利 LeanbackLauncher長這樣 (wtf..)

Remote也辦法正常配對,我甚至認為這篇文章可以subtitle: how to pair your nexus remote without native supported.

好險有adb,用盡我對android的了解,終於找到辦法

     1. 首先先用am start AddAccessoryActivity
am start -n com.android.tv.settings/.accessories.AddAccessoryActivity


     2. 正常的remote配對方法,按下back and home,就能配對了。

     3. 找到device後別開心,因為你按不下enter!(wtf again),好險一樣有adb
shell input keyevent 66

..終於配對成功,只花兩天而已。然後software keyboard也沒支援,打wifi password時長這樣

fugu:/ $ input keyevent 46                                                     
fugu:/ $ input keyevent 43                                                     
fugu:/ $ input keyevent 29                                                     
fugu:/ $ input keyevent 41                                                     
fugu:/ $ input keyevent 51                                                     
fugu:/ $ input keyevent 29                                                     
fugu:/ $ input keyevent 42                                                     
fugu:/ $ input keyevent 32                                                     
fugu:/ $ input keyevent 33                                                     
fugu:/ $ input keyevent 46                                                     

fugu:/ $ input keyevent 66

adb shell input text 'password'

另外一些make指令
mmm -j32 packages/apps/TvSettings/QuickSettings/

其他build framework的啦,build kernel的啦都有,只是我的人生不需要去回想那些就是了...