久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 學習筆記 > 嵌入(ru)式之(zhi)Android移植學習(xi)筆(bi)記

嵌入(ru)式之Android移植學習筆記 時間:2018-08-23      來源:未知

jni:java native interface java調用(yong)c語言的(de)接(jie)口

HAL(hardware abtract layer) 硬件抽象層

binder 虛擬設備,不是硬件,用于進(jin)程(cheng)間(jian)通訊(獨立的進(jin)程(cheng)通訊機制)

更(geng)為安全高效(xiao)、拿一段內存進(jin)行設備通訊、相比共(gong)享內存安全、可以創(chuang)建多個

一(yi)般學習過程(cheng)首先研究binder

總結:binder是(shi)更為安全高效的進程間通(tong)訊(xun)機(ji)制

libraries 庫 native 本地

C/C++開(kai)發的庫,一(yi)般成為本地庫,上層(ceng)(ceng)開(kai)發一(yi)般是java,對于內核(he)而言是應用層(ceng)(ceng)

surface Manager 界面開(kai)發、圖形開(kai)發

Media Framework 音(yin)頻框(kuang)架

SQLite 數據庫、本(ben)地的庫

OpenGL|ES 圖形渲染

FreeType 字體素材(cai)

WebKit 瀏覽器的內核

SGL 2d圖形渲染

SSL 加(jia)密套接(jie)層

Libc 標準C庫(ku)

Android Runtime 安(an)卓運行時環(huan)境 runtime 一般(ban)指運行環(huan)境

Core Libreries

java 虛擬機將代碼解(jie)析到對應的平臺(tai)

Application Framework

Activity Manager 活(huo)動窗口(界面)

Window Manager 窗(chuang)口管理

Content Provider 數據共享(xiang)(xiang),可使(shi)2個(ge)app共享(xiang)(xiang)數據

View system 界(jie)面渲染

Notification Manager 通(tong)知

Package Manager apk包的管理

Telephone Manager 打電(dian)話

Resource Manager 資(zi)源管理(li)

Location Manager 與GPS相關(guan),定位(wei)

XMPP Service 短信接收(shou)和(he)發送

Application

應用程序

home等(laucher)

boot.img 是(shi)一個uboot + kernal + rootfs

①source bulid/envsetup.sh

②lunch //envsetup里面的(de)一個函數

③extract-bsp

④make -j2

⑤pack //打包

boot.img + system.img + recovery.img = 最終產物

如何進行數據(ju)的傳輸(shu)?

①adb devices

②adb push .\文件名 /system/lib

出現系統只讀則需要重新掛載 執行 adb remount

③使(shi)用(yong)adb shell 進(jin)入(ru)到對應的安卓命(ming)令行 //安卓和電腦使(shi)用(yong)數據線(xian)連(lian)接,usb可(ke)調式(shi)確認后(hou)才可(ke)使(shi)用(yong)

④使(shi)用 adb pull /system/lib/文件(jian)名(ming) 將對應的文件(jian)獲取到(dao)當(dang)前目錄

使(shi)用 exit 退出安卓平(ping)臺

⑤使(shi)用apk 安裝

adb install *.apk //有個push過程,再進行安裝(zhuang)

關于(yu)linux網絡這塊(kuai)問題解決

使用局域網時用靜態ip連(lian)接開發(fa)板 橋接

使用wifi時用動態ip連接網絡(luo) 自定義(yi)橋接 使用wifi網卡

使(shi)用(yong)(yong)網(wang)線動(dong)態ip連接(jie)網(wang)絡(luo) 自定(ding)義橋接(jie) 使(shi)用(yong)(yong)以太網(wang)卡

5層模型

app 應用

app framework 應用框架

libs 核心庫(ku)

HAL 硬(ying)件(jian)抽(chou)象層

kernel 內核

①source build/envsetup.sh

455-460 添加默認的編(bian)譯菜(cai)單

1506-1512 查(cha)找device和vendor目錄(lu)下名稱為vendorsetup.sh腳本并執行

查看device/softwinner/fspad-733/vendorsetup.sh

添加產品編譯

8個產品(pin)編譯(yi)選(xuan)項保存在 LUNCH_MENU_CHOICES數(shu)組中

②lunch

執行build/envsetup.sh 481

488-490,打印選項菜單,讀(du)取用戶輸入值(zhi)

495-507,根據用戶輸入選項,從LUNCH_MENU_CHOICES數(shu)組菜單項內容,保存到selection變量(liang)

518-536,將產(chan)品名和編(bian)譯(yi)類型提(ti)取,產(chan)品名保存到product,編(bian)譯(yi)類型保存到variant

544-546,賦值到對(dui)應的全(quan)局變量(liang),導出

550,設(she)置剩余的環境變量

551,打印變量列表

③extrap-bsp

將lichee編譯出來,boot.img和(he)modules.ko拷貝到androidL下面,為下一(yi)步打(da)包做準(zhun)備(bei)

④make

執(zhi)行androidL/Makefile

執行build/core/main.mk

執行對應93行,包含build/core/config.mk

跳(tiao)轉到build/core/config.mk

63-99,賦(fu)值(zhi)一些(xie)列編譯系統內部(bu)的子makefile路徑,為后面直接(jie)使用,可以編譯成不同類型產(chan)物

151,包含build/core/envsetup.mk

跳到該mk下

138行,包(bao)含了(le)build/core/product_config.mk

跳轉到該文件

189,讀取源碼樹下面所有的名(ming)稱(cheng)為AndroidProducts.mk產品(pin)makefile

獲取device/softwinner/fspad-733/AndroidProducts.mk

該文件獲取device/softwinner/fspad-733/fspad_733.mk

定義軟件系統配置 app屬性(xing) copy產(chan)品(pin)信息

150-155行,查找(zhao)device和vendor目錄下面產品(pin)目錄名為(wei)BoardConfig.mk獲取文件(jian)

跳轉到mk下

獲(huo)取文件為 device/softwinner/fspad-733/BoardConfig.mk

該文件(jian)進行硬件(jian)配置

配置板子上硬件,主要是wifi和(he)bt配置

⑤pack //由于(yu)一開始source后即可使用pack命令(ling)來進(jin)行(xing)解析

打包 boot.img+system.img+recovery.img

打包為 lichee/tools/pack/sun8iw3p1_andorid_fspad_733_card0.img

添加(jia)(jia)一個產(chan)品的時候需(xu)要在哪些文件上添加(jia)(jia)?

①device/osoftwinner/fspad-733/vendorsetup.sh 下(xia)添加產品菜單

②device/softwinner/fspad-733/AndroidProducts.mk 下添加對應產品(pin)文件名

③device/softwinner/fspad-733/fspad_733.mk 軟件添加(jia)文件

④device/softwinner/fspad-733/BoardConfig.mk 硬件(jian)添加(jia)文件(jian)

A := a A賦值為a

新建(jian)一(yi)個(ge)文(wen)件夾hello

在里面

編寫 hello.c

編寫自己的Android.mk

#current module path

①LOCAL_PATH := $(call my-dir)

#clear vars old value

②include $(CLEAR_VARS)

#module name don't need to specify a path.

③LOCAL_MODULE := hello

#specify source file

④LOCAL_SRC_FILES := hello.c \

world.c\

#build this module to executable binary file

⑤include $(BUILD_EXECUTABLE)

最后

編譯

source build/envsetup.sh

lunch 9

mmm device/softwinner/fspad-733/hello/hello.c //絕(jue)對路徑

如果在當前(qian)目錄下則為 mm 使(shi)用當前(qian)路(lu)徑來進行(xing)編譯(yi)模塊(kuai)

為什么會提示(shi)對應的依賴錯誤?

No private recovery resources for TARGET_DEVICE fspad-733

make: Entering directory `/home/linux/fs733/androidL'

make: *** No rule to make target `/hello.c', needed by `out/target/product/fspad-733/obj/EXECUTABLES/hello_intermediates/hello.o'. Stop.

make: Leaving directory `/home/linux/fs733/androidL'

路徑出錯

可能是自己對應的代碼(ma)敲寫錯(cuo)誤導致(zhi)

adb的使用說明:

adb的使用

使用過程:

1.通過usb線(xian)將(jiang)主機和(he)平板從機連(lian)接,打開PhoenixSuit工(gong)具,必須顯示和(he)設備(bei)已經連(lian)接上。

2.使用(yong)以下命令與平板android系統交互:

a.adb shell 進(jin)入(ru)到(dao)android的linux的命令行模(mo)式

exit 進入到命令行模式之后需要的退出

b.adb push 主機需要(yao)被(bei)推(tui)送(song)的文件目錄 平板存放(fang)推(tui)送(song)文件的位置(zhi)

將文件(jian)推(tui)送到(dao)從機指定目錄

c.adb pull 平板中(zhong)需(xu)要被拉去出來的文件的位置

從從機拉取文(wen)件到主機

d.adb install xxxx.apk 將xxxx.apk android應用程序安(an)裝到從機(ji)上

e.adb devices 列出所有連接到主(zhu)機(ji)的從機(ji)信息

 tips:在敲adb命令的(de)時候,如果(guo)提示read-only file system的(de)時候,你就使(shi)用命令adb remount 重(zhong)新掛載(zai)一下(xia)

android的文件系統就可以了。如果說(shuo)還(huan)是不行,任然提示該信息,那(nei)么就要(yao)修改從機(ji)目錄屬(shu)性。

編譯完(wan)成后根據

Install: out/target/product/fspad-733/system/bin/hello

來找到對應目錄將文(wen)件(jian)拷貝(bei)到windows平臺下

打開(kai)phoenixSuit程(cheng)序(xu),連接(jie)安卓后

在含有adb.exe的文件下面(mian)的空白(bai)處(chu)點(dian)擊 shift + 鼠標右鍵 訓責phoenixSuit運(yun)行(xing)

使用adb push .\hello /system/bin (由于(yu)是執行(xing)phoenixSuit后,/system/bin直接執行(xing))

使用(yong)adb shell進入安卓shell

hello 即可打印對應的函數

init啟動流程

①解析/init.rc

action_list 、service_list

②添加action到(dao)action_queue中(zhong)

③執行action相關命令(與action的(de)序(xu)列有(you)關),查看是否(fou)有(you)需要重新啟動(dong)的(de)服務,如(ru)果有(you)則啟動(dong)這些服務

④poll監聽(ting)3路socket

屬(shu)性設置→修改屬(shu)性

組合(he)鍵→對應服務

服務進(jin)程退出→將標(biao)志位(wei)置為重(zhong)啟與restart進(jin)行結合重(zhong)啟進(jin)程

init啟(qi)動zygote

①修改進程名

②android Runtime的start方法 啟(qi)動(dong)虛擬(ni)機 vm

③調用執行zygote init的main方法

C++代碼截止

init啟動后執行system/core/init/init.c

1059 判斷ueventd 還是(shi)init

1060 如果(guo)啟動(dong)設備(bei),解析設置uevent事件,創建設備(bei)文件

1062 若是啟動watchdogd 設置看(kan)門狗以(yi)及(ji)喂狗

1072-1081 創建一些目錄并掛在文件系統

1120 從文件中(zhong)加載系統(tong)屬(shu)性(xing)默認值(zhi)

1123 解析init.rc 建立服務鏈表(biao)(biao)和動作(zuo)鏈表(biao)(biao)

1128-1134 創建內部action

1139 創建init動(dong)作init到(dao)動(dong)作鏈表

1152 添(tian)加early-init動作到動作鏈(lian)表

action_for_each_trigger("early-init", action_add_queue_tail);

1145-1154 創(chuang)建內部action并觸(chu)發

①early_init

②wait_for_coldboot_done(內(nei)部動作)

等待冷啟動設(she)備(bei)掃描(miao)(為每個(ge)設(she)備(bei)創(chuang)建設(she)備(bei)文件(jian))

③keychord_init

打(da)開組合鍵的監聽文件

④console_init

檢測(ce)console終(zhong)端(duan)是否存(cun)在,顯示logo

⑤property_service_init

打開屬(shu)性(xing)修改服務的socket

⑥signal_init

設置(zhi)sigchild信(xin)號處理,回收孤(gu)兒進程資源

⑦late-init

⑧queue_property_trigger

促(cu)發(fa)rc腳本中property:屬(shu)性名= 屬(shu)性值(zhi) 形式(shi)的動作

1166 主(zhu)循環(huan)

①execute_one_command();

執行一(yi)個命令

②restart_processes();

掃描是否(fou)有服務需要重啟

③ 監控(kong)并處理屬性(xing)修(xiu)改請(qing)求、組合按(an)鍵啟(qi)動服務(wu)請(qing)求和檢測服務(wu)進(jin)程(cheng)退(tui)出

init.rc本地(di)服務被啟動

①ueventd 接收、解析和處(chu)理uevent,新建/刪除設備文件,固件加載

②console 終端,啟動(dong)shell程序

③adbc adb程序服務端(duan)

④service manager 服(fu)務管(guan)理程序

⑤vold(volume daemon) 完成(cheng)系統(tong)cdrom,usb大量存儲,mmc卡等擴展(zhan)存儲的掛載任務

⑥netd 網絡服(fu)務

⑦surfaceflinger 繪制android程序(xu)的ui,完成2d和3d的無(wu)縫融合

⑧zygote 啟動虛擬機(ji)服務

⑨media 多媒體服務(wu)

⑩bootanim 負責android播放開(kai)機啟動(dong)動(dong)畫以及(ji)背景音樂

其中關鍵

①zygote

定義 在init.zygote32.rc

service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server

class main

socket zygote stream 660 root system

onrestart write /sys/android_power/request_state wake

onrestart write /sys/power/state on

onrestart restart media

onrestart restart netd

可以看到主(zhu)要啟(qi)動的(de)程序 app_process

實(shi)現在frameworks/base/cmds/app_process/app_main.cpp‘

186 main函數

解析參數后

201行之后得到

227-236 將參數 runtime

246-264 將后面(mian)參數解析出來,得到(dao)結果

301-304 進程名更(geng)改nicename = zygote

307 運行類com.android.internal.os.ZygoteInit

runtime.start();

rumtime是AndroidRuntime類

通過找(zhao)到androidruntime類找(zhao)到調用(yong)的start成員函數(shu)

frameworks/base/core/jni/AndroidRuntime.cpp 930行

966 啟動java虛擬機(ji)

974 注冊andorid本地函數

988 找到(dao)string類

1006 將(jiang)傳進來的classname com.android.internal.os.ZygoteInit

轉(zhuan)換為路徑com/android/internal/os/ZygoteInit

1007 找(zhao)到com/android/internal/os/ZygoteInit類

1018 com/android/internal/os/ZygoteInit類的main函數進入到java

ZygoteInit類定義在目錄(lu)

frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

轉(zhuan)到(dao)里面 main函數 644

通過644里面(mian)函數 同時AndroidRuntime那邊將參數"start-system-server"也傳進(jin)來

668行通過注冊 zygote socket服務(wu)端

671 預加載了一些(xie)資源和庫(ku)

686 調用startSystemServer函(han)數啟動了systemserver

查看(kan)startSystemServer 在573行定(ding)義

607行(xing) 創建一(yi)個子(zi)進程來運行(xing)forkSystemServer

624調用handleSystemServerProcess實現在494行

537行(xing) RuntimeInit.zygoteInit();

該(gai)函(han)數(shu)定義在(zai)rameworks/base/core/java/com/android/internal/os/RuntimeInit.java 267行

查看applicationInit函數在297行定義

關(guan)鍵(jian)321行,invokeStaticMain();

其中第一個參數就是前面傳遞過來的 com.android.server.SystemServer

該(gai)句子調(diao)用了com.android.server.SystemServer類的main函(han)數

定義在frameworks/base/services/java/com/android/server/SystemServer.java 170

運行了run函數,定(ding)義(yi)在179

255-257 啟動了好多services

其中316行(xing),ActivityManagerService的(de)systemReady函數,表示ActivityManagerService的(de)ready

ActivityManagerService的定義。frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

在(zai)11373,在(zai)systemReady調用startHomeActivityLocked啟(qi)動(dong)桌面應(ying)用

bootanimation

init.rc 中(zhong)

service bootanim /system/bin/bootanimation

class main

user graphic

group graphics

disabled

oneshot

找(zhao)到bootanimation源碼 frameworks/base/cmds/bootanimation/bootanimation_main.cpp 39行

55行,創建開機動畫播(bo)放線程(cheng)

找到(dao)BootAnimation類,打開可以看到(dao)是利(li)用(yong)opengl渲(xuan)染的(de)。

230行,看readyToRun函數

291行~301行,判斷在(zai)/sytem/media目(mu)錄下(xia)否有bootanimation的素材壓縮包。

313行,在線程循環函數中判(pan)斷了上(shang)面(mian)判(pan)斷結果,是否有bootanimation.zip

如果(guo)有就(jiu)播(bo)放,如果(guo)沒有就(jiu)調用android函數。

328行,android函(han)數定(ding)義

330,331行,可以看到定義(yi)圖片的(de)位置。

下面opengl播(bo)放圖片。

找到(dao)圖片放的位置(zhi), find . -depth -name android-logo-mask.png

在frameworks/base/core/res/assets/images/android-logo-mask.png

所以(yi)如(ru)何定制(zhi)開(kai)機啟動動畫?

1.在/data/local或(huo)/system/media目錄(lu)下(xia)添(tian)加自(zi)己的(de)動畫(hua)bootanimation.zip文件(jian)(同時(shi)也(ye)可以添(tian)加相應的(de)開(kai)機(ji)(ji)音樂boot.mp3),這樣在系統啟動時(shi)就(jiu)會播放自(zi)己的(de)開(kai)機(ji)(ji)動畫(hua)和播放音樂。

2.可以替換一(yi)下frameworks/base/core/res/assets/images/ 目錄下兩張圖(tu)片(pian)。

粗略啟動流程

uboot

內核

掛載(zai)根文件(jian)系統

掛載system系統 里面含有很(hen)多文件

執行第(di)一個進程init

解析init.rc文件

執行了一些列(lie)命令,啟(qi)動(dong)了一些服(fu)務,后(hou)退化成(cheng)為一個(ge)守護進程

該守護進程 ①系統屬性修改 ②重啟子進程 ③組合鍵按下(xia)啟動對應服務

其中有一個很重要的服務zygote

創建虛擬機

運行(xing)systemserver 啟動很多java服務

其中有個很重要的服務(wu)activityManager執行(xing)一個systemReady函數運行(xing)了一個界面

VFS 統一文件系統差異(yi),為上層提(ti)供接口

HAL

統(tong)一下層硬件差異,為上層提供接口

為了保護(hu)硬件供應商的知識產權

不是所用硬件設備都有標準的linux kernel接口

為什么open在modules中,而close在device

每個device是對應不同的(de)關(guan)(guan)閉方(fang)式,所以在device中關(guan)(guan)閉,而打開(kai)只需(xu)統一打開(kai)

hal_*.h

#include

//stub具體某一個device id號(hao)

#define LED1 1

//led模塊(kuai)stub的(de)id

#define LED_HARDWARE_MODULE_ID "led"

①定(ding)義一個led_module_t 模塊(kuai)結構(gou)體

里面第一個結構體必須為struct hw_module_t 的對(dui)象

struct led_module_t {

struct hw_module_t common;

};

②定義led_device_t 設備結構體

里(li)面第一個為struct hw_device_t 結(jie)構體(ti)

struct led_device_t {

struct hw_device_t common;

int fd; //存放調用(yong)open返回描述符

int (*led_on)(struct hw_device_t *dev); //

int (*led_off)(struct hw_device_t *dev);

};

hal_*.c

①定義一個hw_module_t 對(dui)象HAL_MODULE_INFO_SYM必須為(wei)這個對(dui)象

 在(zai)對(dui)象(xiang)里面對(dui)其(qi)成員進行(xing)初始化

struct hw_module_t HAL_MODULE_INFO_SYM = {

tag: HARDWARE_MODULE_TAG,

version_major: 1,

version_minor: 0,

id: LED_HARDWARE_MODULE_ID,//頭(tou)文件(jian)中含有

name: "led module",

author: "farsight",

methods: &led_module_methods,//主要是實現一些方法

};

②定義一(yi)個(ge) hw_module_methods_t 對象led_module_methods 里面(mian)裝著一(yi)個(ge)led_open函(han)數地址

static struct hw_module_methods_t led_module_methods = {

open: led_open,

};

③定義 led_open函(han)數

static int led_open(const struct hw_module_t* module, const char* name, struct hw_device_t** device)

{

char devpath[128] = "/dev/";

struct led_device_t *dev;

//函數中新建一個結構體指(zhi)針指(zhi)向(xiang)led_device_t開(kai)辟的空(kong)間中

//1.分配描述被打(da)開(kai)的設備device結(jie)構體(ti)

dev = (struct led_device_t *)malloc(sizeof(struct led_device_t));

if (!dev) {

LOGE("alloc device memory failed\n");

return -EFAULT;

}

memset(dev, 0, sizeof(struct led_device_t));

//對(dui)其結構體成員進行賦值

//2.填(tian)充設備結構體的成員

dev->common.tag = HARDWARE_DEVICE_TAG;.//必須為這個(ge)

dev->common.version = 0;

dev->common.module = (struct hw_module_t *)module;

dev->common.close = led_close;

dev->led_on = led_on;

dev->led_off = led_off;

strcat(devpath, name);//devpath設備文(wen)件路(lu)徑(jing) /dev/name

//通(tong)過(guo)結構體(ti)賦值close、led_on、led_off

//3.調用系統調用open,open再通過linux內核(he)調用到驅動(dong)代碼中的led_open函數

dev->fd = open(devpath, O_RDWR);

if (dev->fd == -1) {

free(dev);

LOGE("open device failed\n");

return -1;

}

//4.返(fan)回打開的具體設備的描述結(jie)構體指針

*device = &(dev->common);

return 0;

}

④led_on、led_off、led_close的(de)實現(xian)

主要是(shi)調用了(le)系(xi)(xi)統(tong)調用,通過(guo)系(xi)(xi)統(tong)調用將設備的信息(xi)傳(chuan)遞給結構體

static int led_on(struct hw_device_t* device)

{

struct led_device_t *dev = (struct led_device_t *)device;

if (dev->fd != -1)

 return ioctl(dev->fd, LED_ON); //調用系統調用ioctl,ioctl回(hui)去通過linux內核調用到驅動(dong)中unlocked_ioctl

else

return -1;

}

static int led_off(struct hw_device_t* device)

{

struct led_device_t *dev = (struct led_device_t *)device;

if (dev->fd != -1)

return ioctl(dev->fd, LED_OFF);

else

return -1;

}

static int led_close(struct hw_device_t* device)

{

struct led_device_t *dev = (struct led_device_t *)device;

if (dev->fd != -1) {

close(dev->fd);//調(diao)用系統調(diao)用close,close回去通過(guo)linux內(nei)核調(diao)用到驅動中led_close

free(dev);

}

return 0;

}

lib中

使用hal提(ti)供的框架(jia)接口(kou) hw_get_module();//獲取到對應hal里模塊的結構體地址

通過(guo)訪問這個結構體(ti)的(de)(de)methods里的(de)(de)led_open即可(ke)調(diao)用到底層(ceng)的(de)(de)open

touch可以更(geng)新(xin)對應的(de)代(dai)碼時間戳,使編譯的(de)時候重新(xin)編譯

整(zheng)體一個流程:

①app上(shang) 通過led_open會調用coreLib庫

②庫中使(shi)用hal接口(kou)函數hw_get_module();

來通(tong)過LED_HARDWARE_MODULE_ID進(jin)行獲取到對應(ying)的模(mo)塊module,

③通過獲取模塊(kuai)中的(de)第一個成員(yuan)hw_modules_t 中的(de)mothods方(fang)法(fa)集合里面的(de)open方(fang)法(fa)將(jiang)對應的(de)模塊(kuai)傳入(ru)進入(ru)到hal中

④在hal中(zhong)通(tong)(tong)過(guo)(guo)上面傳入下來的(de)(de)name,將器設(she)備(bei)路徑給(gei)獲取(qu)后,通(tong)(tong)過(guo)(guo)打(da)開設(she)備(bei)驅(qu)動的(de)(de)open函數(shu)即完成獲取(qu),并且創(chuang)建一個led_dev結構體,通(tong)(tong)過(guo)(guo)結構體進行初始化,將其傳遞給(gei)在coreLib中(zhong)的(de)(de)device對(dui)象(xiang),便于(yu)后續的(de)(de)操作使用,雖然(ran)傳遞過(guo)(guo)去(qu)的(de)(de)不(bu)是(shi)led_dev對(dui)應的(de)(de)結構體,但是(shi)由于(yu)hw_device_t與(yu)對(dui)應結構體的(de)(de)首(shou)地(di)址一致(zhi),所以通(tong)(tong)過(guo)(guo)強轉即可獲取(qu)到led_dev對(dui)應的(de)(de)方(fang)法

Android硬件抽象(xiang)層框架代碼在 hardware目錄

Dalvik虛擬(ni)機(ji)作(zuo)用(yong):

①Dalvik基于虛擬機,JVM基于棧,所以(yi)效率更高

②Dalvik可運(yun)行壓縮(suo)過,針對內(nei)存(cun)優化過的(de)dex,減少(shao)文件尺寸,提高查找類的(de)速(su)度(du)

③Dalvik每(mei)一個應(ying)用程(cheng)序(xu)運(yun)行與一個獨(du)立進(jin)程(cheng)

android系統中,使用(yong) make ramdisk命令(ling) 只(zhi)編譯文件系統

android系統(tong)app framework層(ceng),HAL層(ceng),core Libs 代碼編譯之后(hou)在system.img

通過GetStaticMethodID(startClass, "main", "([Ljava/lang/String;)V")找到對應(ying)的方法應(ying)該

①([Ljava/lang/String;)V") ===》 [ 數組 String =》tring 類型(xing),參數 V ===》void 返回(hui)值(zhi)

②main為函數名 即(ji)可推(tui)出 void main (String [] )

init.rc包含5個部分

①import導入 ②commond命令 ③service服(fu)務(wu) ④action行為 ⑤option選項

簡(jian)述linux內(nei)核(he)編譯(yi)步(bu)驟

①進入lichee ./build.sh config //編譯選擇(ze)配(pei)置

②./build.sh 編譯內核和(he)uboot

簡述android源(yuan)(yuan)碼(ma)的編譯步(bu)驟(以fspad-733配套androidL源(yuan)(yuan)碼(ma)為例)進入(ru)androidL

①source build/envsetup.sh 添(tian)加配(pei)置調試(shi)命(ming)令(ling)到shell進(jin)程

②lunch 選擇編譯(yi)的產(chan)品(pin)好(hao)

③extract-bsp 將(jiang)內核生成的bImage和(he)模塊拷貝到androidL/device/softwinner/fspad-733/下

④make -j2 編譯(yi)

androidL ===>生成 system.img(非內(nei)核部分) + ramdisk.img(rootfs) + recovery.img(恢復出(chu)廠鏡像)

lichee ===>生成 uboot.bin + uImage === > bImage

簡單介紹一下Android系統中的HAL,并說出(chu)舊HAL架(jia)構libhardware_legacy和新HAL架(jia)構libhardware的區別

①屏蔽下層硬(ying)件(jian)差異(yi),為上層提供(gong)統一接口

②保護硬件的知(zhi)識產權

③硬(ying)件設備不全都(dou)有linux kernel接口

舊的沒有經過(guo)封裝(zhuang),上(shang)層(ceng)可以直接操走硬件

新(xin)的通過(guo)hal層將硬件(jian)分類,一個(ge)類一個(ge)stub,通過(guo)stub再進行訪問

請介(jie)紹Android系統架構,并簡單說明每層架構的作用

①linux內核 在內核基礎上添加了android特有的驅(qu)(qu)動,binder驅(qu)(qu)動(進程間通訊)

②HAL 屏(ping)蔽下層差異,為上層提供統一接(jie)口(kou)

③核心庫(ku) libs 一些三(san)方庫(ku)和(he)c/c++庫(ku)的提(ti)供,

runtime Dalvik虛擬(ni)機和對應(ying)的(de)運行環境

④app framework 讓應用開發(fa)更為方便

⑤app 一些(xie)與用(yong)戶進(jin)行(xing)交互的程序

android源(yuan)碼樹添加新產品目錄支持(chi),必須有哪幾個文件?

①vendorsetup.sh 添加(jia)產品編譯(yi)的(de)選項

②BoardConfig.mk 硬件(jian)方面(mian)定(ding)制

③AndroidProduct.mk 產(chan)品文(wen)件列表(biao)

④產(chan)品(pin)名.mk 定制軟件系統的配置

上一篇:c語言指針詳解,學霸課堂記錄

下一篇:C++學習總結,學霸課堂筆記

熱點文章推薦
華清學員就業榜(bang)單
高薪學員經(jing)驗分享
熱點新聞推薦
前(qian)臺(tai)專線(xian):010-82525158 企業培(pei)訓(xun)洽談專線(xian):010-82525379 院校合作(zuo)洽(qia)談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,,京公海網安備11010802025203號

回到頂部