RK3399 Android 6.0 Manual
目錄
- 1 android開發平台的搭建
- 2 Android開發工具
- 3 安裝android源碼包
- 4 android腳本分析配置
- 5 編譯android源碼包
- 6 燒寫android映像文件
- 7 android開發指南
- 8 Android測試程序
- 9 android內核驅動
- 10 android開發項目實戰
- 10.1 實戰1:創建hello x3399工程
- 10.2 實戰2:在x3399開發板上運行hello x3399測試程序
- 10.3 實戰3:從零開始編寫LED測試程序
- 10.4 實戰4:建立第一個APK應用程式,通過JNI+NDK調用底層驅動
- 10.5 實戰5:修改VGA解像度
- 10.6 實戰6:如何修改init.rc文件
- 10.7 實戰7:如何修改開機動畫
- 10.8 實戰8:如何修改uboot中的開機LOGO
- 10.9 實戰9:如何修改內核中的LOGO
- 10.10 實戰11:使用git管理原始碼
- 10.11 實戰13:如何打包整個android bsp包
- 10.12 實戰15:android調試技巧之mm指令
- 10.13 實戰16:ubuntu下minicom的設置
android開發平台的搭建
Android自從升級到4.0以來,相比之前的版本工程更加龐大,編譯整套源碼對PC機硬件要求很高,因此不建議採用虛擬機編譯,強烈建議直接安裝Linux操作系統,充分發揮PC機的性能。我們這裏以ubuntu14.04 64位系統機器為例講解,如果您是新手,建議與我們版本保持一致。
使用U盤安裝ubuntu
使用U盤安裝ubuntu系統簡單快捷,強烈推薦使用此方法安裝。
安裝工具:
- 2G以上U盤一個
- lili usb creater 軟件,下載地址:http://www.linuxliveusb.com/
- ubuntu最新系統,下載地址:http://www.ubuntu.com/download/
- PC機一台
安裝方法:
第一步:下載好ubuntu的ISO文件,和lili usb creater這個軟件並安裝。
第二步:插入usb,並打開usb creater 這個軟件,根據軟件提示設置,在步驟1中選擇安裝盤,找到識別出的U盤;在步驟2中找到下載的ubuntu映像文件;步驟3默認,步驟4中選中隱藏優盤上創建的文件,使用FAT32格式化U盤;最後在步驟5中點擊閃電圖標開始安裝,直到提示優盤已安裝完成為止。
第三步:重啟電腦,開機時,看清螢幕下方的提示,進入BIOS設置菜單,選擇U盤啟動。一般台式機是按DEL鍵,筆記本有些是按F2,有些按F10進入。設置完成後保存退出。
第四步:再次重啟系統,這時已經可以看到ubuntu的安裝界面了,選擇中文,繼續;
第五步:選擇 install (您也可以選擇live mode 可以體驗下系統),繼續;
第六步:也選擇中文,點擊繼續:再繼續;
第七步:配置網絡,可以安裝時升級,也可以不升級,等安裝完系統後再手動升級;
第八步:第一個選項是把以前的系統升級到ubuntu14.04,如果你只要單系統的可以選擇第一項,第二項是升級到ubuntu14.04並把其他的資料刪除掉,第三項是我們用的最多的,比較靈活,選something else,繼續,在這裏我分出了兩個區給ubuntu,一個 / 和 一個 /home ,分區可以新建,可以對它格式化,具體根據需要選擇;
第九步:這是設置區域,選擇上海就行了;
第十步:選擇鍵盤佈局。選中國;
第十一步:選擇用戶名和密碼,到此配置完畢,點擊繼續直接安裝,喝一會兒咖啡,待安裝完畢,重啟之後,就可以看到美麗的ubuntu世界了。
設置XP為開機默認啟動
ubuntu安裝後每次開機都是默認進入ubuntu系統的,對於以windows為主的朋友,每次開機都要守在畫面切換到XP啟動,可見十分麻煩,通過下面,你可以設置讓你的XP系統為第一啟動。
修改/boot/grub/grub.cfg文件,可以看到最末尾有如下語句:
<nowiki> menuentry "Microsoft Windows XP Professional (on /dev/sda1)" { insmod part_msdos insmod ntfs set root='(hd0,msdos1)' search --no-floppy --fs-uuid --set 0E48A65048A6367D drivemap -s (hd0) ${root} chainloader +1 } ### END /etc/grub.d/30_os-prober ### <nowiki>
仔細閱讀該文件,發現有不少menuentry,這些正是對應了開機啟動時的選擇項,將上面語句放在第一個menuentry的前面,這樣Windows XP就為默認的啟動系統了。修改後的部分代碼如下:
### BEGIN /etc/grub.d/05_debian_theme ### set menu_color_normal=white/black set menu_color_highlight=black/light-gray ### END /etc/grub.d/05_debian_theme ### ### BEGIN /etc/grub.d/30_os-prober ### menuentry "Microsoft Windows XP Professional (on /dev/sda1)" { insmod part_msdos insmod ntfs set root='(hd0,msdos1)' search --no-floppy --fs-uuid --set 0E48A65048A6367D drivemap -s (hd0) ${root} chainloader +1 } ### END /etc/grub.d/30_os-prober ### ### BEGIN /etc/grub.d/10_linux ### menuentry 'Ubuntu, with Linux 2.6.35-30-generic' --class ubuntu --class gnu-linux --class gnu --class os { recordfail insmod part_msdos insmod ext2 set root='(hd0,msdos9)' search --no-floppy --fs-uuid --set 4833f619-6388-4dd3-acd7-6fa3eacb9a15 linux /boot/vmlinuz-2.6.35-30-generic root=UUID=4833f619-6388-4dd3-acd7-6fa3eacb9a15 ro quiet splash initrd /boot/initrd.img-2.6.35-30-generic }
ubuntu下磁盤格式化
在做開發時,經常會把SD卡格式化為msdos,ext3等格式。這時,放在windows下將無法格式化,只能藉助於Linux。
在Linux下使用fdisk和mkfs兩個工具實現SD卡的格式化。首先,使用fdisk指令刪除裏面的所有分區,步驟為:
fdisk /dev/sdb d w
每輸一次d,輸入一次分區的序號,直到刪完,再按w寫入,完成分區的刪除。再按n,回車,回車,新建一個分區。之後再使用mkfs工具格式化為指定格式的盤,如格式化為fat32格式,則執行如下指令:
mkfs –t vfat /dev/sdb
Ubuntu下通過SSH遠程登錄服務器
第一步:在服務器上安裝ssh的服務器端。
apt-get install openssh-server
第二步:啟動ssh-server。
service ssh restart
第三步:確認ssh-server已經正常工作。
netstat -tlp
有如下打印信息:
tcp 0 0 *:ssh *:* LISTEN -
看到上面這一行輸出說明ssh-server已經在運行了。
第四步:在Ubuntu客戶端通過ssh登錄服務器。假設服務器的IP位址是172.18.0.198,登錄的用戶名是liuqiming。
$ ssh -l liuqiming 172.18.0.198
接下來會提示輸入密碼,然後就能成功登錄到服務器上了。可以通過資源管理器瀏覽的方式登錄服務器,點擊位置->連接到服務器,服務器類型選擇ssh,服務器一欄填入服務器的IP位址,點擊連接即可。
ubuntu下使用郵箱
ubuntu下默認就有郵箱軟件,如在使用時發現無法接受或發送郵件,在發送電子郵件->身份驗證點擊檢查的類型,再選擇沒有劃斜線的就好了。
ubuntu下安裝五筆
使用如下指令:
sudo apt-get install ibus-tables-wubi
然後在系統->首選項->鍵盤輸入法的輸入法中選擇WUBI,添加進去即可。
ubuntu下安裝chrome瀏覽器
ubuntu10.10默認安裝的火狐瀏覽器,如果用戶喜歡該瀏覽器,可以跳過此節。google出了基於linux的瀏覽器chrome,用戶可以使用如下方式安裝。在網上下載安裝源文件,http://tools.google.com/chrome/,也可以從光盤中獲得,雙擊即可安裝。
ubuntu下安裝VIM
使用如下命令安裝即可:
sudo apt-get install vim
ubuntu打開WINDOWS下記事本亂碼問題
出現這種情況的原因是,gedit 使用一個編碼匹配列表,只有在這個列表中的編碼才會進行匹配,不在這個列表中的編碼將顯示為亂碼。您要做的就是將 GB18030 加入這個匹配列表。
您可以遵循以下步驟,使您的gedit正確顯示中文編碼文件。
1. 終端中鍵入「gconf-editor」,並按下回車鍵,打開「配置編輯器」。
2. 展開左邊的樹節點,找到 /apps/gedit-2/preferences/encodings 節點並單擊它。
3. 雙擊右邊的 auto_detected 鍵,打開「編輯鍵」對話框。
4. 單擊列表右邊的「添加」按鈕,輸入「GB18030」,單擊確定按鈕。
5. 列表的最底部新增加了一個「GB18030」。單擊右邊的向上,將「GB18030」放在第二位;
6. 單擊確定按鈕,關閉配置編輯器。
現在,gedit 應該能夠順利打開 GB18030 編碼的文本文件了。如果不放心,可以再增加GBK、GB2312編碼。
ubuntu下安裝源碼比較工具
ubuntu下源碼比較工具很多,比較常見的是meld工具,使用如下指令安裝:
sudo apt-get install meld
安裝完成後,可以在應用程式->編程中打開。
ubuntu下安裝串口終端minicom
使用如下指令安裝:
sudo apt-get install minicom
安裝完成後,需要設置minicom。如果直接使用串口,通常設置為ttyS0,如果使用USB轉串口,通常設置為ttyUSB0。輸入如下指令:
sudo minicom -s
選擇Serial port setup,選擇A,輸入正確的串口終端,選擇E,輸入115200 8N1,選擇F和G,都設置為No,不使用流控,再回車,選擇Save setup as dfl。注意,只有root用戶才有權限保存參數。筆記本用戶通常使用的USB轉串口延長線,目前市面上大多都是pl2303方案,插上USB轉串口延長線後,輸入如下命令查詢驅動是否正常加載:
lsmod |grep pl2303
正常加載時會提示如下信息:
lqm@lqm:~$ lsmod |grep pl2303 pl2303 11756 1 usbserial 33100 3 pl2303
再使用如下命令查詢系統的一些信息:
dmesg | tail -f
正常情況下會出現如下提示:
lqm@lqm:~$ dmesg |tail -f <nowiki>[ 383.093851] ERROR! H2M_MAILBOX still hold by MCU. command fail [ 383.148849] ---> RTMPFreeTxRxRingMemory [ 383.148903] <--- RTMPFreeTxRxRingMemory [ 383.180580] RTUSB disconnect successfully [ 387.762330] usb 2-4: USB disconnect, address 3 [ 387.762566] pl2303 ttyUSB0: pl2303 converter now disconnected from ttyUSB0 [ 387.762601] pl2303 2-4:1.0: device disconnected [ 392.164589] usb 2-4: new full speed USB device using ohci_hcd and address 5 [ 392.379898] pl2303 2-4:1.0: pl2303 converter detected [ 392.412998] usb 2-4: pl2303 converter now attached to ttyUSB0</nowiki>
表示串口設備名稱為ttyUSB0。有時會提示如下錯誤:
lqm@lqm:~$ dmesg | tail -f <nowiki>[ 408.910351] 0x1300 = 00073200 [ 413.945752] ===>rt_ioctl_giwscan. 8(8) BSS returned, data->length = 1177 [ 419.047006] ===>rt_ioctl_giwscan. 7(7) BSS returned, data->length = 1067 [ 419.047302] ==>rt_ioctl_siwfreq::SIOCSIWFREQ[cmd=0x8b04] (Channel=1) [ 419.392535] wlan0: no IPv6 routers present [ 433.902136] ===>rt_ioctl_giwscan. 6(6) BSS returned, data->length = 960 [ 473.902907] ===>rt_ioctl_giwscan. 8(8) BSS returned, data->length = 1271 [ 533.900777] ===>rt_ioctl_giwscan. 8(8) BSS returned, data->length = 1200 [ 613.904091] ===>rt_ioctl_giwscan. 9(9) BSS returned, data->length = 1435 [ 713.904199] ===>rt_ioctl_giwscan. 8(8) BSS returned, data->length = 1263</nowiki>
一般情況下重插撥一次USB轉串口線即可。
ubuntu卡死的解決辦法
ubuntu系統有時也會像windows系統一樣,卡死不動。這時除了復位系統,我們也可以嘗試如下方法:
一:按住ctrl+alt+F2進入tty2;
二:查看進程:
ps -e
三:kill掉相關進程
四:再按住alt+F7返回圖形界面
Android開發工具
代碼編輯工具
在windows下開發時,很多人都習慣使用source insight,但是source insight並沒有linux版本,而且自從3.5版本之後,就再也沒有更新了。
在linux下,同樣也有很多優秀的代碼編輯軟件,如Emacs、KVIM、Arachnophilia、Bluefish、Komodo Edit、NEdit、Gedit、Kate、Quanta Plus等等。這裏介紹兩款比較優秀的代碼編輯軟件,slickedit和eclipse。
slickedit
安裝步驟如下:
第一步:解壓se_14000202_linux_full.tar.gz:
tar -zxvf <nowiki>se_14000202_linux_full.tar.gz</nowiki>
第二步:進入解壓的目錄,運行安裝程序vsinst。這裏要加上sudo,增加讀寫訪問權限:
sudo ./vsinst
第三步:會彈出安裝信息,按住回車不放,直到彈出如下提示:
<nowiki>Do you agree to the above license terms?[yes or no] </nowiki>輸入
yes
第四步:彈出如下信息:
<nowiki>Install directory [/opt/slickedit]: </nowiki>
這裏提示輸入安裝路徑,默認按回車即可
第五步:提示如下信息:
<nowiki>Directory /opt/slickedit/ does not exist. Create [Y]? </nowiki>
輸入Y,回車, 程序開始安裝。
第六步:安裝過程中會彈出一個SlickEdit License Manager的對話框,點退出
再彈出一個對話框,點OK
第七步:這時會提示:
INSTALLATION SUCCESSFULLY COMPLETED 1.Type "/opt/slickedit/bin/vs" to run SlickEdit. 2.You may want to add "/opt/slickedit/bin/" to your users' PATH.
第八步:退回原存放安裝文件的目錄,解壓破解文件
<nowiki>slickedit2009-14.0.2.2-linux-cracked.tar.gz: tar -xvf slickedit2009-14.0.2.2-linux-cracked.tar.gz</nowiki>
將解壓出的破解文件VS拷備到/opt/slickedit/bin目錄下:
sudo cp vs /opt/slickedit/bin
第九步:在/opt/slickedit/bin目錄下,執行./vs命令打開slickedit軟件,看看是否大功告成?以下是執行命令:
cd / ./opt/slickedit/bin/vs
第十步:啟動方式
可以在 [終端] 中 ./vs 啟動 ,也可以自己創建一個起動器。
cd /opt/slickedit/bitmaps
找到圖標文件,slickedit 2010下我選擇了vse_profile_256.bmp
$ sudo cp <nowiki>vse_profile_256.bmp /usr/share/icons </nowiki>
一般把圖標都放在/usr/share/icons下
$ cd /usr/share/applications $ sudo gedit <nowiki>slickedit.desktop </nowiki>
輸入如下語句:
<nowiki>[Desktop Entry] Name=Slickedit Comment=Slickedit Exec=/opt/slickedit/bin/vs Icon=/usr/share/icons/vse_profile_256.bmp Terminal=false Type=Application Categories=Development; StartupNotify=true </nowiki>
這時,在應用程式->編程中,就能找到slickedit的圖標了。
第十一步:如果你實在是用煩了這個軟件,那就幹掉他吧!進入/opt目錄,輸入如下指令:
rm -rf slickedit
從此讓他滾得越遠越好!
附:slickedit行號顯示:
tool->options->Languages->Application Languages->C/C++->View->Line numbers
eclipse
在ubuntu下安裝eclipse
第一步:進入如下網站下載eclipse:
選擇Eclipse IDE for Java Developers,Linux 32 Bit或Linux 64 Bit根據自己的機器而定;
第二步:將下載的文件解壓到用戶目錄:
cp <nowiki>eclipse-java-indigo-SR1-linux-gtk.tar.gz ~/ cd ~ tar xf eclipse-java-indigo-SR1-linux-gtk.tar.gz</nowiki>
第三步:創建啟動圖標:
sudo cp <nowiki>icon.xpm /usr/share/icons/eclipse.xpm sudo gedit /usr/share/applications/eclipse.desktop </nowiki>
輸入如下語句:
<nowiki>[Desktop Entry] Name=eclipse Comment=eclipse Exec=/home/lqm/eclipse/eclipse Icon=/usr/share/icons/eclipse.xpm Terminal=false Type=Application Categories=Development; StartupNotify=true </nowiki>
這時,在應用程式->編程中,就能找到eclipse圖標了,點擊即可啟動eclipse.
第四步:安裝CDT插件
安裝eclipse後,還不能建立C/C++工程,需安裝插件。進入官網下載:
http://www.eclipse.org/downloads/download.php?file=/tools/cdt
解壓下載的文件cdt-master-8.0.1.zip,將解壓出來的plugins和features目錄拷貝到eclipse安裝目錄,直接合併即可完成安裝。
使用eclipse新建一個工程
第一步:打開eclipse,首次打開時,會提示選擇工作路徑,建立自己的路徑,確定即可;
第二步:新建一個工程。點擊File->New->Project,選擇C/C++->C Project,點擊Next,在Project name一欄輸入工程名稱,如xboot,在Project name下面有一個Use default location的選擇框,去掉前面的勾,點擊Browse,指向我們需要修改的文件的目錄。 在Project type中選擇一個工程類型,如Shared Library->Empty Project,在Toolchains中選擇Cross GCC,再點擊Next,在Select Configurations中選擇配置類型,如Release,點擊Finish完成。 第三步:這時在Project Explorer中有xboot的目錄,右擊xboot,點擊Import,找到General->File System,雙擊,彈出Import對話框,在From directory中找到需要加載的文件的目錄,點擊Select All,將把加載的目錄的所有類型文件添加到工程中,點擊Finish按鈕,提示是否覆蓋.cproject,點擊Yes To All,這時我們需要編輯的文件就已經全加載到工程中了。
adb工具
安裝adb工具
網上下載最新的SDK,下載地址為:
http://developer.android.com/sdk/index.html
對於WINDOWS系統,需下載installer_r12-windows.exe,如下圖所示:
如果PC機上沒有安裝JDK,會提示需要先安裝,需從java官網下載,如jdk-6u25-windows-i586.exe,不同的版本名稱不一樣。安裝完JDK後,再安裝SDK,默認會裝在C盤,建議安裝在D盤,這時adb工具在下面的路徑:
D:\Program Files\Android\android-sdk\platform-tools
修改系統環境變量,找到Path環境變量,在前面添加
D:\Program Files\Android\android-sdk\platform-tools;
注意一定要加一個分號隔開。然後在WINDOWS的CMD命令行中輸入adb,將會彈出adb的一些參數。如果出現」adb不是內部或外部命令的錯誤」,表示系統沒有找到adb,將上面目錄中的adb.exe和AdbWinApi.dll拷貝到C:\WINDOWS\system32中即可。
查看設備的連接狀態
開發板上電,進入 setting,選擇「 developer options」,勾選「 USB debugging」進入WINDOWS下的CMD命令行,輸入如下命令驗證開發板是否連接:
adb devices
顯示下面內容表示成功連接:
進入adb shell
使用如下命令進入開發板終端:
adb shell
如下圖所示:
輸入exit退回DOS操作界面。注意,有時候,執行adb devices命令時,會提示error: more than one device and emulator,很有可能是播放了USB設備造成的。這時已經無法再通過adb傳輸數據,解決的辦法很簡單,如果是使用windows,直接在進程中幹掉adb.exe,再啟動adb即可。
串口工具secureCRT
安裝secureCRT工具,在計算機設備管理器中找到COM口號,點擊「快速連接」,如下圖:
協議選擇serial(我的設備是COM2),其他選項按照下圖所示選擇,右側三個流控制選項不能勾選!
接下來用USB轉串口線接到開發板的調試串口與PC即可看到調試串口打印的log信息。

安裝android源碼包
安裝android源碼依賴包
說明:本文檔所有開發全部基於ubuntu14.04 64位系統,後續不再聲明。
使用如下命令安裝所需的軟件包:
sudo apt-get update
sudo apt-get install git-core gnupg flex bison gperf libsdl1.2-dev libwxgtk3.0-dev build-essential zip curl zlib1g-dev gcc-multilib g++-multilib genromfs libc6-dev-i386 libncurses5-dev x11proto-core-dev libx11-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip lsb-core lib32z1-dev lib32ncurses5-dev texinfo mercurial subversion whois
使用如下命令安裝JDK1.7:
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java7-set-default
執行java -version指令查看當前java安裝版本:
<nowiki> work@works:~$ java -version java version "1.7.0_80" Java(TM) SE Runtime Environment (build 1.7.0_80-b15) Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode)
到此,jdk1.7成功安裝。
如果安裝的版本不是1.7,會出現如下編譯錯誤:
<nowiki>============================================ Checking build tools versions... /bin/bash: java: command not found /bin/bash: javac: command not found ************************************************************ You are attempting to build with the incorrect version of java. Your version is: . The required version is: "1.7.x" Please follow the machine setup instructions at https://source.android.com/source/initializing.html ************************************************************ build/core/main.mk:167: *** stop. Stop. #### make failed to build some targets (3 seconds) ####
如果沒有安裝gperf,會出現如下編譯錯誤:
/bin/bash: gperf: command not found external/chromium_org/third_party/WebKit/Source/platform<nowiki>/make_platform_generated.target.linux-arm.mk:48: recipe for target 'out/target/product/x6818/obj/GYP/shared_intermediates/blink/platform/ColorData.cpp' failed make: *** [out/target/product/x6818/obj/GYP/shared_intermediates/blink/platform/ColorData.cpp] Error 127
如果沒有安裝libxml2-utils,會出現如下編譯錯誤:
/bin/bash: xmllint: command not found build/core/Makefile:34: recipe for target 'out/target/product/x6818/system/etc<nowiki>/media_codecs_google_audio.xml' failed make: *** [out/target/product/x6818/system/etc/media_codecs_google_audio.xml] Error 127 make: *** Waiting for unfinished jobs.... /bin/bash: xmllint: command not found build/core/Makefile:34: recipe for target 'out/target/product/x6818/system/etc/media_codecs_google_video.xml' failed make: *** [out/target/product/x6818/system/etc/media_codecs_google_video.xml] Error 127 Picked up JAVA_TOOL_OPTIONS: -javaagent:/usr/share/java/jayatanaag.jar
編譯時會彈出如下錯誤:
<nowiki>****************************** You have tried to change the API from what has been previously approved. To make these errors go away, you have two choices: 1) You can add "@hide" javadoc comments to the methods, etc. listed in the errors above. 2) You can update current.txt by executing the following command: make update-api To submit the revised current.txt to the main Android repository, you will need approval. ******************************
按照上面的提示,執行make update-api指令,執行完成。
安裝交叉編譯工具鏈
我們已經將交叉編譯工具鏈集成到源碼包中,無需再手動安裝。交叉編譯工具鏈路徑:
Sourcetree/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8
安裝64位系統必要的一些補丁包
apt-get install lsb-core libc6-dev-i386 g++-multilib lib32z1-dev lib32ncurses5-dev
安裝android源碼包
通過百度網盤獲取源碼包
光盤中存放着android6.0的源碼包,其名稱為x3399_marshmallow.tar.7z.001和x3399_marshmallow.tar.7z.002。首先在WINDOWS下通過7z解壓縮工具將兩個文件提取成單一文件x3399_marshmallow.tar.bz2,再將解壓出來的文件拷貝到自己的用戶名目錄,注意不要放在文件系統的根目錄,否則會出現管理權限問題。
示例方法:在用戶權限下執行如下命令:
cp yourcdromdir/source/ '''x3399_marshmallow'''.<nowiki>tar.bz2 ~/ cd tar xvf x3399_marshmallow.tar.bz2 cd x3399_marshmallow git checkout .
這時,整個android文件系統全部都放在了當前解壓的目錄中。至此,android源碼包安裝完成。
說明:源碼包名稱可能會因發佈日期等有所不同,具體以網盤中實際名稱為準。默認源碼包中已經包含有完整的GIT調試記錄。
通過遠程倉庫克隆源碼包
直接clone遠程倉庫, 速度較慢,具體依據網絡速度而定。使用如下指令克隆源碼包:
git clone https://gitlab.com/9tripod/x3399_marshmallow.git
同步遠程倉庫代碼
使用如下指令添加gitlab.com遠程倉庫:
git remote add gitlab https://gitlab.com/9tripod/x3399_marshmallow.git
使用如下指令同步遠程倉庫代碼:
git pull gitlab master
android腳本分析配置
源碼編譯腳本分析
說明:各種版本的源碼編譯腳本大同小異,原理完全相同,具體腳本以相關源碼包中的為準,這裏僅用來分析其實現機制。
編譯腳本mk內容及注釋如下:
<nowiki>#!/bin/bash # # Description : Android Build Script. # Authors : jianjun jiang - jerryjianjun@gmail.com # Version : 2.00 # Notes : None # # # JAVA PATH # export PATH=/usr/lib/jvm/java-1.7.0-openjdk-amd64/bin:$PATH # # Some Directories # BS_DIR_TOP=$(cd `dirname $0` ; pwd) BS_DIR_TOOLS=${BS_DIR_TOP}/tools BS_DIR_RELEASE=${BS_DIR_TOP}/out/release BS_DIR_TARGET=${BS_DIR_TOP}/out/target/product/x3399/ BS_DIR_UBOOT=${BS_DIR_TOP}/u-boot BS_DIR_KERNEL=${BS_DIR_TOP}/kernel BS_DIR_BUILDROOT=${BS_DIR_TOP}/buildroot # # Target Config # BS_CONFIG_BOOTLOADER_UBOOT=x3399_defconfig BS_CONFIG_KERNEL=x3399_defconfig BS_CONFIG_KERNEL_DTB=x3399-development-board.img BS_CONFIG_FILESYSTEM=PRODUCT-x3399-userdebug BS_CONFIT_BUILDROOT=x3399_defconfig setup_environment() { LANG=C PATH=${BS_DIR_TOP}/out/host/linux-x86/bin:$PATH; cd ${BS_DIR_TOP}; mkdir -p ${BS_DIR_RELEASE} || return 1 } build_bootloader_uboot() { # Compiler uboot cd ${BS_DIR_UBOOT} || return 1 make ARCHV=aarch64 distclean || return 1 make ARCHV=aarch64 ${BS_CONFIG_BOOTLOADER_UBOOT} || return 1 make ARCHV=aarch64 -j${threads} || return 1 # Copy bootloader to release directory cp -v ${BS_DIR_UBOOT}/trust.img ${BS_DIR_RELEASE} cp -v ${BS_DIR_UBOOT}/*MiniLoaderAll_*.bin ${BS_DIR_RELEASE} cp -v ${BS_DIR_UBOOT}/uboot.img ${BS_DIR_RELEASE} return 0 } build_kernel() { # Compiler kernel cd ${BS_DIR_KERNEL} || return 1 make ARCH=arm64 ${BS_CONFIG_KERNEL} || return 1 make -j${threads} ARCH=arm64 Image || return 1 make -j${threads} ARCH=arm64 ${BS_CONFIG_KERNEL_DTB} || return 1 # Copy kernel to release directory cp -v ${BS_DIR_KERNEL}/resource.img ${BS_DIR_RELEASE} cp -v ${BS_DIR_KERNEL}/kernel.img ${BS_DIR_RELEASE} return 0 } build_system() { cd ${BS_DIR_TOP} || return 1 source build/envsetup.sh || return 1 make -j${threads} ${BS_CONFIG_FILESYSTEM} || return 1 echo "create boot.img..." [ -d ${BS_DIR_TARGET}/root ] && \ mkbootfs ${BS_DIR_TARGET}/root | minigzip > ${BS_DIR_TARGET}/ramdisk.img && \ truncate -s "%4" ${BS_DIR_TARGET}/ramdisk.img && \ ${BS_DIR_TOOLS}/mkkrnlimg ${BS_DIR_TARGET}/ramdisk.img ${BS_DIR_RELEASE}/boot.img >/dev/null echo "create recovery.img..." [ -d ${BS_DIR_TARGET}/recovery/root ] && \ mkbootfs ${BS_DIR_TARGET}/recovery/root | minigzip > ${BS_DIR_TARGET}/ramdisk-recovery.img && \ truncate -s "%4" ${BS_DIR_TARGET}/ramdisk-recovery.img && \ mkbootimg --kernel ${BS_DIR_TARGET}/kernel --ramdisk ${BS_DIR_TARGET}/ramdisk-recovery.img --output ${BS_DIR_TARGET}/recovery.img && \ cp -av ${BS_DIR_TARGET}/recovery.img ${BS_DIR_RELEASE} system_size=`ls -l ${BS_DIR_TARGET}/system.img | awk '{print $5;}'` [ ${system_size} -gt "0" ] || { echo "Please build android first!!!" && exit 1; } MAKE_EXT4FS_ARGS=" -L system -S ${BS_DIR_TARGET}/root/file_contexts -a system ${BS_DIR_RELEASE}/system.img ${BS_DIR_TARGET}/system" ok=0 while [ "$ok" = "0" ]; do make_ext4fs -l ${system_size} ${MAKE_EXT4FS_ARGS} >/dev/null 2>&1 && tune2fs -c -1 -i 0 ${BS_DIR_RELEASE}/system.img >/dev/null 2>&1 && ok=1 || system_size=$((${system_size} + 5242880)) done e2fsck -fyD ${BS_DIR_RELEASE}/system.img >/dev/null 2>&1 || true return 0 } build_buildroot() { # Compiler buildroot cd ${BS_DIR_BUILDROOT} || return 1 make ${BS_CONFIT_BUILDROOT} || return 1 make -j${threads} || return 1 # Copy image to release directory cp -v ${BS_DIR_BUILDROOT}/output/images/rootfs.ext2 ${BS_DIR_RELEASE}/linux-rootfs.img } build_update() { cd ${BS_DIR_RELEASE} || return 1 # Make update-android.img echo "create update-android.img..." cp -av ${BS_DIR_TOOLS}/package-file ${BS_DIR_RELEASE}/package-file || return 1; ${BS_DIR_TOOLS}/afptool -pack ${BS_DIR_RELEASE}/ ${BS_DIR_RELEASE}/temp.img || return 1; ${BS_DIR_TOOLS}/rkImageMaker -RK330C ${BS_DIR_RELEASE}/RK3399MiniLoaderAll_V1.05.bin ${BS_DIR_RELEASE}/temp.img ${BS_DIR_RELEASE}/update-android.img -os_type:androidos || return 1; rm -fr ${BS_DIR_RELEASE}/temp.img || return 1; # Make update-linux.img echo "create update-linux.img..." cp -av ${BS_DIR_TOOLS}/package-file-linux ${BS_DIR_RELEASE}/package-file || return 1; ${BS_DIR_TOOLS}/afptool -pack ${BS_DIR_RELEASE}/ ${BS_DIR_RELEASE}/temp.img || return 1; ${BS_DIR_TOOLS}/rkImageMaker -RK330C ${BS_DIR_RELEASE}/RK3399MiniLoaderAll_V1.05.bin ${BS_DIR_RELEASE}/temp.img ${BS_DIR_RELEASE}/update-linux.img -os_type:androidos || return 1; rm -fr ${BS_DIR_RELEASE}/temp.img || return 1; return 0 } copy_other_files() { cd ${BS_DIR_TOP} || return 1 cp -av ${BS_DIR_TOP}/device/rockchip/rk3399/x3399/parameter.txt ${BS_DIR_RELEASE} || return 1; cp -av ${BS_DIR_TOP}/device/rockchip/rk3399/x3399/misc.img ${BS_DIR_RELEASE} || return 1; cp -av ${BS_DIR_TOP}/device/rockchip/rk3399/x3399/parameter-linux.txt ${BS_DIR_RELEASE} || return 1; cp -av ${BS_DIR_TOP}/device/rockchip/rk3399/x3399/misc-linux.img ${BS_DIR_RELEASE} || return 1; return 0 } threads=1 uboot=no kernel=no system=no buildroot=no update=no if [ -z $1 ]; then uboot=yes kernel=yes system=yes buildroot=yes update=yes fi while [ "$1" ]; do case "$1" in -j=*) x=$1 threads=${x#-j=} ;; -u|--uboot) uboot=yes ;; -k|--kernel) kernel=yes ;; -s|--system) system=yes ;; -b|--buildroot) buildroot=yes ;; -U|--update) update=yes ;; -a|--all) uboot=yes kernel=yes system=yes buildroot=yes update=yes ;; -h|--help) cat >&2 <<EOF Usage: build.sh [OPTION] Build script for compile the source of telechips project. -j=n using n threads when building source project (example: -j=16) -u, --uboot build bootloader uboot from source -k, --kernel build kernel from source -s, --system build android file system from source -b, --buildroot build buildroot file system for linux platform -U, --update build update file -a, --all build all, include anything -h, --help display this help and exit EOF exit 0 ;; *) echo "build.sh: Unrecognised option $1" >&2 exit 1 ;; esac shift done setup_environment || exit 1 copy_other_files || exit 1 if [ "${uboot}" = yes ]; then build_bootloader_uboot || exit 1 fi if [ "${kernel}" = yes ]; then build_kernel || exit 1 fi if [ "${system}" = yes ]; then build_system || exit 1 fi if [ "${buildroot}" = yes ]; then build_buildroot || exit 1 fi if [ "${update}" = yes ]; then build_update || exit 1 fi exit 0
配置使用MIPI屏
在kernel/arch/arm64/boot/dts/rockchip目錄下存放了多個已經調試好的液晶屏的配置文件,7寸MIPI屏的配置文件為lcd-mipi-7inch-wy070ml.dtsi,7.9寸EDP屏的配置文件為lcd-edp-lp079qx1.dtsi。在kernel/arch/arm64/boot/dts/rockchip/ x3399-development-board.dts中選擇配置使用的液晶模組即可,如需要使用7寸MIPI屏,示例代碼如下:
&rk_screen { #include "<nowiki>lcd-mipi-7inch-wy070ml.dtsi" /* #include "lcd-edp-lp079qx1.dtsi" */ };
編譯android源碼包
說明:編譯映像時一定要使用普通權限編譯。編譯完成後,生成的映像文件
RK3399MiniLoaderAll_V1.05.bin,uboot.img,trust.img,misc.img,misc-linux.img,parameter-linux.txt,parameter.txt,resource.img,kernel.img,boot.img,system.img,recovery.img, update-android.img。
編譯uboot
在android源碼目錄下執行如下命令編譯uboot,編譯完成後映像文件RK3399MiniLoaderAll_V1.05.bin(因版本不同,名稱不一定相同)以及uboot.img會釋放到out/release目錄。
./mk.sh -u
編譯android內核
在android源碼目錄下執行如下命令編譯android內核,編譯完成後映像文件kernel.img、resource.img會釋放到out/release目錄。
./mk.sh -k
編譯android文件系統
在android源碼目錄下執行如下命令編譯android映像文件,編譯完成後映像文件會釋放到out/release目錄。
./mk.sh -s
編譯完文件系統,在out/release目錄下會生成如下文件:
- RK3399MiniLoaderAll_V1.05.bin:uboot映像文件
- trust.img:uboot映像文件
- uboot.img:uboot映像文件
- Kernel.img:內核映像
- Resource.img:資源映像,內含開機圖片和內核的設備樹信息。
- Boot.img: Android的初始文件映像,負責初始化並加載system分區。
- System.img:android的system分區映像,ext4文件格式系統。
- Recovery.img:急救模式映像。
- Misc.img:分區映像,負責啟動模式切換和急救模式的參數傳遞。
生成update-android.img文件系統
在android源碼目錄下執行如下命令生成單一android映像文件update-android.img:
./mk.sh -U
update-android.img為整個升級文件的單一映像,包括了uboot,內核,文件系統等。注意,生成update-android.img的先決條件是已經成功編譯了uboot,內核和文件系統,缺一不可。如果沒有編譯針對linux平台的文件系統,在執行該指令時,會提示無法生成update-linux.img的錯誤,如果讀者不使用linux系統,不用理會。其編譯信息如下:
lqm@lqm:/home/DISK1/x3399_marshmallow$ ./<nowiki>mk.sh -U '/home/DISK1/x3399_marshmallow/device/rockchip/rk3399/x3399/parameter.txt' -> '/home/DISK1/x3399_marshmallow/out/release/parameter.txt' '/home/DISK1/x3399_marshmallow/device/rockchip/rk3399/x3399/misc.img' -> '/home/DISK1/x3399_marshmallow/out/release/misc.img' '/home/DISK1/x3399_marshmallow/device/rockchip/rk3399/x3399/parameter-linux.txt' -> '/home/DISK1/x3399_marshmallow/out/release/parameter-linux.txt' '/home/DISK1/x3399_marshmallow/device/rockchip/rk3399/x3399/misc-linux.img' -> '/home/DISK1/x3399_marshmallow/out/release/misc-linux.img' create update-android.img... '/home/DISK1/x3399_marshmallow/tools/package-file' -> '/home/DISK1/x3399_marshmallow/out/release/package-file' Android Firmware Package Tool v1.62 ------ PACKAGE ------ Add file: /home/DISK1/x3399_marshmallow/out/release/package-file Add file: /home/DISK1/x3399_marshmallow/out/release/RK3399MiniLoaderAll_V1.05.bin Add file: /home/DISK1/x3399_marshmallow/out/release/parameter.txt Add file: /home/DISK1/x3399_marshmallow/out/release/trust.img Add file: /home/DISK1/x3399_marshmallow/out/release/uboot.img Add file: /home/DISK1/x3399_marshmallow/out/release/misc.img Add file: /home/DISK1/x3399_marshmallow/out/release/resource.img Add file: /home/DISK1/x3399_marshmallow/out/release/kernel.img Add file: /home/DISK1/x3399_marshmallow/out/release/boot.img Add file: /home/DISK1/x3399_marshmallow/out/release/recovery.img Add file: /home/DISK1/x3399_marshmallow/out/release/system.img Add CRC... Make firmware OK! ------ OK ------ ********RKImageMaker ver 1.63******** Generating new image, please wait... Writing head info... Writing boot file... Writing firmware... Generating MD5 data... MD5 data generated successfully! New image generated successfully! create update-linux.img... '/home/DISK1/x3399_marshmallow/tools/package-file-linux' -> '/home/DISK1/x3399_marshmallow/out/release/package-file' Android Firmware Package Tool v1.62 ------ PACKAGE ------ Add file: /home/DISK1/x3399_marshmallow/out/release/package-file Add file: /home/DISK1/x3399_marshmallow/out/release/RK3399MiniLoaderAll_V1.05.bin Add file: /home/DISK1/x3399_marshmallow/out/release/parameter-linux.txt Add file: /home/DISK1/x3399_marshmallow/out/release/trust.img Add file: /home/DISK1/x3399_marshmallow/out/release/uboot.img Add file: /home/DISK1/x3399_marshmallow/out/release/misc-linux.img Add file: /home/DISK1/x3399_marshmallow/out/release/resource.img Add file: /home/DISK1/x3399_marshmallow/out/release/kernel.img Add file: /home/DISK1/x3399_marshmallow/out/release/boot.img Add file: /home/DISK1/x3399_marshmallow/out/release/recovery.img Add file: /home/DISK1/x3399_marshmallow/out/release/linux-rootfs.img Error:<AddFile> open file failed,err=2! ------ FAILED ------ lqm@lqm:/home/DISK1/x3399_marshmallow$
查看編譯幫助
執行如下指令可查詢mk腳本使用方法:
./mk.sh -h
燒寫android映像文件
Windows系統映像燒寫
RKTool驅動安裝
解壓RKTools.rar,工具路徑:SDK\RKTools\windows\Release_DriverAssitant打開「DriverInstall.exe」,點擊「驅動安裝」,提示安裝驅動成功即可。
注意事項:
1.目前支持的操作系統包括:XP,Win7_32,Win7_64,Win8_32,Win8_64。
2.XP系統在驅動安裝完後,若還提示「發現新設備」, 安裝驅動時選擇「自動安裝」。
3.若之前已經安裝過老版本驅動,請先點擊「驅動卸載」後再進行「驅動安裝」。
燒錄方法一:單個升級固件update-android.imgg
生成統一固件update-android.imgg
我們已經在mk腳本中集成了生成統一固件的方法,在編譯android文件系統時(./mk -s),會自動生成update-android.imgg,並釋放到out/release目錄。
燒錄固件update-android.imgg
解壓光盤 tools\x3399 燒寫工具\windows 目錄下的 AndroidTool_Release_v2.38.zip 文件,得到 AndroidTool_Release_v2.38 文件夾,打開 AndroidTool.exe, 選擇「升級固件」選項卡, 點擊「固件」,在彈出窗口中選擇已經生成的 update-android.img 文件,如下圖所示。

工具配置好後, 將 PC 端串口線連接開發板的調試串口,將 PC 端 TYPEC 延長線連接到開發板的 TYPEC 接口, 按下 RECOVERY 鍵( VOL+鍵) ,燒錄工具界面會提示發現一個 LOADER 設備,然後點擊升級,即可開始升級過程(註:如果提示發現一個 ADB 設備,點擊切換按鈕切換成LOADER 設備即可)。

升級完成後將會出現如下界面:

燒錄方法二:多設備升級固件update-android.imgg
該工具適合用戶批量刷機,可以同時給多台開發板刷機。
解壓光盤 tools\x3399 燒寫工具\windows 目錄下的 FactoryTool-v1.42e.rar 文件,打開「FactoryTool.exe」,點擊「固件」選擇update-android.imgg,勾選「升級」,點擊「啟動」,如下圖所示:
步驟1:點擊固件,選擇update-android.imgg;
步驟2:點擊啟動(選擇升級按鈕);
步驟3:連接開發板 USB、 DC 電源,按下 recovery 鍵(對應 VOL+鍵),對應 USB 口發現設備,並實現自動升級;然後重複步驟 3 即可同時升級第二台、第三台設備,升級成功或者失敗的設備會在兩邊的列表中列出,移除成功或者失敗的設備後可以繼續連接需要升級的設備
Linux系統燒寫映像
生成固件update-android.img
我們已經在mk腳本中集成了生成統一固件的方法,在編譯android文件系統時(./mk -s),會自動生成update-android.img,並釋放到out/release目錄。
燒錄固件update-android.img
工具路徑:
tools\x3399 烧写工具\linux\ Linux_Upgrade_Tool_v1.24.zip
在升級之前將update-android.imgg拷貝到upgrade_tool相同目錄下,運行upgrade_tool(需要sudo)
work@ubuntu:~/3288/Linux_Upgrade_Tool_v1.2/cp rockdev<nowiki>/update-android.img . work@ubuntu:~/3288/Linux_Upgrade_Tool_v1.2$ sudo ./upgrade_tool </nowiki>
執行結果如下圖,發現設備列表,輸入要升級的DevNo(設備號)選擇設備
選擇設備後彈出工具使用菜單如下圖,左側是功能描述,右側是命令語法,升級相關操作都在upgrade command列表下,忘記命令語法可以輸入H進行查看,清屏輸入CS,退出按Q。
- CD命令: 選擇設備, 當執行的命令有包含設備重啟操作時, 需重新選擇設備,當改變操作設備時需重新選擇
- SD命令:msc切換到rockusb升級模式。 當切換執行成功後, 需要重新選擇設備
- UF命令:升級完整update-android.imgg固件,當執行成功後需要重新選擇設備
- UL命令:升級loader功能,當執行成功後需要重新選擇設備
- DI命令:下載單獨image鏡像到指定扇區,例如升級kernel.img或者system.img都可以直接使用此功能.例如下載kernel.img: DI -k kernel.img parameter //如果之前通過DI下載過parameter,則再下載kernel.img時就可以不用指定最後的parameter參數
- DB命令:下載boot,在maskrom狀態下,可以通過此功能, 讓maskrom設備進行Rockusb協議通訊
- EF命令:擦除整個nandflash
- LF命令:低格保留塊後面區域,只有在loader模式下使用
執行uf update-android.imgg 開始更新固件,下圖為更新完成截圖。
Rockusb>uf <nowiki>update-android.img </nowiki>
備註:也可通過配置config.ini文件配置升級映像文件,只需輸入UF即可升級,請用戶自行嘗試。
使用upgrade_tool指令燒寫映像
上一節我們介紹了通過upgrade_tool燒寫統一固件update-android.img的方法,熟悉三星平台的開發者會發現,這種方法並不是很高效,真正操作起來,它遠沒有fastboot工具來的迅速。其實,upgrade_tool工具同樣支持類似於fastboot的燒寫方式。
為了燒寫方便,在mk腳本中,默認在編譯系統時,已經將燒寫工具upgrade_tool拷貝到out/release目錄了。
第一步:打開串口終端,並打開minicom,用於適時監控串口調試信息;
第二步:按住RECOVERY鍵,連接USB OTG線和電源線,這時uboot打印信息將會提示已經進入USB下載模式。如果接通電源後沒來得及按住RECOVERY鍵,在按住RECOVERY鍵的同時,再按下復位鍵即可。注意,使用
第二步:打開第二個串口終端,進入out/release目錄;
第三步:在out/release目錄下敲擊如下指令,燒寫相應的映像。
sudo upgrade_tool di –k <nowiki>kernel.img(烧写内核) sudo upgrade_tool di –s system.img(烧写文件系统) sudo upgrade_tool di resource resource.img(烧写资源文件) sudo upgrade_tool di –r recovery.img(烧写急救文件) sudo upgrade_tool ul RK3288UbootLoader_V2.30.10.bin(烧写bootloader) sudo upgrade_tool uf update-android.imgg(烧写统一固件) </nowiki>
使用Rkflashkit燒寫映像
rkflashkit 有圖形界面,後加了命令行支持,更是好用。
work@ubuntu:~/rktool$ sudo apt-get install build-essential fakeroot work@ubuntu:~/rktool$ git clone <nowiki>https://github.com/linuxerwang/rkflashkit work@ubuntu:~/rktool$ cd rkflashkit work@ubuntu:~/rktool$ ./waf debian work@ubuntu:~/rktool$ sudo apt-get install python-gtk2 work@ubuntu:~/rktool$ sudo dpkg -i rkflashkit_0.1.4_all.deb </nowiki>
注意:rkflashkit_0.1.4_all.deb會因版本更新,版本數字可能會有所變化,如果執行失敗,執行ls命令查看下即可。
work@ubuntu:~/rktool/$ sudo rkflashkit
如下是圖形界面,在Devices下選擇設備,選擇要燒寫的分區和對應的映像文件,點擊Flash image即可。
該工具也支持命令行,使用help命令查看使用方法
work@ubuntu:~/rktool/rkflashkit$ rkflashkit --help <nowiki>Usage: <cmd> [args] [<cmd> [args]...] part List partition flash @<PARTITION> <IMAGE FILE> Flash partition with image file cmp @<PARTITION> <IMAGE FILE> Compare partition with image file backup @<PARTITION> <IMAGE FILE> Backup partition to image file erase @<PARTITION> Erase partition reboot Reboot device For example, flash device with boot.img and kernel.img, then reboot: sudo rkflashkit flash @boot boot.img @kernel.img kernel.img reboot work@ubuntu:~/rktool/rkflashkit$ </nowiki>
android開發指南
命令終端
將串口連接開發板上調試串口,進入android系統後,會自動進入android終端,如下圖所示:
播放mp3
android命令行播放mp3
在android的在命令行下,可以使用強大的am指令做很多事情。在android終端輸入am,正常情況下會有如下提示信息:
# am usage: am [subcommand] [options] start an Activity: am start [-D] [-W] <INTENT> -D: enable debugging -W: wait for launch to complete start a Service: am startservice <INTENT> send a broadcast Intent: am broadcast <INTENT> start an Instrumentation: am instrument [flags] <COMPONENT> -r: print raw results (otherwise decode REPORT_KEY_STREAMRESULT) -e <NAME><VALUE>: set argument <NAME> to <VALUE> -p <FILE>: write profiling data to <FILE> -w: wait for instrumentation to finish before returning start profiling: am profile <PROCESS> start <FILE> stop profiling: am profile <PROCESS> stop <INTENT> specifications include these flags: [-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>] [-c <CATEGORY> [-c <CATEGORY>] ...] [-e|--es <EXTRA_KEY><EXTRA_STRING_VALUE> ...] [--esn <EXTRA_KEY> ...] [--ez <EXTRA_KEY><EXTRA_BOOLEAN_VALUE> ...] [-e|--ei <EXTRA_KEY><EXTRA_INT_VALUE> ...] [-n <COMPONENT>] [-f <FLAGS>] [--grant-read-uri-permission] [--grant-write-uri-permission] [--debug-log-resolution] [--activity-brought-to-front] [--activity-clear-top] [--activity-clear-when-task-reset] [--activity-exclude-from-recents] [--activity-launched-from-history] [--activity-multiple-task] [--activity-no-animation] [--activity-no-history] [--activity-no-user-action] [--activity-previous-is-top] [--activity-reorder-to-front] [--activity-reset-task-if-needed] [--activity-single-top] [--receiver-registered-only] [--receiver-replace-pending] [<URI>]
啟動的方法為:
<nowiki># am start -n 包(package)名/包名.活动(activity)名称
啟動的方法可以從每個應用的AndroidManifest.xml的文件中得到,以計算器(calculator)為例,
<?xml version="1.0" encoding=""?> <manifestxmlns:android="<nowiki>http://schemas.android.com/apk/res/android" package="com.android.calculator2"> <applicationandroid:label="@string/app_name"android:icon="@drawable/icon"> <activity android:name="Calculator" android:theme="@android:style/Theme.Black"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <categoryandroid:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application> </manifest>
由此計算器(calculator)的啟動方法為:
<nowiki># am start-ncom.android.calculator2/com.android.calculator2.Calculator
Music的啟動方法為:
<nowiki># am start-ncom.android.music/com.android.music.MusicBrowserActivity
這時,螢幕上會有music的播放列表,但是並沒有播放。如果需要播放,得執行下面的指令:
am start -n <nowiki>com.android.music/com.android.music.MediaPlaybackActivity -d /mnt/extsd/liangliangxianwang.mp3
使用android默認音頻播放器
確保外置的SD卡中存在mp3文件,點擊音樂,播放器會自動識別音頻文件,如下圖:
點擊相應的音頻文件即可播放。播放時界面如下:
播放視頻
android自帶視頻處理功能,在android應用界面顯示為圖庫。點擊圖庫按鈕,會在外置SD卡中自動尋找能夠識別的視頻和圖片文件,如下圖:
點擊中間的按鈕:
上圖中,帶有播放符號的即為視頻文件,不帶的為圖片文件。點擊帶播放符號的文件:
再點擊播放按鈕:
X3399 android6.0系統還帶一款4k視頻播放器,播放器會自動關聯視頻文件,點擊需要播放的視頻即可播放
如果遇到圖庫無法支持的視頻文件,可以採用第三方播放器如RockPlayer進行播放,如網絡上最為流行的rmvb和rm文件。這時,機器儼然成為了一個具有支持rm/rmvb等格式視頻的超強mp4了。如對螢幕尺寸有更高要求,可以使用VGA或HDMI方式,直接將視頻文件顯示到顯示器或電視機上。
使用RockPlayer播放視頻時,會彈出一個硬解和軟解的對話框,如果屬於3399硬解碼的視頻文件,選擇硬解模式,否則選擇軟解模式。如播放rm/rmvb文件,選擇軟解模式才能播放,如下圖所示:
圖片瀏覽
瀏覽圖片時,同樣使用上面的圖庫瀏覽。點擊圖庫圖標,點擊要瀏覽的圖片即可瀏覽。滑動可以瀏覽下一張圖片,如下圖所示:
語言設置
點擊設置中的語言和輸入法一欄,再點擊選擇語言,會彈出多種語言,選擇需要的語言即可,如下圖:
使用WIFI上網
X3399開發板自帶wifi/BT二合一模組,無需額外USBwifi即可無線上網。啟動開發板,點擊設置,在Wi-Fi一欄的方框中有個關閉按鈕,將他撥到右邊,即打開狀態,如下圖:
再點擊Wi-Fi一欄,進入wifi界面,找到屬於自己的無線網絡信號並點擊,輸入密碼後,點擊連接即可上網。
使用藍牙傳輸數據
x3399開發板支持AP6335晶片的WIFI/BT二合一模塊。點擊設置->藍牙,將藍牙開關打開,如下圖所示:
點擊藍牙,進入設置界面,找到一個支持藍牙設備的安卓手機,並打開藍牙,且可被發現。在x3399開發板的藍牙設置界面的右上腳點擊搜索設備,在可用設備一欄中將會顯示出所有找到的藍牙設備。找到需要匹配的藍牙設備並點擊,在開發板上彈出配對請求:
點擊配對,同時,在手機端也會彈出類似的畫面,也點擊配對即可。成功配對後的界面如下:
這時,配對的設備間就可以通過藍牙共享文件了。點擊開發板的圖庫,找到一張圖片並選中:
點擊右上腳的分享按鈕,選擇藍牙,彈出如下界面:
選擇配對成功的藍牙設備,這時在配對設備上將會彈出一個接收文件的對話框,點擊接收即可。
使用藍牙播放音樂
x3399開發板可支持通過藍牙連接藍牙音箱,並播放音樂。準備一個藍牙音箱,並切換到藍牙模式,進入開發板的藍牙界面並打開,點擊右上腳的搜索設備,將會找到藍牙音箱,下圖中的GS805即是藍牙音箱:
點擊GS805,稍等幾秒,將會配對成功,無需任何確認動作。這時,隨意在開發板上播放音視頻,音樂將會通過藍牙音箱播放出來。
使用USB鼠標鍵盤
啟動開發板,將USB鼠標或者USB無線鼠標鍵盤接到USB HOST接口,即可使用鼠標鍵盤操作android界面了。
APK應用安裝
Android系統下有很多種APK的安裝方法,這裏介紹四種。
使用SD卡安裝
將拷貝有APK安裝包的SD卡插到開發板,打開開發板的「文件管理」應用程式,界面如下:
可以看到,安裝包一欄找到了3個安裝包。點擊進去,會列出安裝列表:
點擊要安裝的APK文件:
依次點擊下一步,直到安裝完成即可。
使用adb工具安裝
在上一章節,ApkInstaller.rar的解壓目錄中已經存在有adb工具了,我們在命令行下進入該目錄,執行如下指令安裝APK:
adb install *.apk
正常安裝的界面如下:
在線安裝
用戶可以通過91助手,百度應用中心、360手機助手等第三方軟件直接在線安裝,這裏就不詳細說明了。
螢幕抓圖
使用eclipse抓圖
android有很多截圖工具,但是很多都需要root權限,在平時做開發時,我們可以使用eclipse自帶的插件進行截圖,非常的方便。
啟動開發板,並進入android系統。使用USB延長線將x3399開發板與PC機連接,第一次連接時會提示需要安裝軟件,如下圖:
選擇否,點下一步:
選擇自動安裝軟件,點下一步,直至安裝完成。
安裝完成之後,打開eclipse軟件,如果沒有安裝,需先安裝該軟件。然後點擊Window->Show view->Devices,如下圖:
確保機器處於開機狀態,這時Devices會找到機器的設備號,如下圖:
點擊上圖右上腳的攝相頭標誌,就會彈出要保存的圖像,點擊save保存即可,如下圖所示:
使用360手機助手抓圖
在PC機上安裝360手機助手手,啟動開發板,通過USB延長線將開發板連接到PC機的USB口,打開360手機助手,360手機助手將會找到x3399開發板。如果找不到,將USB線撥掉重插,在開發板上會彈出一個授權界面,點擊確認即可。正常連接後的360手機助手界面如下:
點擊左下腳的截屏按鈕即可。
掛載TF卡
系統啟動後,會自動掛載右側卡槽中的TF卡到/mnt/external_sd/目錄,如下圖所示:
掛載U盤
啟動開發板,並進入android系統。插入U盤後,系統會將U盤自動掛載到/mnt/usb_storage*(*表示0到4)目錄。
計算器
點擊android應用的計算器即可使用計算器功能,如下圖所示:
輸入法
推薦安裝訊飛輸入法,測試界面如下:
瀏覽器
android默認自帶一個瀏覽器,該瀏覽器功能已經非常完善了,如果用戶仍然覺得不夠要求,可以下載安裝第三方瀏覽器,如UC瀏覽器等。
螢幕旋轉
重力傳感器已經集成到開發板上,將開發板移動到四周任一方向,界面會隨之改變。當然並不是所有應用程式都會隨之改變,有部分應用程式不支持螢幕旋轉。旋轉後示例圖片如下:
時間設置
點擊android應用中的設置,可以看到有日期和時間一欄,點擊進去,選擇相應的欄目設置即可。
拍照攝相
點擊android應用中的相機,會進入圖像預覽模式。點擊右下腳的拍照按鈕即可拍照,如下圖所示:
右下腳可以切換拍照和錄像功能。
使用有線以太網上網
將可以正常上網的網線連接到開發板的網口座上,網口座的指示燈會正常閃爍,正常上網界面如下:
優酷
將優酷的APK軟件安裝到開發板,連接網線就可以看視頻了。
播放電視
安裝龍龍直播,泰捷視頻等網絡播放器,插上網線即可播放。
使用遙控器操作開發板
默認x3399開發板硬件支持紅外遙控器,我們可以通過遙控器操作android界面,在泰捷視頻等電視界面通過遙控器操作,開發板就完全變成了一個機頂盒。 284x478px
4K視頻播放
3399相對3288,支持更多種全高清視頻的硬解碼,可以流暢的播放這些格式的1080P視頻文件。
通常情況下,使用RockPlayer或者自帶的播放器都可播放。如果遇到自帶播放器無法播放,可選擇RockPlayer。播放界面如下:
HDMI顯示
HDMI顯示支持直接將LCD上顯示的視頻還原到帶有HDMI接口的電視機上,支持1080P高清視頻,兼容720P,576P以及480P的視頻。同時還將音頻也一併傳送到電視機上。
開關機
x3399開發板使用了PMU進行電源管理。當外接上5V的電源適配器後,x3399開發板將會被自動點亮,進入系統後,長按開機鍵,會彈出一個選擇對話框,點擊關機按鈕將會彈出確認關機的對話框,點擊確認即可關機。
休眠喚醒
進入android文件系統後,輕按開關機鍵,螢幕將會熄滅,然後進入深度休眠狀態。可以通過串口查看進入休眠的打印信息。再次輕按開關機鍵,開發板將會喚醒。
Android測試程序
我們在x3288,x3399開發板上開發了強大的安卓測試軟件,基本上可以測試開發板的所有硬件功能,它在產品量產,程序開發上有很大的參考價值。在APP界面點擊安卓測試,即可進入測試界面,使用觸摸屏左右滑動,或者用鼠標滑動可切換測試的硬件。
液晶屏測試
在液晶屏測試界面,點擊中間的任意純色位置,會有不同的顏色變化,我們可以觀察LCD是否有丟色,壞點等。
觸摸屏測試
在觸摸屏測試界面,點擊開始測試,即可在螢幕上任意手寫,在批量生產時,我們通常通過畫對角線測試觸摸電路是否正常。
發光二極管測試
點擊圖片上任意的燈,為紅色時,對應開發板上的LED燈亮,為灰色時,對應LED燈滅。
蜂鳴器測試
按住開始測試鍵,蜂鳴器會鳴叫,鬆開開始測試鍵,蜂鳴器停止鳴叫。
背光測試
划動中間的圓圈,背光亮度會隨之發生變化。
按鍵測試
按下或抬起開發板上四個獨立按鍵的任意一個,界面上將會提示對應的按鍵的按下和抬起動作。
電池測試
該界面反應了接在開發板上的電池電量信息。
數模轉換測試
監測四路ADC的電壓。我們可以通過調節開發板上的精密可調電位器,觀察上面對應通道的電壓是否變化。
重力傳感器測試
旋轉開發板時,上面的X,Y,Z軸的值會隨之發生變化。
音頻測試
點擊開始測試,會聽到有清脆的聲音出來。
攝像頭測試
裝上攝相頭,點擊開始測試,會看到攝像頭抓到的預覽界面顯示出來。
無線網絡測試
使用WIFI連上無線網絡後,無線網絡測試界面會搜索到附近的網絡並列出來。
網絡連接測試
當有線或無線網絡正常連接時,網絡連接測試界面可以瀏覽網頁。
串口測試
將需要測試的串口的TXD和RXD短路,再點擊開始測試,界面上會提示對應串口會自發自收0123456789。如果不能自發自收,說明對應的串口硬件有問題。
外部存儲器測試
將TF卡插到開發板上,點擊開始測試,界面上會顯示TF卡的相關信息。
優盤測試
將U盤插到開發板上,點擊開始測試,界面上會顯示U盤的相關信息。
android內核驅動
G-sensor驅動
路径:kernel/drivers/input/sensors/gyro/ 文件:lsm330_gyro.c
光感傳感器驅動
路径:kernel/drivers/input/sensors/lsensor 文件:cm3218.c
電容觸摸屏驅動
路径:kernel/drivers/input/touchscreen/ 源码:gslx680.c
液晶屏驅動
路径:kernel/drivers/video/rockchip/ kernel/drivers/video/rockchip/dp/ kernel/drivers/video/rockchip/transmitter kernel/arch/arm64/boot/dts/rockchip 源码:rockchip_dp.c,mipi_dsi.c,<nowiki>lcd-edp-lp079qx1.dtsi,lcd-mipi-7inch-wy070ml.dtsi
按鍵驅動
路径:kernel/drivers/input/keyboard
源码:rk_keys.c
WIFI/BT模塊驅動
路径:kernel/drivers/net/wireless/rockchip_wlan
源码:该目录下所有源码文件
攝像頭驅動
路径:hardware/rockchip/camera/SiliconImage/isi/drv
源码:该目录下
HDMI驅動
路径:kernel/drivers/video/rockchip/hdmi
proc文件系統
啟動環境變量查詢
使用如下指令查詢啟動環境變量配置:
cat /proc/cmdline
會有如下類似打印信息:
root@x3399:/ # cat /proc/cmdline earlycon=uart8250,mmio32,0xff1a0000 swiotlb=1 <nowiki>androidboot.baseband=N/A androidboot.selinux=permissive androidboot.hardware=rk30board androidboot.console=ttyFIQ0 mtdparts=rk29xxnand:0x00002000@0x00002000(uboot),0x00002000@0x00004000(trust),0x00002000@0x00006000(misc),0x00008000@0x00008000(resource),0x00008000@0x00010000(kernel),0x00010000@0x00018000(boot),0x00018000@0x00028000(recovery),0x00030000@0x00040000(backup),0x00040000@0x00070000(cache),0x00600000@0x000B0000(system),0x00008000@0x006B0000(metadata),0x00002000@0x006B8000(baseparamer),0x00000400@0x006BA000(frp),-@0x006BA400(userdata) storagemedia=emmc uboot_logo=0x02000000@0x7dc00000:0x01000000 loader.timestamp=2017-01-20_15:16:33 androidboot.mode=emmc root@x3399:/ #
CPU信息查詢
使用如下指令查詢CPU信息:
cat /proc/cpuinfo
會有如下類似打印信息:
<nowiki> root@x3399:/ # cat /pro proc/ property_contexts root@x3399:/ # cat /proc/cpuinfo processor : 0 BogoMIPS : 48.00 Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 CPU implementer : 0x41 CPU architecture: 8 CPU variant : 0x0 CPU part : 0xd03 CPU revision : 4 processor : 1 BogoMIPS : 48.00 Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 CPU implementer : 0x41 CPU architecture: 8 CPU variant : 0x0 CPU part : 0xd03 CPU revision : 4 processor : 2 BogoMIPS : 48.00 Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 CPU implementer : 0x41 CPU architecture: 8 CPU variant : 0x0 CPU part : 0xd03 CPU revision : 4 processor : 3 BogoMIPS : 48.00 Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 CPU implementer : 0x41 CPU architecture: 8 CPU variant : 0x0 CPU part : 0xd03 CPU revision : 4 processor : 4 BogoMIPS : 48.00 Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 CPU implementer : 0x41 CPU architecture: 8 CPU variant : 0x0 CPU part : 0xd08 CPU revision : 2 processor : 5 BogoMIPS : 48.00 Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 CPU implementer : 0x41 CPU architecture: 8 CPU variant : 0x0 CPU part : 0xd08 CPU revision : 2 root@x3399:/ #
內存信息查詢
使用如下指令查詢內存使用信息:
cat /proc/meminfo
會有如下類似打印信息:
<nowiki> root@x3399:/ # cat /pr proc/ property_contexts root@x3399:/ # cat /proc/meminfo MemTotal: 2041364 kB MemFree: 845216 kB MemAvailable: 1554116 kB Buffers: 1468 kB Cached: 696428 kB SwapCached: 0 kB Active: 436404 kB Inactive: 554568 kB Active(anon): 294576 kB Inactive(anon): 10908 kB Active(file): 141828 kB Inactive(file): 543660 kB Unevictable: 0 kB Mlocked: 0 kB SwapTotal: 520908 kB SwapFree: 520908 kB Dirty: 8 kB Writeback: 0 kB AnonPages: 293128 kB Mapped: 352516 kB Shmem: 12428 kB Slab: 94504 kB SReclaimable: 65316 kB SUnreclaim: 29188 kB KernelStack: 11216 kB PageTables: 11696 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 1541588 kB Committed_AS: 25896976 kB VmallocTotal: 258867136 kB VmallocUsed: 0 kB VmallocChunk: 0 kB CmaTotal: 131072 kB CmaFree: 128616 kB root@x3399:/ #
磁盤分區信息查詢
使用如下命令查詢磁盤分區信息:
cat /proc/partitions
會有如下類似打印信息:
<nowiki> root@x3399:/ # cat /proc/partitions major minor #blocks name 1 0 8192 ram0 1 1 8192 ram1 1 2 8192 ram2 1 3 8192 ram3 1 4 8192 ram4 1 5 8192 ram5 1 6 8192 ram6 1 7 8192 ram7 1 8 8192 ram8 1 9 8192 ram9 1 10 8192 ram10 1 11 8192 ram11 1 12 8192 ram12 1 13 8192 ram13 1 14 8192 ram14 1 15 8192 ram15 254 0 520912 zram0 179 0 15267840 mmcblk0 179 1 4096 mmcblk0p1 179 2 4096 mmcblk0p2 179 3 4096 mmcblk0p3 179 4 16384 mmcblk0p4 179 5 16384 mmcblk0p5 179 6 32768 mmcblk0p6 179 7 49152 mmcblk0p7 179 8 98304 mmcblk0p8 179 9 131072 mmcblk0p9 179 10 3145728 mmcblk0p10 179 11 16384 mmcblk0p11 179 12 4096 mmcblk0p12 179 13 512 mmcblk0p13 179 14 11736576 mmcblk0p14 179 96 4096 mmcblk0rpmb 179 64 4096 mmcblk0boot1 179 32 4096 mmcblk0boot0 root@x3399:/ #
內核版本查詢
使用如下命令查詢內核版本:
cat /proc/version
會有如下類似打印信息:
<nowiki> root@x3399:/ # cat /proc/version Linux version 4.4.16 (jjj@jjj-desktop) (gcc version 4.9.x-google 20140827 (prerelease) (GCC) ) #164 SMP PREEMPT Mon Jan 16 18:49:48 CST 2017 root@x3399:/ #
網絡設備查詢
使用如下命令查詢網絡設備信息:
cat /proc/net/dev
會有如下類似打印信息:
<nowiki> root@x3399:/ # cat /proc/net/dev Inter-| Receive | Transmit face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed sit0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 lo: 6032 80 0 0 0 0 0 0 6032 80 0 0 0 0 0 0 wlan0: 503506 2298 0 0 0 0 0 53 23070 251 0 0 0 0 0 0 eth0: 0 0 0 0 0 0 0 0 508 6 0 0 0 0 0 0 root@x3399:/ #
查看內核啟動信息
使用如下命令查詢內核啟動信息:
cat /proc/kmsg
android開發項目實戰
說明:以下為實際項目實例,用戶可參考x210開發文檔練習,後續我們會陸續發佈。在進行下面的任一個實驗之前,請確保前面的環境已經搭建完畢。
實戰1:創建hello x3399工程
參考《x4418 android平台用戶手冊》。
實戰2:在x3399開發板上運行hello x3399測試程序
參考《x4418 android平台用戶手冊》。
實戰3:從零開始編寫LED測試程序
參考《x4418 android平台用戶手冊》。
實戰4:建立第一個APK應用程式,通過JNI+NDK調用底層驅動
參考《x4418 android平台用戶手冊》。
實戰5:修改VGA解像度
參考《x4418 android平台用戶手冊》。
實戰6:如何修改init.rc文件
永久修改
在system/core/rootdir目錄下找到init.rc文件,修改後執行./mk.sh –s,將會生成新的system.img文件,重新燒寫system.img即可更新init.rc。注意,在編譯時,首先需要先將out目錄下的init.rc刪除後再編譯,否則可能不會生效。
臨時修改
注意:以下步驟為基於x3288平台的修改步驟,在x3399平台下大同小異,讀者可以先行嘗試,後續我們將發佈基於x3399平台的修改腳本。
默認init.rc在ramdisk.img中,ramdisk.img又被打包到boot.img中,因此,如果我們需要臨時修改boot.img,首先需要解壓boot.img,再手動修改我們需要修改的內容,再打包即可。為此,我們特別編寫了解壓和壓縮的腳本文件。
在android根目錄下,新建腳本文件ramdisk.sh,編輯內容如下:
<nowiki>#!/bin/bash # create: liuqiming # date: 2016-11-22 # mail: liuqiming@9tripod.com echo "Modify boot.img" echo "1.unzip boot.img" echo "2.Create boot.img" echo "3.delete cache files" echo "4.exit" #准备工作,环境变量的声明 SOURCE_DIR=$(cd `dirname $0` ; pwd) TOOLS_DIR=${SOURCE_DIR}/tools TARGET_DIR=${SOURCE_DIR}/out/release OUT=${SOURCE_DIR}/out/target/product/rk3288 PATH=${SOURCE_DIR}/out/host/linux-x86/bin:$PATH; #读取要执行的操作索引 read -p "Choose:" CHOOSE #解压boot.img if [ "1" = ${CHOOSE} ];then echo "unzip boot.img" cd $TARGET_DIR #第一步:新建ramdisk目录 [ -e "ramdisk" ] ||{ echo "mkdir ramdisk"; mkdir ramdisk;} #第二步:判断是否存在boot.img文件 [ -f "$TARGET_DIR/boot.img" ] || { echo "error! can't find boot.img!"; rm -rf ramdisk;exit; } cd ramdisk #第三步:拷贝boot.img cp ../boot.img . #第四步:解压boot.img文件,得到boot.img-ramdisk.gz文件 [ -f "/bin/split_bootimg.pl" ] || { cp $TOOLS_DIR/split_bootimg.pl /bin; } split_bootimg.pl boot.img rm -f boot.img #第五步:解压boot.img-ramdisk.gz文件 gzip -dc boot.img-ramdisk.gz | cpio -i echo "^_^ unzip boot.img finished!" rm -f boot.img-ramdisk.gz rm -f boot.img-second.gz rm -f boot.img-kernel exit #打包boot.img elif [ "2" = ${CHOOSE} ];then echo "create boot.img with kernel..." #第一步:判断是否存在ramdisk目录 [ -e "$TARGET_DIR/ramdisk" ] || { echo "can't find [ramdisk],please unzip boot.img first!"; exit; } #第二步:去除默认的root.img文件 rm -f $TARGET_DIR/boot.img cd $TARGET_DIR #第三步:将当前目录所有文件打包到boot.img [ -d $TARGET_DIR/ramdisk ] && \ mkbootfs $TARGET_DIR/ramdisk | minigzip > $TARGET_DIR/ramdisk.img && \ truncate -s "%4" $OUT/ramdisk.img && \ mkbootimg --kernel ${OUT}/kernel --ramdisk ${OUT}/ramdisk.img --second $TARGET_DIR/resource.img --output $TARGET_DIR/boot.img rm -rf ramdisk exit #清除残余文件 elif [ "3" = ${CHOOSE} ];then cd ${TARGET_DIR} rm -rf ramdisk echo "^_^ delete cache files ok!" #退出脚本 elif [ "4" = ${CHOOSE} ];then exit fi 执行./ramdisk.sh,输入1,回车,将会自动解压out/release目录下的boot.img,并存放到out/release/ramdisk目录。 执行./ramdisk.sh,输入2,回车,将会自动将out/release/ramdisk目录下的文件打包成boot.img。
實戰7:如何修改開機動畫
默認android啟動時,會有android的英文字母不斷高亮滾動顯示,構成了一幅美麗的開機動畫。其實這個開機動畫是可以定製的,有興趣的讀者可以自行嘗試。
實戰8:如何修改uboot中的開機LOGO
在kernel根目錄下,存放有logo.bmp和logo_kernel.bmp兩張圖片,在編譯內核後,他們會被打包到resource.img中。開機啟動時,uboot會從中讀取logo.bmp並顯示出來。默認uboot只支持8b模式的圖像讀取,且必須為BMP格式。找一張解像度不是太大的圖片,轉換成BMP格式,在WINDOWS的圖片編輯軟件下轉換成8b模式後,替換kernel根目錄下的logo.bmp即可。注意,如果解像度過大,可能會無法顯示。
實戰9:如何修改內核中的LOGO
修改內核的LOGO和修改uboot的LOGO方法類似,所不同的是,我們需要修改logo_kernel.bmp文件,而不是logo.bmp文件。如果我們只需要顯示一幅圖片,刪掉logo_kernel.bmp即可。
實戰11:使用git管理原始碼
在我们最开始编码时,就应该养成使用git等工具管理源码的好习惯。这里简单介绍git的一些常用操作,具体更深入的学习,需要读者深入研究。
git指令
1).初始化倉庫
git init
2).查看版本庫的狀態
git status
3).查看版本庫的狀態
git log
4).提交文件到倉庫索引中
git add . ---提交当前目录所有修改
git add hello.c example.c ---提交两个文件到仓库索引
5).提交內容到倉庫:
git commit -a -m "yx modify some files"
6).比較當前的工作目錄和倉庫數據庫中的差異
git diff ---建议使用windows 客户端
7).恢復到某個版本
git reset --hard 8f097e ---恢复到某个历史版本
8).打標籤
git tag V1.01 8f097e -m "20100101发布" ---给某个版本打上标签
git tag -d V1.01 ---删除标签
9).clone倉庫
git clone git@172.18.0.198:boot ---clone仓库到当前目录
git clone git@172.18.0.198:boot temp ---clone仓库到temp目录
10)服務器倉庫同步到本地
git pull ---将服务器最新内容同步到本地
11).將本地倉庫中的內容同步到服務器中
git push ---提交当前目录修改记录到服务器(服务器已存在此目录)
git push git@172.18.0.198:FCR/K660/app master ---提交当前目录修改到服务器(服务器不存在此目录)
12).查看項目版本更新細節
git show 18183e ---显示当前分支的最新版本的更新细节
初始化git倉庫
在第一次解壓android源碼後,進入android根目錄,更新本地Git倉庫:
<nowiki> cd android_gingerbread #进入工作目录 git init-db #初始化工作目录 git add . #将工作目录的所有文件添加进来以便跟踪管理 git commit -a #将所监视的文件提交到仓库 sudo apt-get install qgit 第一次建立仓库后,给出第一次提交: git commit -m "初始化工程" 否则,输入git log时,会提示如下错误: fatal: bad default revision 'HEAD'
恢復到上一版本
首先,使用git log命令查詢修改記錄:
<nowiki> lqm@lqm:~/android_gingerbread$ git log commit d5fd5223fd354c0a9c63057a7b8fe9a6870bdd7e Author: lqm <lqm@lqm.(none)> Date: Wed Dec 14 10:34:34 2011 +0800 删除不必要的处理器文件 commit 1af4b99d582bf33cc2f37a0529554426b30a168d Author: lqm <lqm@lqm.(none)> Date: Wed Dec 14 10:14:39 2011 +0800 初始化工程 lqm@lqm:~/android_gingerbread$ 再使用git reset指令恢复到某个提交状态: lqm@lqm:~/android_gingerbread$ git reset --hard 1af4b Checking out files: 100% (12517/12517), done. HEAD is now at 1af4b99 初始化工程 lqm@lqm:~/android_gingerbread$
修改源碼後,提交修改記錄
修改了某些文件,需要提交到服務器,具體操作如下:
第一步:使用git pull將服務器倉庫提交到本地
提示出錯,有兩種解決辦法,第一種,先將drivers/mtd/nand/nand_base.c備份,比如:mv drivers/mtd/nand/nand_base.c drivers/mtd/nand/nand_base.c.bak
然後再執行git pull。第二種,執行git checkout –f,然後再執行git pull。
正常的操作如下:
上面的提示文件為服務器上已經更新的文件,執行git pull後,已經同步到本地了。
第二步:使用git status,查看修改的文件:
上圖表示本地修改了build/mk和common/env_common.c兩個文件。
第三步:使用git add指令將指定的文件提交到倉庫索引
git add . #将当前目录所有修改的文件提交到仓库索引
或者使用下面的指令:
git add build/mk #将指定的文件提交到仓库索引,env_common.c并未提交。
第四步:使用
git commit #命令注释修改的内容到仓库
第五步:使用
git push #指令将修改的文件提交到服务器
說明:如果源碼保存在本機上,不用操作第一步和第五步。
實戰13:如何打包整個android bsp包
這裏推薦兩種常用的打包方法。
使用tar指令
通常在編譯完android源碼包後,在android源碼目錄中會生成各種釋放文件,它統統被匯集到源碼根目錄的out目錄,打包時我們需要將它排除在外。另外,使用git管理工具管理源碼時,在android源碼根目錄會生成.git目錄,隨着修改次數的增加,該目錄內容會越來越多,打包時也需要將它排除在外。
由於在整個android源碼中,存在其他的out目錄,為了在使用tar指令打包時,防止將這些目錄也排除在外,因此我們可以首先將源碼根目錄的out目錄重命名,如out_x3399,再執行打包指令。打包完成後,再將out_x3399還原成out即可。
另外,如果編譯了uboot,內核等,在源碼包中會存在很多*.o,*.cmd的臨時文件,這些也是我們所不需要的,在打包時也一併排除在外。
在android源碼總目錄的同級目錄下執行如下指令完成打包:
mv x3399_marshmallow\out x3399_ marshmallow \out_x3399 tar jcvf x3399_ <nowiki>marshmallow.tar.bz2 x3399_ marshmallow –exclude=”.git” –exclude=”out_x3399” –exclude=”*.o” –exclude=”*.cmd” mv x3399_ marshmallow \out_x3399 x3399_ marshmallow\out
使用git指令
使用git指令打包源碼的前提是整個android源碼包已經由git管理起來。在android源碼包的根目錄下(包含有uboot,kernel等目錄的同一級目錄)使用如下指令打包整個源碼包:
git archive --format=tar HEAD > x3399_ marshmallow.tar;bzip2 x3399_ marshmallow.tar
實戰15:android調試技巧之mm指令
在Android SDK源碼工程下,如果編譯整個工程可能需要兩三個小時,即使二次編譯也要二十多分鐘。如果只想單獨編譯某個APK應用,那麼可以這樣做:
1)在build目錄下執行
. envsetup.sh (注意,命令前面有一个点,然后接一个“空格”键)
執行完後,就會多出以下幾個命令:
<nowiki> - croot: Changes directory to the top of the tree. - m: Makes from the top of the tree. - mm: Builds all of the modules in the current directory. - mmm: Builds all of the modules in the supplied directories. - cgrep: Greps on all local C/C++ files. - jgrep: Greps on all local Java files. - resgrep: Greps on all local res/*.xml files. /*???*/ - godir: Go to the directory containing a file. - printconfig: 当前build的配置情况
2)mm命令
用於當前目錄下的工程
3)mmm命令
用於編譯指定目錄,如:
mmm Settings 表示編譯Settings這個目錄,之後會生成新的apk
實戰16:ubuntu下minicom的設置
在做項目開發時,串口調試已經成為我們開發的必備工具。但是現在很多主板,或是筆記本上都已經省掉了串口,這對我們開發人員來說,無疑會帶來些不必要的麻煩。為此,我們可能會通過PCI轉串口,USB轉串口等來開發。值得慶幸的是,在windows下使用的人多,我們很容易就能夠安裝PCI轉串口驅動或是USB轉串口驅動。如果我們使用純的linux系統開發,安裝驅動可能就沒這麼簡單了。因此,這裏分享一些我們實際開發中總結的一些經驗,避免新人多走彎路。
通用串口的minicom設置方法
通常情況下,PC機上自帶的串口,在windows和ubuntu下都自帶驅動了,這時安裝就比較簡單了。
第一步:安裝minicom
sudo apt-get install minicom
第二步:設置minicom的端口
sudo minicom -s
界面如下:
<nowiki> +-----[configuration]------+ | Filenames and paths | | File transfer protocols | | Serial port setup | | Modem and dialing | | Screen and keyboard | | Save setup as dfl | | Save setup as.. | | Exit | | Exit from Minicom | +--------------------------+ 通过键盘的上下键盘选择到Serial port setup,回车 +-----------------------------------------------------------------------+ | A - Serial Device : /dev/ttyWCH1 | | B - Lockfile Location : /var/lock | | C - Callin Program : | | D - Callout Program : | | E - Bps/Par/Bits : 115200 8N1 | | F - Hardware Flow Control : No | | G - Software Flow Control : No | | | | Change which setting? | +-----------------------------------------------------------------------+
輸入A,光標會停留到Serial Device的界面,將設備節點設置為/dev/ttyS0;輸入F,關閉硬流控;再回車,退出當前設置,回到上一界面,選擇Save setup as dfl,再選擇Exit退出設置。到此,minicom安裝完成。
USB轉串口安裝方法
這裏以PL2303的驅動IC為例。默認ubuntu10.10系統已經自帶有PL2303的驅動了。因此,這個安裝比較簡單。
第一步:將USB轉串口延長線連接到PC機的USB口,啟動ubuntu系統;
第二步:執行如下指令檢查是否有USB轉串口的設備節點:
lqm@lqm:~$ ls /dev/ttyU*
/dev/ttyUSB0
第三步:重新設置minicom的設備節點,方法同上;
第四步:打開minicom,測試USB轉串口是否能正常使用。
PCI轉串口安裝方法
PCI轉串口的晶片比較多,這裏以CH35X為例,講述在ubuntu下的安裝方法。
第一步:下載最新的安裝包CH35XDRV.ZIP,或者從光盤裏面獲得;
第二步:將CH35XDRV.ZIP拷貝到ubuntu的任意目錄並解壓,得到CH35XDRV目錄,使用命令終端進入該目錄,示例如下:
lqm@lqm:~/下载/CH35XDRV/CH35XDRV$ pwd /home/lqm/下载/CH35XDRV/CH35XDRV lqm@lqm:~/下载/CH35XDRV/CH35XDRV$ ls CH35X??-???+?-??+-?+?.chm DRV_16S DRV_1P DRV_1S DRV_1S1P DRV_2S DRV_2S1P DRV_2S1P_RA DRV_4S DRV_4S1P DRV_6S DRV_8S <nowiki>PCISETUP.exe README.TXT SETUPX64 TOOLS lqm@lqm:~/下载/CH35XDRV/CH35XDRV$ cd DRV_2S lqm@lqm:~/下载/CH35XDRV/CH35XDRV/DRV_2S$ ls DOS LINUX WINDOWS lqm@lqm:~/下载/CH35XDRV/CH35XDRV/DRV_2S$ cd LINUX/ lqm@lqm:~/下载/CH35XDRV/CH35XDRV/DRV_2S/LINUX$ ls driver Makefile README wchdump wchmknod wchterm lqm@lqm:~/下载/CH35XDRV/CH35XDRV/DRV_2S/LINUX$
第三步:在LINUX目錄下執行如下命令安裝:
sudo make clean
sudo make install
實際操作時發現有如下錯誤提示:
cd wchmknod;\ ./wchmknod /bin/sh: line 1: ./wchmknod: 权限不够 <nowiki>make: *** [wchmknod_install] 错误 126 root@lqm:/home/lqm/下载/CH35XDRV/CH35XDRV/DRV_2S/LINUX# 进入./wchmknod目录,更改wchmknod文件权限,再编译即可: root@lqm:/home/lqm/下载/CH35XDRV/CH35XDRV/DRV_2S/LINUX# cd wchmknod/ root@lqm:/home/lqm/下载/CH35XDRV/CH35XDRV/DRV_2S/LINUX/wchmknod# ls wchmknod root@lqm:/home/lqm/下载/CH35XDRV/CH35XDRV/DRV_2S/LINUX/wchmknod# ls -la 总计 12 drwxrwxrwx 2 lqm lqm 4096 2011-04-29 16:55 . drwxrwxrwx 6 lqm lqm 4096 2011-04-29 16:55 .. -r--r--r-- 1 lqm lqm 936 2010-09-20 04:48 wchmknod root@lqm:/home/lqm/下载/CH35XDRV/CH35XDRV/DRV_2S/LINUX/wchmknod# chmod 777 wchmknod 再make install,即可安装成功。
第四步:執行如下指令加載驅動
modprobe wch
或者
insmod driver/wch.ko
第五步:使用如下指令查詢驅動是否正常加載:
lsmod | grep wch
示例如下:
<nowiki> lqm@lqm:~/下载/CH35XDRV/CH35XDRV/DRV_2S/LINUX$ lsmod |grep wch wch 58933 1 lqm@lqm:~/下载/CH35XDRV/CH35XDRV/DRV_2S/LINUX$
這裏查找到了已經加載的驅動,表明驅動加載成功。
第六步:查看/dev下生成的相關節點:
<nowiki> lqm@lqm:~/下载/CH35XDRV/CH35XDRV/DRV_2S/LINUX$ ls /dev/ttyWCH* /dev/ttyWCH0 /dev/ttyWCH11 /dev/ttyWCH14 /dev/ttyWCH17 /dev/ttyWCH2 /dev/ttyWCH22 /dev/ttyWCH25 /dev/ttyWCH28 /dev/ttyWCH30 /dev/ttyWCH4 /dev/ttyWCH7 /dev/ttyWCH1 /dev/ttyWCH12 /dev/ttyWCH15 /dev/ttyWCH18 /dev/ttyWCH20 /dev/ttyWCH23 /dev/ttyWCH26 /dev/ttyWCH29 /dev/ttyWCH31 /dev/ttyWCH5 /dev/ttyWCH8 /dev/ttyWCH10 /dev/ttyWCH13 /dev/ttyWCH16 /dev/ttyWCH19 /dev/ttyWCH21 /dev/ttyWCH24 /dev/ttyWCH27 /dev/ttyWCH3 /dev/ttyWCH32 /dev/ttyWCH6 /dev/ttyWCH9 lqm@lqm:~/下载/CH35XDRV/CH35XDRV/DRV_2S/LINUX$
表明節點已經成功生成。
第七步:使用minicom設置節點
sudo minicom -s
選擇Serial port setup,回車,再選擇A,將設備節點設置為/dev/ttyWCH0或/dev/ttyWCH1
保存退出,再開啟minicom:
<nowiki> Welcome to minicom 2.4 OPTIONS: I18n Compiled on Jun 3 2010, 13:46:31. Port /dev/ttyWCH1 Press CTRL-A Z for help on special keys OK U-Boot 1.3.4-dirty (Apr 20 2012 - 09:02:38) for SMDKV210 CPU: S5PV210@1000MHz(OK) APLL = 1000MHz, HclkMsys = 200MHz, PclkMsys = 100MHz MPLL = 667MHz, EPLL = 96MHz HclkDsys = 166MHz, PclkDsys = 83MHz HclkPsys = 133MHz, PclkPsys = 66MHz SCLKA2M = 200MHz
可見,PCI轉串口驅動已經能夠正常使用了。
第八步:以上步驟,僅僅是臨時加載了驅動,ubuntu系統重啟後,wch.ko文件並沒有自動加載。因此,需要在ubuntu的啟動腳本裏面添加自動加載的命令。
編輯/etc/rc.d/rc.local文件,在最末尾添加如下語句:
modprobe wch
第九步:重啟ubuntu系統,再次嘗試串口是否能正常使用。