天天看點

初入android開發之項目開發架構

記得實習的時候,帶我的那個師父對我說,搞這一塊,不要學得太細,主要需要熟悉linux、android相關的架構。

      在實習期,做了第一個項目,其實在這個中需到了很多東西。做一個androd的産品開發,說白了,就是使用者能夠通過上層應用程式來控制底層的硬體。

從底層驅動層來看,這一部分應該是産品開發的基石。它主要實作,使用者對于該硬體裝置的需求。如最簡單的LED燈,上層應用就需要能夠控制LED的亮、滅。底層驅動的代碼主要是C,處于核心層,我們有靜态加載驅動和動态加載驅動的兩種方式。(Makefile arm-none-linux-gnueabi-gcc)

靜态加載驅動,就是在編寫核心過程中,把該驅動編寫到kernel中,無需手動加載;動态加載驅動,編寫以ko的形式,需要動态的加載,有一些常用的指令:lsmod insmod rmsmod,在開發的初期,建議使用動态加載的方式。

驅動層,就是去操控硬體。是以,我們需要對硬體知識需要一定的了解。對于最簡單的LED,實作的應用為:控制亮、滅,那麼底層驅動隻需要控制與LED相連的CPU端引腳電平即可,對于此類功能簡單的裝置,可以使用檔案節點(sys)的方法。

如:

static ssize_t red(struct device *dev, struct device_attribute *attr, 

const char *buf, size_t count)

{

gpio_set_value(SCAN_RED, ((buf[0]=='1')?1:0));

printk("sacn--%s,state=%d\n",__FUNCTION__,((buf[0]=='1')?1:0));

    return count;

}

static DEVICE_ATTR(red, S_IRWXUGO, 0, red);static struct attribute *scan_attr[] = {

    &dev_attr_red.attr,

    NULL

};

而對于相對複雜的的産品,如攝像頭、LCD、TP這類,需要相關的子系統架構,或者搭建平台裝置驅動模型。在自主的産品開發過程中,采用平台裝置驅動模型較多。在平台裝置驅動中,對上層提供控制接口,主要是通過open、close、read、write、ioctl的方法,對于下層硬體層,主要根據具體的裝置,通過與裝置相連的總線協定,去讀寫裝置中的寄存器,進而控制硬體。是以,這裡我們還需要有相關總線協定的驅動。如:攝像頭一般通過I2C,BT通過序列槽、wifi通過SDIO。

對于驅動層的編寫,有一些小技巧,一方面,使用動态加載驅動的方式,另一方面,編寫一個測試驅動的可執行檔案,通過檢視在裝置終端執行,檢視相關的log,可以比較方法的測試,底層驅動是否可以控制硬體裝置。

從android framework層來看,一般分為C的jni層、java層。我們應該知道,java不能直接調用C所編寫的方法,而需要通過jni進行轉換。一般framework層也有不同的機制,其一:把jni層編寫動态共享庫so,jar;其二:把jni層加入到android 源碼下的farmework/base/core/jni,jar代碼加到frameworks/base/core/java/android/的native方法,中間在封裝一個serve或者manager。這兩種方法的實作原理都是一樣的。

從jni層來看,這一部分主要使用c、c++,但需要了解jni的機制、java和C的資料類型的差别等。jni層對代碼的健壯要求比較高,是以寫程式的時候,對于指針、數組一定要小心。

jni層,就是把驅動提供的方法通過jni轉換,提供給java用,進而使用者通過編寫應用程式,調用方法,進而控制硬體。這裡,主要對于平台裝置模型,主要是調用open、read、write、ioctl、close這些方法,提供使用者對硬體産品的需求的方法。對于檔案節點的方式,隻需要對檔案節點傳值。jni層的代碼和Android.mk通過android mm或者NDK生成so。

從jar包或者native、serve來看,這主要是對jni提供的方法進行再次封裝,并對類、方法名進行規範。這裡注意jar的路徑、包名、so的名稱的一緻性與規範性。

從應用層來看,這裡主要是調用jar包中的方法,實作使用者對該硬體産品的需求功能。主要是針對硬體産品的功能,做出相對應的應用。

最後,整體上可以看出,硬體、驅動、jni接口、java中native(serve manager)、app。

繼續閱讀