交互過程client<-->proxy<-->stub<-->service-->-->-->
stub和proxy是為了方便client/service交互而生成出來的代碼,這樣client/service的代碼就會比較乾淨,不會嵌入很多很難懂的與業務無關的代碼
reference:
http://www.devdiv.com/forum.php?mod=viewthread&tid=41482
2014年9月23日 星期二
2014年6月9日 星期一
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");
}
請先 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
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]
#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", "");
去得到
但不是每個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)
開頭一定要寫這兩行
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有
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溝通,以達到更好的效能表現。
裡面有
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
放一些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過了
訂閱:
文章 (Atom)