編輯:關於Android編程
Android准備往OpenWrt上移植
這兩天全力編譯android,cpu 4個線程全開,磁盤大吞吐的存取,導致溫度過高,編譯中間筆記本保護性質的自動休眠關機。
不說廢話,進入正題。
友善的mini6410自帶的是android-2.3.4,而tiny210自帶android-2.3.1(以及Android-4.0.3),我想把他們統一到android-2.3.7_r1,然後放到OpenWrt框架下。
之前nbd維護的android-1.6 for OpenWrt早就因為google android服務器的更換而不能夠正常運行了。而nbd現在維護的是android 4.0,但是據他自己說只有dalvik可能能夠運行,但是我沒有編譯成功。
總之,在openwrt下的qpe已經完成的情況下,我想把android拉到openwrt下。
目前進展:
[cpp]
ok 0 安裝beyond compare,或使用diff腳本,測試、對比,得到files-patches;
ok 1 編譯tiny210自帶的android-2.3.1源代碼;
ok 2 編譯原始android-2.3.1的goldfish;
ok 3 編譯原始android-2.3.1 + tiny210的files-patches補丁;
4 精簡2.3.1補丁,去除不需要的補丁,再往2.3.7上移植;
5 分析android和nbd的源代碼,把2.3.7移植到openwrt框架上;
升級路線:
[cpp]
|--------------------------------------------------------
| (低原始) --\
| =>得到 (低差異) --\
| (低已好) --/ =>結合 得到 (高版本)
| (高原始) --/
|--------------------------------------------------------
原則只添不減(除非不可共存,相沖突)!
android的移植按如下流程:
1 android linux內核的普通驅動移植,讓內核可以在目標平台上運行起來。
2 正確掛載文件系統:確保內核啟動參數,和android源代碼system/core/rootdir目錄下的init.rc中的文件系統掛載正確。
3 調試控制台,讓內核啟動參數中的console參數,和android源代碼system/core/init/init.c中的console_name設置和硬件保持一致。
4 打開android相關的驅動(logger,binder等),串口輸入logcat看logger驅動起來,沒有的話調試logger驅動。
Android源代碼結構分析:
[cpp]
----------------
├── Makefile 全局的Makefile
├── build 系統編譯規則和配置所需要的腳本和工具
----------------
├── prebuilt 各種平台編譯工具鏈
├── bionic 基礎C庫源代碼
----------------
├── frameworks * Android應用程序的核心框架層(java及C++語言)
├── system * 底層文件系統/庫/應用及組件(C語言)
├── dalvik JAVA虛擬機
├── external android使用的一些額外開源庫
├── libcore 與媒體播放框架代碼相關
----------------
├── packages 各種應用程序實例
├── development 程序開發所需要的實例/模板/工具
----------------
├── ndk
├── sdk
├── cts Android CTS兼容性規范測試用例
----------------
├── vendor * 廠商定制代碼
├── device * 廠商定制代碼
├── hardware * 一些與硬件相關的庫,部分廠家開源的硬解適配層HAL代碼
├── kernel * Linux源代碼
├── bootable 引導加載器
├── recovery 與目標的恢復功能相關
----------------
Android移植主次順序:
[cpp]
----------------
├── kernel * (自帶,完成) Linux源代碼
----------------
├── build (1稍變化)(針對64 JDK) (變化要改) 系統編譯規則和配置所需要的腳本和工具
----------------
├── vendor * (2最主要)(完成,相同) (變化要改) 廠商定制代碼
├── device * (2最主要)(完成,相同) (變化要改) 廠商定制代碼
├──+frameworks *x (2最主要)(完成,不同,未改動docs,core/tests) (變化要改) 和硬件有關的核心框架中C/C++語言要根據情況修改
----------------
├── system * (3主要)(完成,相同) (變化要改) 底層文件系統/庫/應用及組件(C語言)
├── hardware * (3主要)(完成,相同) (變化要改) 一些與硬件相關的庫,部分廠家開源的硬解適配層HAL代碼
├── external x (3主要)(完成,只添加libusb未刪除tcpdump) (變化要改) 依賴的額外開源庫
├── libcore x (3次要)(變化,但未改,不同) (變化可不改) 與媒體播放框架代碼相關
----------------
├── packages (4次要)(完成,相同) (變化要改) 各種應用程序實例
├──+frameworks x (4次要)和圖像界面有關的java程序根據需要修改
----------------
├── development (4次要,變化)(完成,相同) (變化可不改) 程序開發所需要的實例/模板/工具
├── cts (0變化,不改) Android CTS兼容性規范測試用例
├── ndk (0變化,不改)
├── prebuilt (0變化,不改) 各種平台編譯工具鏈
├── bionic (0無變化) 基礎C庫源代碼
├── dalvik (0無變化) JAVA虛擬機(dalvik是依賴於bionic編譯的)
├── bootable (0無變化) 引導加載器
├── Makefile (0無變化) 全局的Makefile
├── sdk (0無變化)
----------------
出錯及總結:
上面這1,2,3,4四個部分,都能夠編譯成功,只是在第3步以後才能夠在tiny210上運行android!
1 出錯:庫定義重復
[cpp]
build/core/base_rules.mk:158: *** device/samsung/crespo/sec_mm/sec_omx/sec_osal: MODULE.TARGET.STATIC_LIBRARIES.libsecosal already defined by device/samsung/sec_mm/sec_omx/sec_osal
原因:device/samsung/crespo/下的sec_mm/和device/samsung/下的sec_mm/定義重復!!
刪除device/samsung/crespo後就ok了!
2 只進行到第二部分時,測試出錯:內核不能夠啟動android
tslib可以運行,但是tslib運行過後就kernel出錯!
[cpp]
[ 4.646506] IP-Config: Complete:
[ 4.646537] device=eth0, addr=192.168.0.101, mask=255.255.255.0, gw=192.168.0.1,
[ 4.646617] host=www, domain=, nis-domain=richardnee.com,
[ 4.646668] bootserver=192.168.0.100, rootserver=192.168.0.100, rootpath=
[ 4.648401] DBUG_PORT must not use AFC!
[ 4.652312] Freeing init memory: 1436K
1Wire touchscreen OK
TouchDevice: /dev/touchscreen-1wire
xres = 800, yres = 480
[ 3.149864] mmc0: new high speed MMC card at address 0001
[ 3.150163] mmcblk0: mmc0:0001 000000 122 MiB
[ 3.150478] mmcblk0: p1
[ 3.642449] eth0: link up, 100Mbps, full-duplex, lpa 0x45E1
[ 4.646498] IP-Config: Complete:
[ 4.646529] device=eth0, addr=192.168.0.101, mask=255.255.255.0, gw=192.168.0.1,
[ 4.646609] host=www, domain=, nis-domain=richardnee.com,
[ 4.646659] bootserver=192.168.0.100, rootserver=192.168.0.100, rootpath=
[ 4.648398] DBUG_PORT must not use AFC!
[ 4.652309] Freeing init memory: 1436K
[ 4.926688] init: cannot open '/initlogo.rle'
[ 4.943464] Kernel panic - not syncing: Attempted to kill init!
[ 4.943526] Backtrace:
[ 4.943577] [<c0173efc>] (dump_backtrace+0x0/0x110) from [<c05c2be0>] (dump_stack+0x18/0x1c)
[ 4.943653] r6:dfc34000 r5:c07dc2a0 r4:c07daafc r3:00000000
[ 4.943720] [<c05c2bc8>] (dump_stack+0x0/0x1c) from [<c05c2c58>] (panic+0x74/0xf0)
[ 4.951291] [<c05c2be4>] (panic+0x0/0xf0) from [<c0196a00>] (do_exit+0x74/0x5f4)
[ 4.958492] r3:c07dc2a0 r2:00000000 r1:00000025 r0:c0734e90
[ 4.964118] [<c019698c>] (do_exit+0x0/0x5f4) from [<c0197264>] (do_group_exit+0x98/0xc8)
[ 4.972189] r7:dfc02200
[ 4.974690] [<c01971cc>] (do_group_exit+0x0/0xc8) from [<c01a1d64>] (get_signal_to_deliver+0x358/0x394)
[ 4.984120] r7:dfc02200 r6:dfc37ec8 r5:00106001 r4:dfc36000
[ 4.989682] [<c01a1a0c>] (get_signal_to_deliver+0x0/0x394) from [<c0172cd8>] (do_signal+0x70/0x688)
[ 4.998709] [<c0172c68>] (do_signal+0x0/0x688) from [<c01738e4>] (do_notify_resume+0x20/0x50)
[ 5.007203] [<c01738c4>] (do_notify_resume+0x0/0x50) from [<c0170010>] (work_pending+0x1c/0x20)
[ 5.015857] r4:ffffffff r3:00000000
[ 5.019401] Rebooting in 5 seconds..
[ 5.884652] eth0: no IPv6 routers present
[ 5.264526]
[ 5.264545] Restart
解決方法:在第三部分system和hardware修改完成後,ok,android可以啟動!
3 出錯:java找不到符號
[cpp]
Install: out/target/product/smdkv210/system/app/QuickSearchBox.apk
target Java: Settings (out/target/common/obj/APPS/Settings_intermediates/classes)
packages/apps/Settings/src/com/android/settings/DisplaySettings.java:40: 軟件包 com.slsi.sec.android 不存在
import com.slsi.sec.android.HdmiService;
^
packages/apps/Settings/src/com/android/settings/DisplaySettings.java:64: 找不到符號
符號: 類 HdmiService
位置: 類 com.android.settings.DisplaySettings
private HdmiService mHdmiService;
^
packages/apps/Settings/src/com/android/settings/DisplaySettings.java:110: 找不到符號
符號: 類 HdmiService
位置: 類 com.android.settings.DisplaySettings
mHdmiService = new HdmiService();
^
358 Copying: out/target/common/obj/JAVA_LIBRARIES/android.policy_intermediates/emma_out/lib/classes-jarjar.jar
359 target Java: services (out/target/common/obj/JAVA_LIBRARIES/services_intermediates/classes)
360 frameworks/base/services/java/com/android/server/MountService.java:1105: 找不到符號
361 符號: 變量 usbdisk
362 位置: 類 com.android.internal.R.drawable
363 myNoti.icon = com.android.internal.R.drawable.usbdisk;
364 ^
target Java: SystemUI (out/target/common/obj/APPS/SystemUI_intermediates/classes)
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarService.java:348: 找不到符號
符號: 變量 net3g
位置: 類 com.android.internal.R.drawable
setStatusIcon(com.android.internal.R.drawable.net3g, "Connected. (FriendlyARM-3G)");
^
注意:frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/Ticker.java 使用了未經檢查或不安全的操作。
注意:要了解詳細信息,請使用 -Xlint:unchecked 重新編譯。
這一情況是,一開始沒有把slsi補丁加上去,而是中間加上的。
我在網上搜索了半天也沒解決。
後來干脆把這幾個變量注釋掉,先讓編譯順利進行,注釋:
[cpp]
com.slsi.sec.android.HdmiService
com.android.internal.R.drawable.usbdisk
com.android.internal.R.drawable.net3g
後來發現這個usbdisk,net3g等都是tiny210的BSP,所以我在考慮是不是因為slsi補丁中間加上去,所以就沒有把路徑加對?
重試了一下,果然,先把slsi補丁加上,就不會出現java變量找不到的錯誤!!!
Android中的動畫分為視圖動畫(View Animation)、屬性動畫(Property Animation)以及Drawable動畫。從Android 3.0(A
(一).前言:前面我們已經對於AndroidAnnotations框架的線程處理做了講解,今天我們開始具體學習一下第三方框架集成。 (二
本章內容第1節 線性布局第2節 相對布局第3節 幀布局第4節 表格布局第5節 網格布局 線性布局線性布局使用標簽進行配置,對應代碼中的類是android.wid
一、先在中文官網官網地址找到教案。二、Homebrew裝上(mac版本直接輸入下面的命令)。/usr/bin/ruby -e "$(curl -fsSL htt