當前位置:首頁 » 安卓系統 » android內核調試

android內核調試

發布時間: 2022-05-20 03:16:07

『壹』 如何在安卓系統上使用arm-linux-gdb調試內核

1,先下載最新版本的gdb源代碼包,我使用的是gdb-7.6.tar.gz,使用tar命令進行解包(tar -xvzf gdb-7.6.tar.gz),cd進gdb-7.6/gdb目錄,使用vi找到remote.c中的如下代碼:
if(buf_len > 2 * rsa->sizeof_g_packet)
error(_("Remote 'g' packet reply is too long: %s"),rs->buf);
將上面兩行注釋掉,添加如下代碼
if(buf_len > 2 * rsa->sizeof_g_packet)
{
rsa->sizeof_g_packet = buf_len;
for(i = 0; i < gdbarch_num_regs(gdbarch); i++)
{
if(rsa->regs[i].pnum == -1)
continue;
if(rsa->regs[i].offset >= rsa->sizeof_g_packet)
rsa->regs[i].in_g_packet = 0;
else
rsa->regs[i].in_g_packet = 1;
}
}
使用如下命令對代碼進行配置、編譯和安裝
./configure --target=arm-linux --prefix=/usr/local/arm-gdb -v
make
make install
2,gdbserver使用android4.2模擬器中自帶的版本(v7.1)
3,將NDK編譯好的C/C++可執行程序,上傳到模擬器中/data/test目錄下,假設可執行程序的名稱為testHello。
4,使用命令:gdbserver :7000 /data/test/testHello 啟動模擬器端的調試。
5,啟動arm-linux-gdb之前,使用vi打開~/.bash_profile文件,在其中添加:
export PATH=$PATH:/usr/local/arm-gdb/bin,以便在程序的其他目錄可以直接啟動arm-linux-gdb程序
6,cd至ndk編譯好的testHello文件所在目錄
7,使用如下命令進行埠映射:adb forward tcp:7000 tcp:7000,將模擬器的7000埠和本機的7000埠進行映射
8,使用命令:arm-linux-gdb testHello啟動gdb調試
9,使用target remote :7000 鏈接模擬器中gdbserver啟動的服務。
10,自此,我們就可以使用gdb命令進行代碼調試了。

『貳』 Android對Linux內核有怎樣的改動

我們知道Android是一個開源系統,但是並不徹底,而且Android從多個方面對Linux內核進行了改動與增強,盡管一度和Linux基金會在內核方面鬧得不愉快,但是最終也達成了和解。下面將對此進行詳細介紹和分析。

1 、Goldfish

Android模擬器通過運行一個Goldfish的虛擬CPU.Goldfish來運行arm926t指令集(arm926t屬於armv5構架),並且模擬了輸入/輸出,比如鍵盤輸入和LCD 輸出。這個模擬器其實是在qemu之上開發的,輸入/輸出是基於libSDL的。既然Goldfish是被模擬器運行的虛擬CPU,那麼當Android在真實的硬體設備上運行時,我們就需要去掉它,因此,只有知道Google對Goldfish做了哪些具體改動之後才能正確地去掉。據統計,Android 內核對Goldfish的改動主要涉及44個文件,具體匯總如下。

說明 本書中在被改動的文件前面加了Chg標記,在新增的文件前面加了New標記。

1Chgarch/arm/Makefile添加CONFIG_ARCH_GOLDFISH

2Newarch/arm/configs/goldfish_defconfig默認配置文件

3Newarch/arm/mach-goldfish/Kconfig為Goldfish CPU添加Kernel配置文件

4Newarch/arm/mach-goldfish/Makefile添加board-goldfish.o

5Newarch/arm/mach-goldfish/Makefile.boot為Goldfish CPU進行啟動配置

6Newarch/arm/mach-goldfish/audio.c Audio的輸入/輸出

7Newarch/arm/mach-goldfish/board-goldfish.c中斷請求、輸入/輸出等

8Newarch/arm/mach-goldfish/pdev_bus.c設備匯流排

9Newarch/arm/mach-goldfish/pm.c電源管理

10Newarch/arm/mach-goldfish/switch.cSwitch控制

11Newarch/arm/mach-goldfish/timer.c獲取和設置時間

12Chgarch/arm/mm/Kconfig添加ARCH_GOLDFISH到支持列表

13Chgdrivers/char/Makefile添加goldfish_tty

14Newdrivers/char/goldfish_tty.cTTY驅動

15Chgdrivers/input/keyboard/Kconfig為Goldfish的鍵盤事件添加配置文件

16Chgdrivers/input/keyboard/Makefile添加goldfish_events事件

17Newdrivers/input/keyboard/goldfish_events.cGoldfish鍵盤驅動

18Chgdrivers/mmc/host/Kconfig添加Kernel配置選項Goldfish MMC卡

19Chgdrivers/mmc/host/Makefile添加Goldfish MMC卡驅動

20Newdrivers/mmc/host/goldfish.c多媒體驅動

21Chgdrivers/mtd/devices/Kconfig為Goldfish的NAND flash device添加Kernel配置選項

22Chgdrivers/mtd/devices/Makefile添加goldfish_nand

23Newdrivers/mtd/devices/goldfish_nand.cNAND flash驅動

24Newdrivers/mtd/devices/goldfish_nand_reg.hNAND flash驅動

25Chgdrivers/power/Kconfig為Goldfish的battery(電池)驅動添加kernel配置選項

26Chgdrivers/power/Makefile添加Goldfish電池

27Newdrivers/power/goldfish_battery.c能源和電池狀態驅動

28Chgdrivers/rtc/Kconfig為Goldfish的rtc(時鍾)驅動添加Kernel配置選項

29Chgdrivers/rtc/Makefile添加rtc-goldfish

30Newdrivers/rtc/rtc-goldfish.c實時時鍾驅動

31Chgdrivers/video/Kconfig添加Goldfish的framebuffer

32Chgdrivers/video/Makefile添加Goldfish的framebuffer

33Newdrivers/video/goldfishfb.cframebuffer驅動

34Newinclude/asm-arm/arch-goldfish/dma.h

35Newinclude/asm-arm/arch-goldfish/entry-macro.S

36Newinclude/asm-arm/arch-goldfish/hardware.h

37Newinclude/asm-arm/arch-goldfish/io.h

38Newinclude/asm-arm/arch-goldfish/irqs.h

39Newinclude/asm-arm/arch-goldfish/memory.h

40Newinclude/asm-arm/arch-goldfish/system.h

41Newinclude/asm-arm/arch-goldfish/timer.h

42Newinclude/asm-arm/arch-goldfish/timex.h

43Newinclude/asm-arm/arch-goldfish/uncompress.h

44Newinclude/asm-arm/arch-goldfish/vmalloc.h

2 、YAFFS2

不同於PC機(文件是存儲在硬碟上的),手機使用FLASH作為存儲介質。HTC的G1使用的是NANDFLASH這種存儲目前已經相當普及了,而且種類也頗多(如SLC、MLC等),存儲密度也越來越高(已經出現幾十GB大小的NANDFLASH),價格也越來越低。

YAFFS2是專門用在FLASH上的文件系統,YAFFS2是「Yet Another Flash File System,2nd edition」的縮寫。YAFFS2為Linux內核提供了一個高效訪問NANDFLASH的介面。但是NANDFLASH的支持並不包含在標準的2.6.25內核中,所以Google在其中添加了對NANDFLASH的支持。據統計,為了支持YAFFS2,Google一共改動和增加了以下35個文件:

1Chgfs/Kconfig添加YAFFS配置

2Chg fs/Makefile添加YAFFS

以下為新增的YAFFS2:

1Newfs/yaffs2/Kconfig18Newfs/yaffs2/yaffs_mtddif2.h

2Newfs/yaffs2/Makefile19Newfs/yaffs2/yaffs_nand.c

3Newfs/yaffs2/devextras.h20Newfs/yaffs2/yaffs_nand.h

4Newfs/yaffs2/moleconfig.h21Newfs/yaffs2/yaffs_nandemul2k.h

5Newfs/yaffs2/yaffs_checkptrw.c22Newfs/yaffs2/yaffs_packed1.c

6Newfs/yaffs2/yaffs_checkprtw.h23Newfs/yaffs2/yaffs_packed1.h

7Newfs/yaffs2/yaffs_ecc.c24Newfs/yaffs2/yaffs_packed2.c

8Newfs/yaffs2/yaffs_ecc.h25Newfs/yaffs2/yaffs_packed2.h

9Newfs/yaffs2/yaffs_fs.c26Newfs/yaffs2/yaffs_qsort.c

10Newfs/yaffs2/yaffs_getblockinfo.h27Newfs/yaffs2/yaffs_qsort.h

11Newfs/yaffs2/yaffs_guts.c28Newfs/yaffs2/yaffs_compat.c

12Newfs/yaffs2/yaffs_guts.h29Newfs/yaffs2/yaffs_compat.h

13Newfs/yaffs2/yaffs_mtdif.c30Newfs/yaffs2/yaffs_validitiy.c

14Newfs/yaffs2/yaffs_mtdif.h31Newfs/yaffs2/yaffs_validity.h

15Newfs/yaffs2/yaffs_mtddif1.c32Newfs/yaffs2/yaffsinterface.h

16Newfs/yaffs2/yaffs_mtddif1.h33Newfs/yaffs2/yportenv.h

17Newfs/yaffs2/yaffs_mtddif2.c

3、 藍牙

在藍牙通信協議棧里Google修改了10個文件。這些改動修復了一些與藍牙耳機相關的明顯的Bug,以及一些與藍牙調試和訪問控制相關的函數,具體如下所示。

1Chgdrivers/bluetooth/Kconfig添加HCI UART Debug

2Chgdrivers/bluetooth/hci_II.c如果HCI UART Debug定義在Kernel配置中,則添加BT_DBG()宏

3Chgnet/bluetooth/Kconfig添加配置選項L2CAP, HCI_CORE, HCI_SOCK,以及通用介面和語音

4Chgnet/bluetooth/af_bluetooth.c如果CONFIG_ANDROID_PARANOID_NETWORK被定義,則添加藍牙功能的安全檢查

5Chgnet/bluetooth/hci_event.c修正藍牙的加密Bug和增加語音的支持

6Chgnet/bluetooth/rfcomm/core.c修正Bug

7Chgnet/bluetooth/rfcomm/sock.c修復Bug

8Chgnet/bluetooth/sco.c禁用SCO鏈接

9Chginclude/net/bluetooth/hci_core.h禁用LMP_ESCO

10Chginclude/net/bluetooth/rfcomm.h在rfcomm_dlc中添加「out」參數

4 、調度器(Scheler)

Android內核還修改了與進程調度和時鍾相關的策略。只改動了5個文件,如下:

1Chgkernel/sched.c添加NORMALIZED_SLEEPER

2Chgkernel/sched_fair.c修改內核的調度方式

3Chgkernel/softirq.c修改為CPU調度

4Chgkernel/time/tick-sched.c修改為CPU調度

5Chginclude/linux/tick.h如果CONFIG_NO_HZ被定義,則添加tick_nohz_ update_ stopped_ sched_tick()

5、 Android新增的驅動

Android在Linux的基礎上新增了許多特有的驅動,如下所示。

1)IPC Binder 一種IPC(進程間通信)機制。它的進程能夠為其他進程提供服務通過標準的Linux系統調用API。IPC Binder的概念起源於一家名為Be.Inc的公司,在Google之前就已經被Palm軟體採用了。

2)Low Memory Killer 其實內核里已經有一個類似的功能,名稱為oom killer(out of memory killer)。當內存不夠的時候,該策略會試圖結束一個進程。

3)Ashmem 匿名共享內存。該功能使得進程間能夠共享大塊的內存。比如說,系統可以使用Ashmem保存一些圖標,多個應用程序可以訪問這個共享內存來獲取這些圖標。Ashmem為內核提供了一種回收這些使用完的共享內存塊的方法,如果某個進程試圖訪問這些已經被回收的內存塊,它將會得到錯誤的返回值,以便它重新進行內存塊分配和數據初始化。

4)RAM Console and Log Device 為了調試方便,Android添加了一個功能,使調試信息可以輸入到一個內存塊中。此外,Android還添加了一個獨立的日誌模塊,這樣用戶空間的進程就能夠讀寫日誌消息,以及調試列印信息等。

5)Android Debug Bridge 嵌入式設備的調試的確比較麻煩,為了便於調試,Google設計了這個調試工具,可以簡稱為ADB,使用USB作為連接方式,ADB可以看做是連接Android設備和PC機的一套協議。

除了這些主要的功能之外,Android還增加了諸如 real-time clock、switch、timed GPIO等功能,所有這些改動和增加包含在以下28個文件之中。

1Chgdrivers/Kconfig進入配置文件

2Chgdrivers/Makefile添加switch,驅動等

3Newdrivers/android/Kconfig添加BINDER_IPC、POWER、POWER_STAT、POWER_ ALARM、LOGGER、RAM_CONSOLE、TIMED_GPIO、PARANOID_NETWORK到配置中

4Newdrivers/android/Makefile添加binder.o、power.o、alarm.o、logger.o、ram_console.o、timed_gpio

5Newdrivers/android/alarm.c系統硬體時鍾和實時時鍾管理

6Newdrivers/android/binder.cIPC機制(Binder)

7Newdrivers/android/logger.cGoogle的日誌API

8Newdrivers/android/ram_console.cRAM控制台和日誌設備方便調試 [1]

9Newdrivers/android/timed_gpio.cGoogle的GPIO定時驅動

10Newdrivers/switch/Kconfig為GPIO添加配置選項

11Newdrivers/switch/Makefile引入GPIO驅動

12Newdrivers/switch/switch_class.c

13Newdrivers/switch/switch_gpio.c

14Chgdrivers/usb/gadget/Kconfig添加ADB配置選項

15Chgdrivers/usb/gadget/Makefile編譯ADB所需的配置選項

16Newdrivers/usb/gadget/android_adb.cADB驅動

17Newinclude/linux/android_aid.h添加AIDs、INET、networking

18Newinclude/linux/android_alarm.h時鍾功能設置

19Newinclude/linux/android_timed_gpio.hGPIO結構體

20Newinclude/linux/ashmem.hAndroid共享內存

21Newinclude/linux/binder.hBinder IPC API定義

22Newinclude/linux/logger.hLogger定義

23Newinclude/linux/switch.hGPIO switch介面

24Chgmm/Makefile添加ashmem.o

25Newmm/ashmem.c內存共享實現

26Chgdrivers/misc/Kconfig添加LOW_MEMORY_KILLER配置選項

27Chgdrivers/misc/Makefile添加lowmemorykiller.c

28Newdrivers/misc/lowmemorykiller.c當內存過低時,選擇並結束進程

6 、電源管理

電源管理(Power Management)對於移動設備來說相當重要,也是最為復雜和開發難度最高的一個功能。Google添加了一個新的電源管理系統,不包含原有的apm和dpm等。這項改動主要涉及以下5個文件:

1Newinclude/linux/android_power.h定義電源管理API

2Newdrivers/android/power.c電源管理API實現

3Chgdrivers/input/evdev.c修改Android電源處理方式

4Chgfs/inotify_user.c修改Android電源處理方式

5Chgkernel/power/process.c修改Android電源處理方式

7、 雜項
除了上述改動之外,還有一些小改動,如新增的額外調試功能、鍵盤背光控制、TCP 網路管理等,共涉及36個文件,詳見參考資料。

為了調試方便,Android 添加了一個功能,使得調試信息可以輸入到一個內存塊中。此外, Android 添加了一個獨立的日誌模塊,這樣用戶空間的進程能夠讀寫日誌消息,調試列印信息等。

『叄』 android手機無法開機的情況下如何查看內核調試信息。

· 首先要在電腦上安裝配置Android SDK
由於刷機失敗或者其他原因導致的手機無法開機,此時就需要藉助Android SDK工具,所以你必須在操作的電腦上下載並安裝Android SDK程序。
程序的下載地址和具體的安裝配置方法請參照下面的地址:http://digi.tech.qq.com/a/20101203/000896.htm
· 然後我們需要安裝Android手機USB驅動程

裝完Android
SDK後就可以把手機通過USB線纜連接至電腦,開啟手機電源後電腦會提示安裝設備驅動程序,不要讓系統自動查找驅動程序安裝,選擇自定義驅動程序位置,
因為已經安裝了Android SDK,驅動程序的位置默認為Android
SDK的安裝目錄下的usb_driver子目錄,選擇從這個目錄安裝驅動程序。如果之前安裝過了驅動,手機可以和電腦連接的,就跳過這步吧。
· 接著下載一個對應你的機型可用的Recovery程序
Android手機能否復活的關鍵就是Recovery程序,因為只要還能進入recovery恢復模式,就意味著你可以再次通過
recovery刷寫新的ROM,也就相當於是給電腦重新安裝操作系統,這樣就能重新進入系統了,也就以為著我們可以再次進入手機操作界面了。
Android平台有很多可用的recovery程序,不同的機型也都使用著不同的recovery,一定要根據自己的手機型號來尋找,針對不同手機
型號有不同版本的程序,下載時注意和手機型號匹配這樣才能保證安全可靠。把下載的recovery程序放在某一目錄備用,例如
:c:\recovery.img
· 下面要重新手機安裝recovery程序(重要步驟)
在電腦上打開命令提示符(在Windows系統中選擇──開始──運行──輸入cmd,然後按回車)
輸入 #adb devices 回車,如果會顯示出一串序列號說明手機已經正常連接電腦了。在命令提示符使用cd命令切換到recovery程序所在的目錄。然後輸入下面的命令:
#adb reboot bootloader
回車後手機應該會進入fastboot模式,然後再輸入執行下面的命令把recovery程序安裝到手機上
#fastboot flash recovery.img
回車後如果看到命令行中有下面的提示就說明recovery程序已經成功安裝。
fastboot flash recovery recovery.img
sending 『recovery』 (4612 KB)… OKAY
writing 『recovery』… OKAY

成後拔掉手機USB連接線,關機,重新按進入recovery模式的組合鍵,看看是否可以重新進入recovery模式了,如果可以進入recovery
了,這就說明你的手機已經成功復活了,現在可以重新刷機,給手機再安裝一個操作系統了。安裝完成就能重新進入手機系統正常使用了。不
過上面的這個方法只適用與普通變磚的手機,手機刷機變磚的情況也有很多,不同的情況也會導致不同的結果,如果經過多次測試,上面的辦法都無法修復,那就只
好找專業人士幫忙檢修了。雖然刷機的風險很小,但還是建議大家刷機有風險,操作需謹慎。其實選擇一個合適的,穩定的,好用的系統一般就不用折騰了,只要官
方沒說有升級,自己就無需過多的去刷寫其他系統

這個是個方法,可以進入手機,希望對你有用

『肆』 如何編譯Android內核Hook系統調用

如何能實現在第一次調用這個Makefile執行一部分代碼,第二次時執行另一部分呢?很容易想到的就是條件執行了。條件語句就應該有一個條件,就選由於內核頂層目錄下的linux-3.7/Makefile中有很多變數,就可以用它們來區分,就好比一個ARCH,KERNELRELEASE,GCC,就可以來指定地只調用obj-m:=hello.o了。

『伍』 android驅動開發好了,怎麼調試

本文用《Android深度探索(卷1):HAL與驅動開發》的隨書源代碼為例詳細說明如何配置Android驅動開發和測試環境,並且如何使用源代碼中的build.sh腳本文件在各種平台(Ubuntu Linux、Android模擬器和S3C6410開發板)上編譯、安裝和測試Linux驅動。建議讀者使用Ubuntu Linux12.04或更高版本實驗本文的方法。最好用root賬號登錄Linux。
一、安裝交叉編譯器
如果只是在Ubuntu Linux上測試Linux驅動就不需要安裝交叉編譯器了,但要在Android模擬器或S3C6410開發板上進行測試,就必須安裝交叉編譯器。
首先下載交叉編譯器(分卷壓縮

下載後解壓,會發現有兩個tgz文件,可以將這兩個文件放到/root/compilers目錄中,在Linux終端進入該目錄,執行如下命令安裝交叉編譯器。
[plain] view plain
# tar zxvf arm-linux-gcc-4.3.2.tgz -C /
# tar jxvf arm-none-linux-gnueabi-arm-2008q3-72-for-linux.tar.bz2 -C /
二、編譯和測試Linux內核
這里的Linux內核有兩個,一個是goldfish,也就是Android模擬器使用的Linux內核、另外一個是S3C6410開發板使用的Linux內核(Linux2.6.36)。讀者首先要下載這兩個Linux內核。

Android模擬器用的Linux內核源代碼(分卷壓縮)

用於S3C6410開發板的Linux內核源代碼(分卷壓縮)
分卷1
分卷2

由於隨書代碼中的word_count驅動已經在goldfish和linux2.6.36中分別建立了符號鏈接,以便在編譯linux內核時同時也會編譯word_count驅動,所以linux內核與源代碼目錄應與作者機器上的目錄相同。也就是兩個linux內核目錄與源代碼目錄如下:
linux內核目錄
/root/kernel/goldfish
/root/kernel/linux_kernel_2.6.36
源代碼目錄
/root/drivers
注意/root/drivers目錄下就直接是每一章的源代碼了,例如/root/drivers/ch06、/root/drivers/ch07
現在需要將/usr/local/arm/arm-none-linux-gnueabi/bin路徑加到Linux的PATH環境變數中(不會加的上網查,這是Linux的基本功)
最後進入/root/compilers/goldfish目錄,執行make命令編譯linux內核,如果完全編譯,大概20分鍾左右。編譯完成後,會在/root/kernel/goldfish/arch/arm/boot目錄中生成一個zImage文件,代碼1.7MB,這就是用於Android模擬器的Linux內核文件。
三、編譯Linux驅動
現在來編譯隨書光碟的驅動程序,這里以word_count驅動為例。在Linux終端進入/root/drivers/ch06/word_count目錄。先別忙著編譯。首先要設置打開/root/drivers/common.sh文件,修改第一行UBUNTU_KERNEL_PATH變數值為自己機器上安裝的Ubuntu Linux內核路徑,只要執行「ls /usr/src」命令即可查看當前機器可用的linux內核。如可以設置下面的路徑。
UBUNTU_KERNEL_PATH=/usr/src/linux-headers-3.2.0-23-generic
剩下的兩個(S3C6410_KERNEL_PATH和/root/kernel/goldfish)只要按著前面的路徑解壓Linux內核源代碼,就不用設置了。
在word_count目錄中執行「source build.sh」命令,會允許選擇在哪個平台上編譯驅動,直接按回車會在Ubuntu Linux上編譯。如果編譯成功,會發現當前目錄多一個word_count.ko文件(驅動文件)。
現在來編譯S3C6410上運行的word_count驅動。先別忙,在編譯之前,需要Android中的adb命令。因為build.sh足夠只能,在編譯完後,如果有多個Android設備連接到PC,會允許用戶選擇上傳到哪個設備裝載,這里需要選擇S3C6410開發板,然後會直接上傳到開發板上,如圖1所示。
可以直接使用adb shell命令進入開發板,也可以使用/root/drivers/shell.sh腳本完成同樣的工作,只是後者如果有多個android設備,會允許用選擇,而不是輸入相應的設備ID。使操作更方便。在/root/drivers目錄中提供了很多這樣的腳本(shell.sh、push.sh、pull.sh等),這些腳本都會允許用戶選擇操作的Android設備。
我們通常使用Android SDK中的adb命令,到官方網站下載裝載linux版本的Android SDK,然後將<AndroidSDK根目錄> /platform-tools加到PATH環境變數中。
現在再次執行「source build.sh」命令,選擇第2項(S3C6410開發板),如果系統沒找到開發板,需要將USB線拔下重插一下。然後就可以進入開發板的終端,輸入lsmod命令查看驅動的安裝情況了。
如果在模擬器上測試,選第3項。具體測試的方法請參見書中相應的章節。
四、測試Linux驅動
測試word_count驅動的方法很多,通過命令行測試的方法請參見書中相應的章節,在word_count目錄中有一個test_word_count程序,通過執行如下的命令可以測試word_count驅動,編譯test_word_count.c程序的方法書中已詳細描述。
test_word_count 「abc bb cc」
上面的命令會輸出單詞數為3。
如果要編譯Android HAL,需要Android源代碼。購買S3C6410開發板時商家通常會帶一些光碟,裡面有用於開發板的Android源代碼,如果商家沒給光碟,別忘了要哦!

『陸』 Linux內核怎樣啟動Android

那麼Linux內核和Android什麼關系?Linux內核是怎樣引導起Android呢?本文進行簡單的描述。 Android雖然建立在Linux內核之上,但是他對內核進行了一些擴展,增加了一些驅動。比如Binder,loger等等驅動。可以拿Android內核代碼和其Baseline版本進行對比。可以看到Android對Linux內核的所有擴展。 熟悉Linux啟動的朋友知道,首先Linux引導完成之後,會啟動用戶態的init進程(pid為0),這個進程在整個系統運行過程中起著非常重要的作用,如果你對init進程不了解請查相關資料。init完成系統的初始化工作,然後進入shell,接收用戶的輸入。 Android啟動也沒有什麼神秘的,就是用自己的init進程替換了Linux內核的init進程,完成自己初始化工作(設備,文件系統等等初始化)。然後啟動自己的虛擬機,程序等等的東西。Android的init進程的代碼位於system/core/init/init.c下面,可以去查看其源碼,來了解Android啟動詳細流程。Android啟動流程的資料網上已經比較多,這里就不贅述了。 可以看到移植Android過程中,調試init非常重要。因為所有和硬體平台相關的東西都這里初始化,所以init進程有可能需要移植或者配置。其他的進程都是和硬體無關的,理論上不需要修改就應該能夠運行起來。 經過上面的描述可以看出,Android的init進程起著一個承上啟下的作用。

『柒』 關於android和x86的幾點疑問。 android基因linux內核,系統除了內核還有其他什麼

android 除了基於 Linux 內核,他的上層運行環境和相關函數庫,命令程序都是自己的。
其實 android 就是一個基於 Linux 內核的 java 虛擬機環境。
實際 Android 程序都是基於 JAVA 虛擬機跑的解釋型語言程序。

但解釋型語言程序性能肯定不如本地二進製程序。所以 Android 還有一種 NDK 程序。
也就是 Android 裡面有部分本地二進製程序的內容。這樣本地程序方式運行,效率可以最高而且可以根據 CPU 功能做優化(比如 neon )。

指令集不同,但他的 JAVA 虛擬機是解釋型語言,基於 JAVA 語言的程序是可以無差別運行的。只要能保證 Android 上面的 JAVA 虛擬機可以在 x86 上面成功運行就行了。

但 Android 有個另外的問題,就是 JAVA 虛擬機是針對 ARM 做性能優化的,在 X86 上面,這種性能優化都沒了,需要另外在 x86 上面重新優化。但聽說 Android 的 JAVA 虛擬機的語言裡面,也有針對 ARM 硬體進行的修改設計,所以這種針對 ARM 性能優化的 JAVA 程序,在 X86 的系統上面性能也有損失。

所以 Android 出來很久後,在 x86 上面的運行效率都一直不怎麼樣。

而且現在還有 NDK 程序的出現, ARM 的二進製程序在 x86 上面是不能運行的。這些程序都不能運行。
不過 x86 有個優勢就是自己的性能很強,而且模擬器技術現在也很強了。在 x86 上面,可以藉助虛擬機(qemu 的 user mode 就值得看看)來運行 ARM 的二進製程序。
不過虛擬機其實還是有性能損失的。

所以未來,Android 的跨 CPU 架構依然還是問題。純 JAVA 程序好說,用了 NDK 的程序就是問題了。

不過 llvm 這個編譯器又給了另外一條路,既可以虛擬機方式運行,又可以編譯成本地程序而成為二進製程序來優化性能運行。或許 Android 會考慮使用這種方法或者類似的讓 NDK 程序可以跨 CPU 實現。代價是 Android 要自帶一個編譯器,體積也不小的。

MAC OS X 還有一種方法。在 MAC 放棄 IBM 的 Power CPU 而改用 Intel 的 CPU 後,他的程序都是裡面附帶兩套二進製程序,老的 G4 CPU 的機器,就用程序裡面的 power 指令集的程序代碼。新的 Intel CPU 的機器,就自動用裡面的 x86 指令來運行程序。從而實現完美的雙指令集運行。不過代價是這樣的程序都是兩套指令集的內容,體積翻倍。

目前來說,似乎用了 NDK 的程序還都不能用的。不排除現在某些 x86 的手機,使用了虛擬機技術來實現運行 NDK 程序。現在 Linux 下面的 qemu 的 usermode 配合內核的 binfmt_misc 功能,可以讓系統自動識別某個架構的程序,去調用 qemu 來執行。

『捌』 請問,android5.0 代碼基礎上 怎麼編譯出ContentShell apk(用於chromium內核的調試程序)

你可以使用自己的內核而不是發行版的內核, 另外也介紹了如何給內核打補丁, 從而方便增加新的功能.下面的工作我都在Ubuntu 6.10 Server ("Edgy Eft")和Ubuntu 6.06 Desktop ("Dapper Drake")上經過了測試.
我想首先要說的是文章中構建自定義內核的方式不是唯一的, 還有許多其它的方式, 這不過是我習慣的方式. 我不能保證使用後不會出現任何問題.
參考地址:http://linux.chinaunix.net/techdoc/system/2007/08/26/966343.shtml

『玖』 如何將android linux燒到Raspberry Pi及其調試

一.Raspberry Pi入門向導。
首先下載Raspberry向導

二.准備工作
在進行以下步驟之前,需要先安裝essential 工具包:
sudo apt-get install git-core gnupg flex bison gperf
build-essential zip curl zlib1g-dev gcc-multilib g++-multilib
libc6-dev-i386 lib32ncurses5-dev ia32-libs x11proto-core-dev
libx11-dev lib32z-dev uboot-mkimage

三.怎樣為Raspberry Pi構建android內核?

1.下載源代碼
從ssh://<username>@elastos.org:29418/RaspberryPi/AndroidLinux.git下載源代碼到<your_AndroidLinux_path>
此源代碼來自https://github.com/Mathijsz/razdroid-kernel。
git clone ssh://<username>@elastos.org:29418/RaspberryPi/AndroidLinux.git kernel

2.下載ARM工具鏈
從ssh://<username>@elastos.org:29418/RaspberryPi/tools.git下載工具鏈
git clone ssh://<username>@elastos.org:29418/RaspberryPi/tools.git

3.編譯內核
復制內核到config文件里
cd <your_AndroidLinux_path>
cp -v kernel.14.img.config .config
make -j8 ARCH=arm CROSS_COMPILE=$PWD/../tools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm2708hardfp-linux-gnueabi-

四.如何為Raspberry Pi構建android framework?

1.下載源代碼
從ssh://<username>@elastos.org:29418/RaspberryPi/android4.git下載源代碼到<your_android_path>
git clone ssh://<username>@elastos.org:29418/RaspberryPi/android4.git

2.構建android framework
命令如下:
cd <your_android_path>
source build/envsetup.sh
lunch

顯示lunch菜單如下:
You』re building on Linux

Lunch menu… pick a combo:
1. full-eng
2. full_x86-eng
3. simulator
4. full_rpi-eng
5. cyanogen_generic-eng
6. cyanogen_rpi-eng
選擇第6個菜單。
然後進行編譯
make -j8
等待編譯成功,這可能需要幾十分鍾。

編譯成功之後將」system」目錄復制到root目錄下,接下來我們可能會用到。
命令如下:
cd <your_android_path>
cp -r system out/target/proct/rpi/root

ps:編譯時如果jdk版本不對,可將其改成jdk1.6

五.如何在Raspberry Pi上跑android linux內核?

1.准備一張存儲空間2G以上的SD卡及相應讀卡器。

2.下載arch linux鏡像文件
用wget工具下載鏡像文件:
wget http://files.velocix.com/c1410/images/archlinuxarm/archlinux-hf-2012-09-18/archlinux-hf-2012-09-18.zip
解壓:
unzip archlinux-hf-2012-09-18.zip
成功之後,你會在當前目錄下發現一個鏡像文件。

3.燒linux鏡像文件。
sudo dd bs=4M if=archlinux-hf-2012-09-18.img of=/dev/sdb
sudo sync
ps:/dev/sdb是SD卡在主機上的設備文件。不同的電腦可能不同。

4.用android linux內核代替這個內核。
做完上述步驟之後,當你把SD卡插在電腦上,你會發現有兩個分區:一個是引導區,另一個是文件系統區。
用android linux內核代替引導區的kernel.img。
cp -uv <your_android_linux_path>/arch/arm/boot/zImage <your_sdcard_boot_partition>/kernel.img

5.用android linux文件系統代替這個linux文件系統
rm -rf <your_sdcard_file_system_partition>
cp -r <your_android_source_code_path>/out/target/proct/rpi/root/* <your_sdcard_file_system_partition>

6.配置內核命令行cmdline.txt
Edit the <your_sdcard_boot_partition>/cmdling.txt, and replace 「init=/…」 with 「init=/init」

7.做完這些之後就可以在Raspberry Pi上跑這個android linux內核。

六.如何為Android linux做一張可引導的SD卡

1.刪除已有分區,如果沒有就不用刪了。
Command(m for help):p

Disk /dev/sdb: 15.7 GB, 15707668480 bytes
64 heads, 32 sectors/track, 14980 cylinders, total 30668085 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0×00000000

sudo fdisk/dev/sdb

Command(m for help):d
Partition number(1-4):1

Command(m for help):d
Selected partition 2

Command (m for help): p

Disk /dev/sdb: 15.7 GB, 15707668480 bytes
64 heads, 32 sectors/track, 14980 cylinders, total 30679040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0×00000000
Device Boot Start End Blocks Id System

Command(m for help):w
ps:確定刪除之後,卸掉SD卡,然後再裝上。

以bytes問單位記下SD卡的大小。後面的步驟會用到。
然後進入」Expert mode」。

Command(m for help):x

將這個SD卡設置為255個磁面,63個扇區和磁柱數量(不同的SD/mmc卡有著不同的此柱數量)
Expert command (m for help): h
Number of heads (1-256, default 64): 255

Expert command (m for help): s
Number of sectors (1-63, default 32): 63

ps:在下一步開始前,先要計算磁柱數量,計算過程如下:
B:SD卡以bytes為單位的大小(前面已經記住了即:15707668480)
C:磁柱的數量
C=B/255/63/512

例如:我的SD卡大小是16G(15707668480)
C=15707668480/255/63/512=1909.68191721,約等於1909.

Expert command (m for help): c
Number of cylinders (1-1048576, default 14980): 1909
Expert command (m for help): r

2.新建分區
如果你的SD卡已經分區,請按照上述步驟刪除分區。接下來,我們將創建兩個分區,一個是引導區,用來存放內核鏡像等文件;另一個文件系統區存放android linux文件系統。

Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
Partition number (1-4, default 1):
Using default value 1
First sector (2048-30679039, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-30679039, default 30679039): +128M
Command (m for help): t
Selected partition 1
Hex code (type L to list codes): c
Changed system type of partition 1 to c (W95 FAT32 (LBA))
Command (m for help): a
Partition number (1-4): 1
Command (m for help): n
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p): p
Partition number (1-4, default 2):
Using default value 2
First sector (264192-30679039, default 264192):
Using default value 264192
Last sector, +sectors or +size{K,M,G} (264192-30679039, default 30679039):
Using default value 30679039
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: If you have created or modified any DOS 6.x
partitions, please see the fdisk manual page for additional
information.
Syncing disks.

ok,分區成功,現在我們有兩個分區,接下我們對分區進行格式化。

3.格式化分區
對引導區進行格式化:

sudo mkfs.msdos -F 32 /dev/sdb1 -n BOOT
mkfs.msdos 3.0.12 (29 Oct 2011)

對文件系統區進行格式化:
sudo mkfs.ext3 /dev/sdb2 -L ROOTFS
mke2fs 1.42 (29-Nov-2011)
Filesystem label=ROOTFS
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
950976 inodes, 3801856 blocks
190092 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=3896508416
117 block groups
32768 blocks per group, 32768 fragments per group
8128 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

4.設置引導區
引導區必須包含以下文件,你可以從官方鏡像里獲取(bootable/fat32 partition)也可以從書面步驟中復制過來:
bootcode.bin:第二階段的引導程序,
loader.bin:第三階段的引導程序,
start.elf:GPU二進制固件映像,
kernel.img操作系統的內核鏡像文件,
cmdline.txt:傳遞給內核的參數.

5.設置root文件系統分區
ROOTFS分區包含android文件系統,是從<your_android_framework_path>/out/target/proct/rpi/root復制過來的。
cp -r <your_android_framework_path>/out/target/proct/rpi/root/* /media/ROOTFS/

6.完成上述步驟之後,將其放在Raspberry Pi上跑。

七.如何在Raspberry Pi使用adb?

1.查看網路
當android linux在Raspberry Pi運行時,切換到控制台,執行以下命令:
ifconfig eth0
記下ip地址。
如果不能找到ip,可以輸入以下命令:/system/xbin/dhcp-eth0,來啟動網路連接程序。
ps:如果屏幕沒有顯示控制台,只要按CTRL+ALT+F2即可切換到控制台。如果你想要切換到Android界面,只要按CTRL+ALT+F7即可。

2.遠程連接adb伺服器
在主機上執行以下命令即可與同一區域網的Raspberry Pi相連
adb connect ip
連接成功後,你就可以用adb工具輸出日誌,執行shell命令等。

3.也可以用數據線連接主機,直接在主機上調試。
進入調試的命令為:
screen /dev/ttyUSB0 115200

『拾』 有關Android內核 的問題

從左到右解釋了APK運行的環境。
左邊三個框表示了系統的啟動。
左三是android system的開始。
左四Dalvik VM代表了java的運行機的,所有的上層跑在運行機之上。

熱點內容
王者什麼東西需要二級密碼 發布:2024-05-03 03:26:11 瀏覽:766
網頁界面升級訪問 發布:2024-05-03 03:26:06 瀏覽:210
安卓區怎麼更改充電提示音 發布:2024-05-03 03:23:56 瀏覽:48
遺傳演算法圖像分割 發布:2024-05-03 03:16:27 瀏覽:801
外圓圓弧怎麼編程 發布:2024-05-03 03:13:59 瀏覽:213
如何在conda中安裝需要編譯的軟體 發布:2024-05-03 02:41:21 瀏覽:780
易語言垃圾清理源碼 發布:2024-05-03 02:40:34 瀏覽:182
滴滴蘋果安卓哪個派單量好 發布:2024-05-03 02:22:52 瀏覽:289
lua編程pdf 發布:2024-05-03 01:39:26 瀏覽:24
臍帶血存儲的三大忌 發布:2024-05-03 01:32:38 瀏覽:934