顯示具有 Android 標籤的文章。 顯示所有文章
顯示具有 Android 標籤的文章。 顯示所有文章

2014年9月23日 星期二

[Android]client 和 service交互作用透過proxy 和 stub

交互過程client<-->proxy<-->stub<-->service
stub和proxy是為了方便client/service交互而生成出來的代碼,這樣client/service的代碼就會比較乾淨,不會嵌入很多很難懂的與業務無關的代碼

reference:
http://www.devdiv.com/forum.php?mod=viewthread&tid=41482

2014年6月9日 星期一

[Android]看log且有顏色區分

寫程式免不了要看一堆log來debug
而Android的log又臭又長的,實在很難找到關鍵點
所以如果可以用顏色來區分log的level,讓你一眼就看到Error類型的log
那是不是增加了debug的效率呢?!

這裡透過vim來看log,且有顏色區分,讓你一目了然!!

另一種方式在這裡,是adb logcat直接output到terminal的時候,做顏色的區別

2014年5月26日 星期一

[Android] delay sleep

在Android JAVA code裡面,如果你要使用sleep
請先 import java.lane.*;
然後使用 Thread.sleep();

但是你不能單單呼叫
Thread.sleep();
你必須寫成如下
try {
Thread.sleep(500);
} catch (InterruptedException e) {
Log.d("error");
}

2014年4月10日 星期四

[Android]在res資料夾下各國語言對照



語言 國家 Country 代碼 folder
阿拉伯文 埃及 Egypt EG values-ar-rEG
阿拉伯文 以色列 Israel IL values-ar-rIL
保加利亞文 保加利亞 Bulgaria BG values-bg-rBG
加泰羅尼亞文 加泰隆尼亞
西班牙的自治區之一

ES values-ca-rES
捷克文 捷克 Czech CZ values-cs-rCZ
丹麥文 丹麥 Denmark DK values-da-rDK
德文 奧地利 Austria AT values-de-rAT
德文 瑞士 Switzerland CH values-de-rCH
德文 德國 Germany DE values-de-rDE
德文 列支敦斯登侯國 Principality of Liechtenstein LI values-de-rLI
希臘文 希臘 Greece GR values-el-rGR
英文 澳大利亞 Australia AU values-en-rAU
英文 加拿大 Canada CA values-en-rCA
英文 英國 United Kingdom of Great Britain
And Northern Ireland
UK values-en-rGB
英文 愛爾蘭 Ireland IE values-en-rIE
英文 印度 India IN values-en-rIN
英文 新西蘭/紐西蘭 New Zealand NZ values-en-rNZ
英文 新加坡 Singapore SG values-en-rSG
英文 美國 United States of America US values-en-rUS
英文 南非 South Africa ZA values-en-rZA
西班牙文 西班牙 Spain ES values-es-rES
西班牙文 美國 United States of America US values-es-rUS
芬蘭文 芬蘭 Finland FI values-fi-rFI
法文 比利時 Belgium BE values-fr-rBE
法文 加拿大 Canada CA values-fr-rCA
法文 瑞士 Switzerland CH values-fr-rCH
法文 法國 France FR values-fr-rFR
印地文 印度 India IN values-hi-rIN
克羅里亞文 克羅埃西亞 Croatia HR values-hr-rHR
匈牙利文 匈牙利 Hungary HU values-hu-rHU
印度尼西亞文 印尼 Indonesia ID values-in-rID
義大利文 瑞士 Switzerland CH values-it-rCH
義大利文 義大利 Italy IT values-it-rIT
希伯來文 以色列 Israel IL values-iw-rIL
日文 日本 Japan JP values-ja-rJP
韓文 韓國 Korea KR values-ko-rKR
立陶宛文 立陶宛 Republic of Lithuania LT values-lt-rLT
拉脫維亞文 拉脫維亞 Latvia LV values-lv-rLV
挪威博克馬爾文 挪威 Norway NO values-nb-rNO
荷蘭文 比利時 Belgium BE values-nl-BE
荷蘭文 荷蘭 Netherlands NL values-nl-rNL
波蘭文 波蘭 Poland PL values-pl-rPL
葡萄牙文 巴西 Brazil BR values-pt-rBR
葡萄牙文 葡萄牙 Portugal PT values-pt-rPT
羅馬尼亞文 羅馬尼亞 Romania RO values-ro-rRO
俄文 俄羅斯 Russian Federation RU values-ru-rRU
斯洛伐克文 斯洛伐克 Slovakia SK values-sk-rSK
斯洛維尼亞文 斯洛維尼亞 Slovenia SI values-sl-rSI
塞爾維亞文 塞爾維亞 Republic of Serbia RS values-sr-rRS
瑞典文 瑞典 Sweden SE values-sv-rSE
泰文 泰國 Thailand TH values-th-rTH
塔加洛語 菲律賓 Philippines PH values-tl-rPH
土耳其文 土耳其 Turkey TR values-tr-rTR
烏克蘭文 烏克蘭 Ukraine UA values-uk-rUA
越南文 越南 Vietnam VN values-vi-rVN
中文 中國 China CN values-zh-rCN
中文 香港 Hong Kong HK values-zh-rHK
中文 台灣 Taiwan TW values-zh-rTW

2014年3月19日 星期三

[Android] 利用Wi-Fi下adb command

1 先接上連上 wifi,接上USB,下adb shell netcfg看手機ip
2 adb tcpip 5555
3 拔掉USB
4 adb connect 手機ip:5555
5 adb shell 就能使用


如果要斷線的話,可以下
adb disconnect 手機ip:5555


要再透過USB連上adb,下
adb usb

2013年12月12日 星期四

[Android] getprop/setprop/watchprops

getprop是去獲取android系統屬性

#getprop
[fmradio.driver.enable]: [1]
[persist.backgrounddata.enable]: [true]
.
.
.
前面代表key,後面代表value


所以如果要去更改property的值,如下
#setprop fmradio.driver.enable 0
但不是每個property都是可以修改的
例如ro.secure

watchprops則是會去監聽系統屬性的變化
一旦發生變化就會秀出來
例如按下power key去喚醒系統時,會出現如下
#watchprops
1357085171 sys.ipowin.done = '1'
1357085171 ril.keyguard.emergency = 'true'
1357085171 sys.settings_system_version = '4'


一般如果要利用property去做一些事情,首先要
import android.os.SystemProperties;
然後利用
String ProjectName = SystemProperties.get("ro.build.product", "");
去得到

2013年12月9日 星期一

[Android]android.mk

裡面都是用MACRO來命名
開頭一定要寫這兩行
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS) 把之前的設定給erase掉


E:\packages\apps\Bluetooth\Android.mk裡面
LOCAL_PACKAGE_NAME := Bluetooth
include $(BUILD_PACKAGE)
所以build出來會放在/out/target/product/xxx/system/app
叫做Bluetooth.apk

E:\frameworks\opt\emoji\Android.mk裡面
LOCAL_MODULE := libemoji
include $(BUILD_SHARED_LIBRARY)
所以build出來會放在/out/target/product/xxx/system/lib
叫做libemoji.so

E:\frameworks\base\cmds\surfaceflinger\Android.mk裡面
LOCAL_MODULE:= surfaceflinger
include $(BUILD_EXECUTABLE)
所以build出來會放在/out/target/product/xxx/system/bin
叫做surfaceflinger(這是個可執行檔)

E:\frameworks\base\services\audioflinger\Android.mk裡面
LOCAL_MODULE:= libaudiointerface
include $(BUILD_SHARED_LIBRARY)
所以build出來會放在/out/target/product/xxx/system/
叫做libaudiointerface

E:\frameworks\base\libs\usb\Android.mk
LOCAL_MODULE:= com.android.future.usb.accessory
include $(BUILD_JAVA_LIBRARY)
所以build出來會放在/out/target/product/xxx/system/framework
叫做com.android.future.usb.accessory.jar


Q: Given to build a shared library named libaudio, it will static link with
a library named libutil. And it has some src files, they individually are
libaudio1.c and libaudio2.c, please write a Android.mk to implement it.
A:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:= libaudio
LOCAL_STATIC_LIBRARIES += libutil
LOCAL_SRC_FILES:= libaudio1.c libaudio2.c
include $(BUILD_SHARED_LIBRARY)

[Android]IPC - sensorManager

在AP的部分,這個檔案裡面
G:\packages\apps\Settings\src\com\android\settings\fuelgauge\PowerUsageSummary.java
需要用到SensorManager
SensorManager sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);

在framework資料夾裡面有一個XxxManager.java就會有一個對應的XxxManagerService.java
例如PowerManager
proxy就是/frameworks/base/core/java/android/os/PowerManager.java
stub就是/frameworks/base/services/java/com/android/server/PowerManagerService.java

Service在Android框架裡的角色是「存取底層硬體」


\frameworks\base\core\java\android\app\ContextImpl.java
裡面的
public Object getSystemService(String name) {
會去比對妳是哪個manager,如果你是SensorManager
它會return getSensorManager();

private SensorManager getSensorManager() {
裡面,她會去new一個SensorManager
mSensorManager = new SensorManager(mMainThread.getHandler().getLooper());
然後實作在
\frameworks\base\core\java\android\hardware\SensorManager.java
裡面的建構式
public SensorManager(Looper mainLooper) {



\frameworks\base\core\jni\android_hardware_SensorManager.cpp
裡面有
int register_android_hardware_SensorManager(JNIEnv *env)
{
    return jniRegisterNativeMethods(env, "android/hardware/SensorManager",
            gMethods, NELEM(gMethods));
}
看到jni小寫開頭的就會到AndroidRuntime裡面去
\frameworks\base\core\jni\AndroidRuntime.cpp
註冊
static const RegJNIRec gRegJNI[] = {
   REG_JNI(register_android_hardware_SensorManager),
要在gRegJNI[] array裡面填入妳要註冊的東西


還有sensors_module_init在G:\frameworks\base\core\jni\android_hardware_SensorManager.cpp
static JNINativeMethod gMethods[] = {
    {"nativeClassInit", "()V",              (void*)nativeClassInit },
    {"sensors_module_init","()I",           (void*)sensors_module_init },
上面這是JNI mapping table
左邊是JAVA最後一支,右邊是C code第一支

有關mapping table會有兩個地方
一個在framework裡面,user自己寫的放這邊
一個在Dalvik VM裡面,也就是AndroidRuntime,android自己寫的放這邊

AndroidRuntime是由Dalvik VM + core lib所組成
上面的API都會經過Dalvik VM來check是否要進入c code
如果前面有native字眼的,就是會
它有個名稱叫做native method

所有java process都由一個叫zygote process去fork出來的
包含system server和JAVA AP
不是JAVA的,就是Daemon,也就是純C的,在zygote前面(比較靠近kernel的)

那像上面的mapping table,Daemon沒有,只有java process有

[Android]HAL

HAL的body在G:\hardware\libhardware\hardware.c
裡面有
int hw_get_module(const char *id, const struct hw_module_t **module)
裡面的load()的dlopen()去load stub [xxx(id).xx(prop).so]

HAL module的路徑有兩個地方,這是run time的時候才放在這邊
/** Base path of the hal modules */
#define HAL_LIBRARY_PATH1 "/system/lib/hw"
#define HAL_LIBRARY_PATH2 "/vendor/lib/hw"

HAL body會給妳一個variant key,然後利用這個key去data base裡面搜尋
data base有兩種,一個是\system\core\rootdir\init.rc

HAL stub
是Android user space driver
它是用來取代kernel space driver
以避開GNU license(人家跟你要source code,妳一定要給)
它在user mode有個license叫做apache license(人家跟你要source code,妳可以決定要不要給)
HAL stub
是透過PMEM來access hardware

HAL 的目的是為了把 Android framework 與 Linux kernel 完整「隔開」
目前 Android 的 HAL 實作,仍舊散佈在不同的地方
HAL 主要的實作儲存於以下目錄:
1. libhardware_legacy/ - 過去的實作、採取程式庫模組的觀念進行
過去的 libhardware_legacy 作法,比較是傳統的「module」方式,
也就是將 *.so 檔案當做「shared library」來使用,在 runtime(JNI 部份)
以 direct function call 使用 HAL module。透過直接函數呼叫的方式,來操作驅動程式。

2. libhardware/ - 新版的實作、調整為 HAL stub 的觀念
現在的 libhardware 作法,就有「stub」的味道了。
HAL stub 是一種代理人(proxy)的概念,stub 雖然仍是以 *.so 檔的形式存在,
但 HAL 已經將 *.so 檔隱藏起來了。Stub 向 HAL「提供」操作函數(operations),
而 runtime 則是向 HAL 取得特定模組(stub)的 operations,
再 callback 這些操作函數。這種以 indirect function call 的實作架構,
讓 HAL stub 變成是一種「包含」關係,即 HAL 裡包含了許許多多的 stub(代理人)。
Runtime 只要說明「類型」,即 module ID,就可以取得操作函數。

3. ril/ - Radio Interface Layer
RIL的stub是另外獨立拉出去變成一個process
傳統的是body+stub是一個process

core libraries即是Service程式碼的實作,
也就是,Android應用程式透過JNI(Dalvik)來到Service這一層,再透過Service載入*.so檔

Android的Service分為二種:Android Service與Native Service。
Android Service又稱為Java Service,是實作在框架層(framework)裡的「Server」。
這裡所講的「Service」是System Service,又稱為Server,
與應用程式設計上所討論的Service(android.app.Service)不同。Android Service以Java撰寫。

Native Service則是實作在Runtime層裡的Server。
架構設計上,我們有二個選擇,一個是實作Android Service、再透過JNI與HAL stub溝通;
另一個選擇是,跳過Android Service,讓Application(Manager API)直接與Native Service溝通。

未來的Android發展趨勢,應會以第二種做法為主,即Manager API直接與Native Service溝通,以達到更好的效能表現。

[Android]source code layout

bionic:
放一些lib, 讓你link到.so呼叫system call
原本是GNU library, 但是因為要open source code
所以google自己寫一個符合apache的, 這樣就不用open source code

bootable:
bootloader放這裡, u-boot...
Android稱它為USB bootloader,可與PC的fastboot溝通
\bootloader\legacy 是舊的
\bootable\bootloader\lk 是新的

\recovery 相當於Windows mobile的update loader

boot.img - 其實是kernel + 薄薄的一層user mode(RAM disk) 包含vmlinux, user process
userdata.img - NV ram非揮發性的記憶體,放一些device參數的設定,例如calibration...
system.img - (user mode)framework + 一點kernel

build:
所有make的環境, 裡面都是makefile
在這邊選用哪個toolchain

dalvik:
就是android runtime,
包含兩個folder
dalvik virtual machine: private, protect (jni_xxx)
vm: public (JNI_xxx)對外的public API
core library: JNINativeMethod 這邊的是system defined

development:
這裡會去build一些PC會用到的tool,例如
模擬器debugging,還有一些寫android AP的tool,
ddms, 相當於Windows mobile的platform builder,可以去看kernel debug, memory, register
apkbuilder, hierachyviewer, fastboot

framework:
是system server所在的地方,以及daemon的code
xxxService
system server process
有JAVA
有core library,這邊的是user defined
有C code: 1.HAL 2.HAL拿來當作daemon, 例如RIL 3.Multimedia
\cmds\ 儲存的是純C的process (daemon) 有servicemanager, surfaceflinger...

hardware:
就是HAL body
有type1, 2, 3, 有body, stub
type1(tranditional):
body - \libhardware
stub - \libhardware-legacy
type2(RIL):
body - rild
stub - reference ril(xx.so) 含AT-command,Qulcomm用的是自己寫的stub
shared memory方式,用RPC
type3(multimedia):
(body) alsa_sound .../libaudio/...
(stub) audioflinger, surfaceflinger .../msm7k/...

kernel:
vanilla香草kernel
device driver
7支spy
http://huenlil.pixnet.net/blog/post/25605797-%5B%E8%BD%89%5Dandroid-kernel-%E4%BB%8B%E7%B4%B9
http://loda.hala01.com/2011/01/android%E7%AD%86%E8%A8%98/
1.Ashmem(Android Shared Memory) 虛擬的
由Goolge 設計的一種記憶體分享、分配機制,主要用於 Google 設計給 Android 使用的 IPC Binder
http://huenlil.pixnet.net/blog/post/26662128-android-ashmem-%E7%9B%B8%E9%97%9C%E8%B3%87%E8%A8%8A
2.Binder
基於OpenBinder框架的一個驅動,用於提供Android平台的process間通訊(IPC,inter-process communication)
3.Logger

4.Low Memory Killer
相對於Linux標準OOM(Out Of Memory)機制更加靈活,它可以根據需要殺死process來釋放需要的記憶體
5.PMEM(Physical Memory) 實體的
有些device需要使用連續的memory,所以PMEM就是去做Physical Memory的管理
http://blog.csdn.net/sure00/article/details/6267208
6.Power Manager
針對嵌入式設備做了很多最佳化
7.Ram Console
他用一段Physical memory去模擬一個console,printk的時候會把message印到這塊RAM裡,最後透過/proc/輸出
http://blog.ednchina.com/bluehacker/1799392/message.aspx

external:
3-party release的AP和shared library
multimedia用的codec放這

package:
帶有UI的AP
google release有50個, 但只看到23個
其他是GMS, no source code
有一些要加入OHA協會才拿得到*.apk,例如google search, google talk, google map,

prebuild:
userimage
engimage
放toolchain G:\prebuilt\linux-x86\toolchain

system:
少量daemon放這邊, 其他在framework/base/core
/bluetooth/ 藍牙tool
/core/ minimal bootable環境 最小化可開機的環境
/extras/ low-level debugging, inspection tools
/wlan/ti TI 1251 WLAN driver and tools

在build ramdisk.img的地方

E:\system\core\rootdir\init.rc

vendor:
3-party放的
        HAL的stub

[Android]Build error出現cannot find symbol

在merge code的時候,直接覆蓋了 *.java 和 *.aidl 
  
當你build code的時候出現下面這樣 
frameworks/base/core/java/android/bluetooth/BluetoothAtt.java:263: cannot find symbol 
symbol  : method getAttPriority(android.bluetooth.BluetoothDevice) 
location: interface android.bluetooth.IBluetooth 
                return mService.getAttPriority(device); 
                                        ^ 
  
你可能要看mService是屬於哪個class 
結果找到是BluetoothService 
但是在BluetoothService裡面寫getAttPriority method阿! 卻還是跟我說找不到 
於是發現BluetoothService是繼承 IBluetooth.Stub,看到Stub,就知道他是binder 
所以就會跟aidl有關,aidl就像是C code裡面的 .h檔案 
在BluetoothService.java裡面新增了一個method,因為他是繼承binder的 
所以就必須在 
\frameworks\base\core\java\android\bluetooth\IBluetooth.aidl 
裡面去宣告getAttPriority 
但是我查過了~~確實有宣告 
所以為了確定他有重新去build這個BluetoothService.java 
我們去out/target/product/zoom/...把 Bluetooth.java & Bluetooth.class刪掉,讓他重新build一次 
  
這樣做完之後就可以build過了