posts - 33, comments - 0, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            google的android很多人都希望在gphone沒有出來之前,把它移植到相關的硬件平臺上去。網上看了不少文章,總的感覺是:在這一步走得最遠的就是openmoko的一個大師級別的黑客Ben “Benno” Leslie,他曾經試圖把目前google發布的android移植到openmoko的平臺上去,并且做了10000多行代碼的嘗試。最終雖然由于 open moko采用比較老的arm 920t的內核,而android采用較新的arm926-ej-s內核,而且使用了新的內核的一些新特性,導致移植失敗,但是anyway,他已經做了足夠多的前期工作了,爾后的宣布成功移植android到real target板子上的人,大多是在他提供的patch的基礎上繼續走下去做出來的。

          下面是一些有用的參考,希望有助于對此感興趣的開發人員:
          (1)Ben “Benno” Leslie的關于andorid移植到openmoko的個人博客地址:
          http://benno.id.au/blog/

          (2)早期宣布成功移植android到zauraus-sl-c760的詳細方法描述的鏈接:
          http://euedge.com/blog/2007/12/06/google-android-runs-on-sharp-zaurus-sl-c760/

          (3)后續的根據上述先行者們的工作,成功移植android到zauraus-c3000的方法:
          http://androidzaurus.seesaa.net/article/74237419.html

          (4)本文是參考下面的wiki,接合個人的實踐寫出來的,對原文的作者表示一下感謝:
          http://wiki.droiddocs.net/Compilation_of_Android_kernel

            很羨慕這些人阿!

            不過很可惜,偶的開發板是s3c2410的,恰好是arm920t的核心的。。。估計移植上去戲不是很大,需要重寫很多代碼,畢竟偶跟benno相差得太遠太遠了,同樣是開發人員,差距咋就那么大呢?!(畢竟google僅僅開放了kernel的源代碼而已,他們需要開放的東西還很多。)

            在這里把關于android內核編譯方法簡單寫一下,或許對希望移植內核的朋友能有些幫助:
          (看了Benno的移植過程以后,覺得即使你能夠編譯google開放出來的內核,意義也不是特別大,因為這個內核中加入了為了支持qemu的很多東西,而這些代碼似乎對希望移植到真機上的朋友來說,沒有任何意義,反而是一種阻礙)。

            1)從CodeSourcery上面載用于交叉編譯的工具鏈:http://www.codesourcery.com/gnu_toolchains/arm/download.html
          我在這里選擇的是->ARM GNU/Linux,以及IA32-GNU/Linux。有文章說應該選擇ARM EABI,我不知道了,沒有測試過,反正我選擇的這個編譯的內核也是可以跑起來的:P

            2)下載google的android linux的內核源代碼:http://code.google.com/p/android/downloads/list
          主要是這個文件:linux-2.6.23-android-m3-rc20.tar.gz

            3)把下載到的內核和交叉編譯工具解壓縮,并最好把工具鏈的路徑放到PATH里面去
          解壓縮內核:
           $ mkdir -p android
           $ cd android
           $ tar xzvf ../linux-2.6.23-android-m3-rc20.tar.gz
           會解壓出來一個叫做kernel的目錄,google的android的linux內核就在里面了。

          解壓縮交叉編譯工具鏈:
           $ cd /usr/local/
           $ sudo cp ~/arm-2007q3-51-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 .
           $ sudo tar zxvf arm-2007q3-51-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
          此時會解壓出來一個叫做arm2007q3的一個目錄,這里面就是工具鏈了。

          設置一下環境變量:
           $ export PATH=$PATH:/usr/local/arm2007q3/bin
          好了,到此,基本的內核編譯環境就搞好了。

            4)現在是要得到android的內核編譯參數的配置文件的時候了,該文件需要從已經安裝好的android的模擬器
          中得到才行。所以安裝android的sdk也是必須的,這一步不太明白的朋友可以參考我以前發的android
          命令行體驗的文章。
          首先啟動android模擬器,然后通過adb得到模擬器中提供的內核配置文件:
           $emulator &
           $adb pull /proc/config.gz .
          這時候adb工具會連接模擬器,并從它里面下載一個叫做config.gz的文件到你的當前目錄下。
          把它拷貝到你的kernel目錄:
           $cd ~/android/kernel
           $cp ~/config.gz .
          解壓縮該文件,并重命名為.config,這一步做了就可以跳過make menuconfig之類的內核參數設置
          動作了。
           $gunzip config.gz
           $mv config .config

            5)修改kernel目錄中的Makefile文件,用emacs或vi打開該Makefile

          修改CROSS_COMPILE變量為:
          CROSS_COMPILE=arm-none-linux-gnueabi-
          這個就是剛剛的下載和解壓的工具鏈的前綴了,旨在告訴make,在編譯的時候要使用我們的工具鏈。

          在Makefile中注釋掉LDFLAGS_BUILD_ID這個變量:
          例如將如下定義:
          LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,\
                            $(call ld-option, -Wl$(comma)--build-id,))
          修改為:
          LDFLAGS_BUILD_ID=
          #LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,\
          #                  $(call ld-option, -Wl$(comma)--build-id,))
          把它注釋掉的原因是目前android的內核還不支持這個選項。--build-id選項,主要是用于在生成的elf
          可執行文件中加入一個內置的id,這樣在core dump,或者debuginfo的時候就可以很快定位這個模塊是
          哪次build的時候弄出來的。這樣就可以避免,每次都把整個文件做一遍效驗,然后才能得到該文件的是由
          哪次build產生的。對于內核開發者來說,這是很不錯的想法,可以節約定位模塊版本和其影響的時間。
          目前,該功能還出于early stage的狀態,未來的android或許會支持,但至少目前的版本是不支持的。
          所以,用#注釋掉即可,或者害怕不保險的話,就加入LDFLAGS_BUILD_ID=空,這樣即使編譯的時候用了,
          也只是一個空格而已。
          對這個--build-id選項感興趣的朋友,可以訪問下面的網址,它的作者已經解釋得非常明白了:
          http://fedoraproject.org/wiki/Releases/FeatureBuildId

            6)終于可以開始make了。
           $ make
          不出意外的話,應該整個過程都會非常順利,最終會在~/android/kernel/arch/arm/boot目錄下面
          生成一個zImage,這個就是我們要的內核映像了。

            7)激動人心的時刻終于到來了,我們可以測試一下剛剛編譯出來的內核可以不可以用了。
           $emulator -kernel ~/android/kernel/arch/arm/boot/zImage
          當看到red eye在晃來晃去,最終顯示出來android的界面的時候,一顆懸著的心總算放下了。

          android的proc里面的version如下:
          # cat version
          Linux version 2.6.23 (wayne@wayne) (gcc version 4.2.1 (CodeSourcery Sourcery G++ Lite 2007q3-51)) #1 Sat Jan 19 18:11:44 HKT 2008
          從這里就可以看出,這是自己編譯的kernel,而不是人家sdk里面自帶的kernel-qemu了。

          android自帶的sdk里面的kernel映像的version應該是:
          # cat version
          Linux version 2.6.23-gcc3bc3b4 (arve@arvelnx.corp.google.com) (gcc version 4.2.1) #3 Tue Oct 30 16:28:18 PDT 2007
          hoho, 這里不會把這個開發者的email暴露出來了吧。。。

          android的cpuinfo如下:
          Processor       : ARM926EJ-S rev 5 (v5l)
          BogoMIPS        : 313.75
          Features        : swp half thumb fastmult vfp edsp java
          CPU implementer : 0x41
          CPU architecture: 5TEJ
          CPU variant     : 0x0
          CPU part        : 0x926
          CPU revision    : 5
          Cache type      : write-through
          Cache clean     : not required
          Cache lockdown  : not supported
          Cache format    : Harvard
          I size          : 4096
          I assoc         : 4
          I line length   : 32
          I sets          : 32
          D size          : 65536
          D assoc         : 4
          D line length   : 32
          D sets          : 512

          Hardware        : Goldfish
          Revision        : 0000
          Serial          : 0000000000000000
          不過挺奇怪的,google sdk自帶的內核映像的BogoMIPS是3.18的,偶編譯出來的是3.13的。

          posted @ 2011-08-31 09:25 馬航 閱讀(465) | 評論 (0)編輯 收藏

          環境:

             windows xp+vmware+redhat(ubuntu)

             說明:本篇所述環境也是Android原生(Native)C(JNI)開發的環境

          1,先下載個交叉編譯工具鏈版本

            http://www.codesourcery.com/sgpp/lite/arm/portal/subscription3057 選擇最新版本進入下載頁面后,選擇Advanced Packages的IA32 GNU/Linux TAR下載后文件名為arm-2010.09-50-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2

          2,上傳到/usr/local/后解壓tar jxvf arm-2010.09-50-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 到一個arm-2010.09

          3,測試,進入到/usr/local/arm-2010.09/bin目錄下,創建一個main.c文件,

          main.c內容

          #include <stdio.h>

          int main()

          {

            int i=0;

            printf("%d\n",i);

            return;

          }

          執行./arm-none-linux-gnueabi-gcc main.c 

          無報錯,生成a.out文件

          執行 ./arm-none-linux-gnueabi-gcc -v

          顯示版本信息 4.5.1 

          可以啦

          修改/etc/profile文件的PATH,將當前目錄/usr/local/arm-2010.09-50/bin加入到PATH里去

          source /boot/.bashrc 使修改立即生效

          實例測試:

          進入工作目錄 /home/android/jniTest

          創建文件main.c,文件內容

          #include <stdio.h>
          int main()
          {
            int i=0;
            printf("hi ym012 %d\n",i);
            return;
          }

          arm-none-linux-gnueabi-gcc -static main.c -o main
          啟動Android模擬器,先創建 /dev/sample目錄,再將編譯好的main上傳上去,最后將main改成可執行的。其命令如下

          adb shell mkdir /dev/sample                        //在模擬器下創建一個目錄
          adb push main /dev/sample/main                //將main文件上傳到/dev/sample/main

          adb shell chmod 777 /dev/sample/main      //修改成可執行文件

           再進入命令行模式,進入Android的模擬器的/dev/sample目錄執行hello:

          adb shell

          #cd /dev/sample

          #./hello                          //執行hello

          運行結果如下:

          hi ym012 0
          _______________

          總結:成功了!

          posted @ 2011-08-31 09:14 馬航 閱讀(572) | 評論 (0)編輯 收藏

              最近不單只是看android開發與測試相關知識,也在了解這之外相關的信息.畢竟,自己的眼界不能太狹窄.今天我在逛一個android論壇上時候看到一個很老的帖子,轉了個關于android被從linux分支樹上移除的新聞.
              以為是假新聞來著,后面上網找了找,還真是搜索出一堆結果,發現有些比較大的IT網站上也有.看樣子是假不了了.
              原文上說是linux內核開發者Greg Kroah-Hartman認為android"no one seemed to be working on it"
              想著android系統實際上使用了linux內核,而linux講究的是開源,android雖然開源,確實商用的.中間可能有沖突的地方.難道是其中某些沖突引起了這樣的結果?
              最后在維基百科上android詞條(http://zh.wikipedia.org/wiki/Android)頁面的結尾部分找到了這么一段:
              "
              Android是執行于Linux kernel之上,但并不是GNU/Linux。因為在一般GNU/Linux里支持的功能,Android大都沒有支持,包括Cairo、X11、 Alsa、FFmpeg、GTK、Pango及Glibc等都被移除掉了。Android又以bionic取代Glibc、以Skia取代Cairo、再 以opencore取代FFmpeg等等。Android為了達到商業應用,必須移除被GNU GPL授權證所約束的部份,例如Android將驅動程序移到userspace,使得Linux driver與Linux kernel徹底分開。bionic/libc/kernel/ 并非標準的kernel header files。Android的kernel header是利用工具由Linux kernel header所產生的,這樣做是為了保留常數、資料結構與宏。
              "
              可見,從最直觀上來看,android將linux內核拿過來之后去掉了不少功能,然后通過一些手段繞開了GPL授權.它的linux內核已經和GNU Linux相差的太大了.然而,更具體的情況是什么樣的呢?即android被移出linux分支樹的更具體的說明.

              終于找到了,摘抄在后面(摘自:http://www.ej38.com/showinfo/linux-199996.html)
          -----------------------------------------------------------------------------------------------------------------------------------------------------
              Greg Kroah-Hartman寫了一篇詳細的文章,解釋這個決定。下面就來看看,他是怎么說的,以及Android到底是一個什么樣的系統。
              在這之前,你最好知道Greg Kroah-Hartman是誰。他是目前LinuxKernel的核心開發人員,負責stable軟件包的發布。就是說,每一個新版本的 LinuxKernel,都是經過他的手流出來的。此外,他還負責硬件驅動的部署。而他的手機就是HTCG1,每天都在使用。所以,他是絕對有資格談論這 個問題的,他的看法代表了Linux社區對Android的看法。
              首先,他指出Android和其他的Linux發行版不一樣:
          “Google has taken the Linux kernel, and nothing else from a "traditional" Linux system. Google只用了kernel,別的東西都沒用。”
              這就是說,與Ubuntu、Debian、Redhat這樣的傳統Linux發行版相比,只有系統的底層結構是一樣的,其他東西在Android里都不一 樣,尤其是程序員的編程接口是完全不同的。因此,Android應用程序都必須重新寫過,現存的Linux程序無法移植上去。所以,從嚴格意義上 說,Android是一種全新的系統,它與Linux的距離,比Mac OS與Linux的距離還要遠。
              然后,Greg Kroah-Hartman肯定了Android這樣做的積極意義:
          “Android also solves the problem that the phone manufacturers hadbeen having for many years: a free version of Java and a unifiedapplication layer that programmers can write to that will work on allphone platforms that integrate it.
          它解決了長期令手機制造商頭痛不已的問題:業界缺乏一個開源的Java虛擬機,以及統一的應用程序接口。現在,程序員只要寫一次程序,就能在各種手機硬件平臺之上使用。”
              這段話解釋了,為什么Android的應用程序,都必須用Java語言開發。因為不這樣做的話,沒法讓程序做到硬件無關。且慢,這真的是理由嗎?傳統的 Linux系統,也并不依賴特定的硬件啊!只要把源代碼根據不同的平臺,分別編譯一下,同一個程序不也照樣可以在不同的硬件架構、不同的Linux發行版 中使用嗎?那么,Android只采用kernel、只允許用java編程的真正原因,到底是什么?
              臺灣的科技網志MMDays一語道破真相:“Linux kernel 的版權是 GPL。這下問題來了:如果你是硬件廠商,希望你的硬件能在 Linux kernel 下運作,那么就必須要有驅動程序。如果驅動程序的程序代碼公開,等于硬件規格也公開的差不多了。許多廠商不愿意這么做,所以就提供編好的驅動程序,但不提 供原始碼。Android 的重點就是商業應用,Google采用了一些手法來繞過這問題。他們把驅動程序移到"userspace",也就是說,把驅動程序變成在 Linux kernel 上頭跑,而不是一起跑的東西,這樣就可以避過GPL。然后,在kernel 這邊開個小門,讓本來不能直接控制到硬件的 "userspace" 程序也可以碰得到,這樣只要把"開個小門"的程序代碼公布就行啦。”看明白了嗎?
              這段話的意思是說,Google玩了一個花招,在kernel和應用程序之間,自己做了一個中間層,這樣就既不違反GPL許可,又能不讓外界看到廠商的硬件驅動和應用程序的源碼。
              里面的關鍵在于,Kernel和Android的許可證不一樣,前者是GPL許可證,后者是Apache SoftwareLicense(簡稱ASL)許可證。GPL許可證規定,對源碼的任何修改都必須開源,所以Android開源了,因為它修改了 Kernel。而ASL許可證規定,可以隨意使用源碼,不必開源,所以建筑在Android之上的硬件驅動和應用程序,都可以保持封閉。為了得到更多廠商 的支持,Google有意選擇了這樣做,并且特意修改Kernel,使得原本應該包括在kernel中的某些功能,都被轉移到了userspace之中, 因此得以避開開源。
              這樣做或許有利于推廣Android,吸引廠商和軟件開發商的加入,但是Google也放棄了構建一個真正開源的手機系統的機會,從而也就不能獲得由全世 界程序員提供智慧、分享代碼、推動創新的好處。關于許可證問題的深入討論,請閱讀Ryan Paul的文章《Why Google chose the Apache Software License over GPLv2 for Android》。
              Google的這種做法,直接后果就是給Linux Kernel帶來了麻煩。Greg Kroah-Hartman清楚地說出了自己的不滿。
          “...any drivers written for Android hardware platforms, can not getmerged into the main kernel tree because they have dependencies on codethat only lives in Google's kernel tree, causing it to fail to build inthe kernel.orgtree.所有為Android寫的硬件驅動,都不能合并入kernel。因為它們只在Google的代碼里有效,在kernel里 根本沒法用。
              Because of this, Google has now prevented a large chunk of hardwaredrivers and platform code from ever getting merged into the main kerneltree. Effectively creating a kernel branch that a number of differentvendors are now relying on.由于這個原因,Google也從不把大量的硬件驅動程序和平臺源碼向kernel提交。實際上,它創造出了一個kernel的分支,大量的開發者都 依賴那個分支。”
              這就是Android干的事情:它修改了Kernel,但是又不提供修改的細節,自己搞了一個封閉的系統。說得難聽一點,它利用了開源社區,要求開源社區為它做貢獻,卻又不愿提供回報。
              所以,Linux Kernel就把Android踢出去了,真是再正常不過了。
              人們有權利質疑,Android這樣的哲學是否正確?是否符合Google“不作惡”的口號?如果Android繼續這樣封閉下去,那么開源社區為什么要 為它免費制作軟件呢?因為我又不是在為開源社區服務,而是在為Google服務。既然這樣的話,那還不如去支持iPhone呢,至少能在軟件商店里多賣一 點錢,而且喬布斯看上去也更酷一點。slashdot上有很多關于此事的討論。有人指出:“Google自己的網站,與微軟的網站一樣封閉。它開源出來的 東西,都是根據GPL許可證不得不開源的。”
              好吧,姑且不談Google本身,因為它至少不要求外界提供支持。但是Android不一樣,你不能假裝成開源系統,騙取社區的支持,然后又干著封閉系統的勾當。
              Google必須做出選擇。正如Greg Kroah-Hartman最后的呼吁:
              “I really don't know. Google shows no sign of working to get their code upstream anymore.
          我真的不知道未來。Google看上去沒有任何改變代碼的跡象。
              I do hold out hope that Google does come around and works to fixtheir codebase to get it merged upstream to stop the huge blockage thatthey have now caused in a large number of embedded Linux hardwarecompanies. 我確實希望Google做出改變,把它的代碼合并進我們的代碼,彌補已經出現的代碼分裂。
              I've privately offered in the past to help this work get done, andam doing again here publicly. But I need the help of the Googledevelopers to make it happen, without them, nothing can change. 我私底下已經說過,我愿意幫助完成這項工作,在這里我再次公開這樣說。但是如果沒有Google程序員的加入,什么也不會發生。”

          posted @ 2011-08-29 13:39 馬航 閱讀(290) | 評論 (0)編輯 收藏

          細心的網友可能發現Android的 ROM中有很多odex文件,相對于APK中的dex文件而言這個odex有什么作用呢? Android123提示大家,如果你仔細觀察會發現文件名時一一對應的,同時那些對應的apk文件中沒有dex文件。這樣做可以使其廠商保證一定的反盜 版,因為沒有沒有dex文件的apk是無法正常安裝的,而廠商直接將odex和不完整的apk文件放到手機rom固化到/system/bin中可以讓一般用戶無法正常導出使用。

            很多網友可能想到的是合并odex和apk變成apk中包含dex文件的,這樣合并后最終apk文件安裝在/data/中,而rom存放時在 /system/bin中,所以最終導致了用戶可裝在Android手機中的軟件會變少,占用系統空間。

            一、APK生成odex文件方法:

            編譯開源GIT上的build/tools/dexpreopt/dexopt-wrapper這個,使用dexopt-wrapper即可,操作步驟

            將dexopt-wrapper放到/data/local目錄中,使用adb shell執行linux命令行,使用cd命令進入/data/local目錄,

            cd /data/local

            ./dexopt-wrapper android123.apk android123.odex

          二、合并odex和 少dex的apk 為完整的apk文件

            1. 下載 http://smali.googlecode.com/files/smali-1.2.2.jarhttp://smali.googlecode.com/files/baksmali-1.2.2.jar,既然是需要盜版,還需要odex所在rom中的一些引用類,一般在 /system/framework 目錄中

            2 .  通過odex生成class文件

                    java -jar baksmali-1.2.2.jar -x android123.odex

                  執行完上面這行命令后,會生成一個out 文件夾里面是android123.odex的class文件。出現問題,根據提示可以從rom的 /system/framework 中的xxx.jar放到pc上的java環境變量中一起生成。

            3. 通過class生成classes.dex 文件。

                  java -Xmx512M -jar smali-1.2.2.jar out -o classes.dex

            4. 將classes.dex放到apk文件

                  因為apk是zip的mime編碼類型,使用winzip或winrar直接拖入到apk改名為zip的壓縮包中即可。

            5. 不要忘記了簽名,使用jdk中的arsigner和keytool打包重新簽名即可。

          posted @ 2011-08-28 15:22 馬航 閱讀(591) | 評論 (0)編輯 收藏

          安裝步驟(需要自己編譯):

          A. 獲取代碼:(沒有git的先安裝git:sudo apt-get install git-core)

          $ git clone git://github.com/tchaikov/scim-googlepinyin.git

          $ cd scim-googlepinyin

          B. 編譯前提:

          上面給的鏈接里面有介紹怎么編譯的,但少提了幾個必需組件,這里列一下:

          * autotools-dev

          * libgtk2.0-dev

          * libscim-dev

          * libtool

          * automake

          用下面命令看看是不是安裝了,如果沒有,會自動幫你安裝上:

          $ aptitude install autotools-dev libgtk2.0-dev libscim-dev libtool automake

          C. 編譯:

          記住系統必須先存在SCIM(沒有的話 sudo apt-get install scim 一下)

          $ ./autogen.sh

          $ make

          $ sudo make install

          現在重啟

          OK,去首選項里的“語言支持”的“輸入法”選擇scim作為默認輸入法就OK了。

          posted @ 2011-08-25 10:27 馬航 閱讀(146) | 評論 (0)編輯 收藏

          在編譯過程中出現錯誤信息包含以下內容:

          usr/share/pc-bios/bios.bin   …………      tools/lib/pc-bios/bios.bin

          usr/share/pc-bios/vgabios-cirrus.bin   …………     tools/lib/pc-bios/vgabios-cirrus.bin

          說明在路徑:~/Android_Src/out/host/linux-x86/usr/share下找不到pc-bios文件夾,并不是在本機系統目錄/usr/share……下找不到該文件夾,本機系統這個目錄下的確沒有的。

          解決方法為:

          復制:~/Android_Src/prebuilt/common下的pc-bios文件夾到以下目錄:~/Android_Src/out/host/linux-x86/usr/share即可解決,命令行輸入:

          $cp ~/Android_Src/prebuilt/common/pc-bios   ~/Android_Src/out/host/linux-x86/usr/share  (測試未通過)

          $cp ~/Android_Src/prebuilt/common/pc-bios   ~/Android_Src/usr/share  (測試OK)

          在編譯的過程中又出現如下提示:

          ……………………

          Docs droiddoc: out/target/common/docs/online-sdk

          htmlDir not a directory: out/target/common/docs/gen

          DroidDoc took 105 sec. to write docs to out/target/common/docs/online-sdk

          Package SDK: out/host/linux-x86/sdk/android-sdk_eng.neo_linux-x86.zip

          sdk/build/tools.atree:134: couldn't locate source file: framework/ddmlib-tests.jar

          sdk/build/tools.atree:135: couldn't locate source file: framework/ninepatch-tests.jar

          sdk/build/tools.atree:136: couldn't locate source file: framework/common-tests.jar

          sdk/build/tools.atree:138: couldn't locate source file: framework/sdkuilib-tests.jar

          make: *** [out/host/linux-x86/sdk/android-sdk_eng.root_linux-x86.zip] Error 44

          大概的意思在framework目錄下找不到ddmlib-tests.jar     ninepath-tests.jar     common-tests.jar     sdkuilib-tests.jar這幾個文件,有一點要說明的是這里的framework目錄指的是:~/Android_Src/out/host/linux-x86/framework   個目錄,你可以在這里找到以下幾個文件common.jar     ddmlib.jar     ninepatch.jar     sdkuilib.jar,然后將它們分別復制一份,并重命名,命名的原則很簡單,就是在原有的名字后面跟上-tests即可。

          接下來繼續編譯,沒有其他錯誤的話,命令行會出現以下提示:

          Docs droiddoc: out/target/common/docs/online-sdk

          htmlDir not a directory: out/target/common/docs/gen

          DroidDoc took 90 sec. to write docs to out/target/common/docs/online-sdk

          Package SDK: out/host/linux-x86/sdk/android-sdk_eng.neo_linux-x86.zip

          xxx@xxx:~/Android_Src$ 

          這說明sdk編譯也已經完成。

          posted @ 2011-08-20 10:09 馬航 閱讀(1104) | 評論 (0)編輯 收藏

          前言

          本文敘述了如何從零開始搭建基于 Google 官方 Android 2.1-r2 源碼的開發環境,包括如何下載源代碼、編譯源代碼,以及在模擬器中運行編譯生成的鏡像。文中開發機是基于 Ubuntu 10.04 的,同樣適用于其他版本的 Ubuntu 。

              2. 下載 JDK 1.5

          編譯 Android 源碼需要 JDK1.5 版(主要是需要其中的 javadoc ), 1.6 版是不兼容的。 JDK1.5 已經停止支持,其最終的版本是 JDK 5.0 Update 22 。

          可從 Sun 官網上下載:

          http://java.sun.com/javase/downloads/5u22/jdk

          選擇平臺 Linux ,勾選同意許可協議:

          單擊 Continue ,在彈出的頁面中一共有兩個下載,選第一個 jdk-1_5_0_22-linux-i586.bin 下載:

                   3. 部署 JDK 1.5

                     3.1 解壓縮 JDK

          以下命令均在 root 賬戶上執行,非 root 賬戶執行某些命令可能需要加 sudo 。

          將 jdk-1_5_0_22-linux-i586.bin 放在 root 目錄下。進入該目錄:

          cd ~

          然后賦予該 bin 文件可執行屬性:

          chmod +x jdk-1_5_0_22-linux-i586.bin

          再執行安裝 ( 注意前面有 ./) :

          ./jdk-1_5_0_22-linux-i586.bin

          跳過協議閱讀。

          最后一行:

          Do you agree to the above license terms? [yes or no]

          鍵入 yes ,然后回車,開始解壓。默認會解壓到當前目錄下的 jdk1.5.0_22 目錄下(此處是 ~/ jdk1.5.0_22 )。

                     3.2 JDK 版本切換

          如果同時需要使用 JDK1.6 版做應用開發,則系統中將同時存在 JDK1.5 和 JDK1.6 。因此需要實現能夠在不同版本間切換。如果不使用 JDK1.6 ,請做完 1.5 版的設置后跳至 3.3 節。

          這里使用 update-alternatives 命令實現。

          首先為 JDK1.5 版生成可選配置選項:

          update-alternatives --install /usr/bin/jdk jdk /root/jdk1.5.22 255

          /usr/bin/jdk 是符號鏈接,它指向 /etc/alternatives/jdk (由第 2 個參數給出的), /root/jdk1.5.22 是實際目的鏈接, 255 是優先級(任意整數,在 automatic mode 自動模式時,數字大的優先級較高,被選為默認配置選項)。

          然后再為 JDK1.6 版生成( 如果有 JDK1.6 的話。不使用 JDK1.6 的請跳至 3.3 節 ):

          update-alternatives --install /usr/bin/jdk jdk /root/jdk1.6.20 0

          這樣,默認 jdk 版本即為 1.5 版。需要切換到 1.6 版時,請使用 update-alternatives –config jdk

                     3.3 配置 JDK 環境變量

          下面開始配置環境變量。

          在終端中執行: gedit ~/.bashrc

          修改 .bashrc 文件,添加下面語句:

          #set java environment

          export JAVA_HOME=/usr/bin/jdk

          export JRE_HOME=JAVA_HOME/jre

          export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH

          export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

          該段代碼最好設置在文件的尾部。

          保存文件。在終端中執行 source ~/.bashrc

          請使用 java – version 檢查 JDK 是否配置正確。

                  4. 安裝其他必備組件

          在終端上,使用下面的命令安裝:

          apt-get install git-core gnupg flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev

          因為 JDK1.5 在前面已經單獨安裝過了,因此此處 apt-get install 命令行中沒有加入 sun-java5-jdk 。

                  5. 下載 Android 源代碼

                    5.1 安裝 repo 腳本

          首先安裝 repo 。在 root 目錄下新建一個 bin 目錄。在終端中執行:

          cd ~

          mkdir bin

          然后,向 PATH 中添加 bin 路徑:

          export PATH=$PATH:~/bin

          然后執行下面兩行指令,下載 repo 腳本并修改可執行屬性:

          curl https://android.git.kernel.org/repo >~/bin/repo

          chmod a+x ~/bin/repo

                    5.2 初始化 repo

          首先建立一個目錄用來存放 Android 源代碼:

          mkdir mydroid

          cd mydroid

          然后用最新的列表執行初始化。這里我們下載android 2.1-r1,因此加了參數 –b android-2.1_r2:

          repo init -u git://android.git.kernel.org/platform/manifest.git –b android-2.1_r2

          這中間會問到你的名字和 Email 。如果你打算上傳代碼, Email 須是一個 Google 賬戶。

          repo 初始化成功后會看到類似于下面的提示:

          repo initialized in /root/mydroid

          最后執行 repo sync 開始同步代碼。過程比較漫長,下載速度取決于你的網速,中間有可能遇到斷線,重新執行 repo sync 即可斷點續傳。

                 6. 編譯 Android 源代碼

                   6.1 編譯生成鏡像

          切換到 android 源碼根目錄下,執行 make 即可。首次編譯非常耗時,取決于機器配置,大約需要 3 小時。完成后鏡像生成在 /root/mydroid/out/target/product/generic 下。

                   6.2 編譯、配置 Android SDK

          make 編譯完成后,執行 make sdk 命令,生成對應于該版本源代碼的 sdk 。

          Android 官方的 SDK 和我們自己編譯 Android 源碼時使用 make sdk 編譯出的 SDK 有區別,模擬器版本不同,加載的默認鏡像也不同(一個是官方的,一個是自己編譯的)。下面將展示如何能夠自由切換 SDK 版本。

          首先是自己編譯的 SDK 版本,實際位置是 /root/mydroid/out/host/linux-x86/sdk/android-sdk_eng.root_linux-x86 。

          因為它比較常用,我們給它高優先級:

          update-alternatives --install /usr/bin/AndroidSDK AndroidSDK /root/mydroid/out/host/linux-x86/sdk/android-sdk_eng.root_linux-x86 255

          事先下載的官方 SDK 位置是 /root/android-sdk-linux_86 ,執行:

          update-alternatives --install /usr/bin/AndroidSDK AndroidSDK /root/android-sdk-linux_86 0

          然后使用 update-alternatives --display AndroidSDK 查看當前配置情況:

          如果要切換配置,使用 update-alternatives --config AndroidSDK

          配置 AndroidSDK 環境變量。終端中執行 gedit ~/.bashrc

          在文件最后添加下面三行:

          # set android environment

          export ANDROID_SDK_HOME=/usr/bin/ AndroidSDK

          export PATH=$ANDROID_SDK_HOME/tools:$PATH

          保存文件。在終端中執行 source ~/.bashrc

                 7. 在模擬器中運行編譯的鏡像

          打開終端,執行 android 腳本:

          android

          出現下圖所示窗口:

          選擇左邊第一項 Virtual Devices ,然后在右邊選擇 New ,新建一個 AVD 。

          Name : AVD 的名稱,隨便取,但只能包含字母和數字以及點、下劃線和連字符,這里取名 test 。

          Traget :目標 SDK 版本,這里選自己編譯的 2.1-r1 版 Android SDK 。

          SD Card : SD 卡。暫且不填,待需要時再設置。

          Skin :皮膚(模擬器屏幕分辨率)。

          Hardware :使用默認即可

          然后點 Create AVD ,就創建好了一個 AVD 。點擊 Start 即可啟動模擬器,其運行的是自己編譯的鏡像。

          posted @ 2011-08-19 15:30 馬航 閱讀(267) | 評論 (0)編輯 收藏

          Android 2.1

            |-- Makefile

            |-- bionic (bionic C庫)

            |-- bootable (啟動引導相關代碼)

            |-- build (存放系統編譯規則及generic等基礎開發包配置)

            |-- cts (Android兼容性測試套件標準)

            |-- dalvik (dalvik JAVA虛擬機)

            |-- development (應用程序開發相關)

            |-- external (android使用的一些開源的模組)

            |-- frameworks (核心框架——java及C++語言)

            |-- hardware (主要保護硬解適配層HAL代碼)

            |-- out (編譯完成后的代碼輸出與此目錄)

            |-- packages (應用程序包)

            |-- prebuilt (x86和arm架構下預編譯的一些資源)

            |-- sdk (sdk及模擬器)

            |-- system (文件系統庫、應用及組件——C語言)

            `-- vendor (廠商定制代碼)

            bionic 目錄按照二級展開 tree -d -L 2

            |-- libc (C庫)

            | |-- arch-arm (ARM架構,包含系統調用匯編實現)

            | |-- arch-x86 (x86架構,包含系統調用匯編實現)

            | |-- bionic (由C實現的功能,架構無關)

            | |-- docs (文檔)

            | |-- include (頭文件)

            | |-- inet (?inet相關,具體作用不明)

            | |-- kernel (Linux內核中的一些頭文件)

            | |-- netbsd (?nesbsd系統相關,具體作用不明)

            | |-- private (?一些私有的頭文件)

            | |-- stdio (stdio實現)

            | |-- stdlib (stdlib實現)

            | |-- string (string函數實現)

            | |-- tools (幾個工具)

            | |-- tzcode (時區相關代碼)

            | |-- unistd (unistd實現)

            | `-- zoneinfo (時區信息)

            |-- libdl (libdl實現,dl是動態鏈接,提供訪問動態鏈接庫的功能)

            |-- libm (libm數學庫的實現,)

            | |-- alpha (apaha架構)

            | |-- amd64 (amd64架構)

            | |-- arm (arm架構)

            | |-- bsdsrc (?bsd的源碼)

            | |-- i386 (i386架構)

            | |-- i387 (i387架構?)

            | |-- ia64 (ia64架構)

            | |-- include (頭文件)

            | |-- man (數學函數,后綴名為.3,一些為freeBSD的庫文件)

          | |-- powerpc (powerpc架構)

            | |-- sparc64 (sparc64架構)

            | `-- src (源代碼)

            |-- libstdc++ (libstdc++ C++實現庫)

            | |-- include (頭文件)

            | `-- src (源碼)

            |-- libthread_db (多線程程序的調試器庫)

            | `-- include (頭文件)

            `-- linker (動態鏈接器)

            `-- arch (支持arm和x86兩種架構)

            hardware 目錄 (部分廠家開源的硬解適配層HAL代碼)

            |-- broadcom (博通公司)

            | `-- wlan (無線網卡)

            |-- libhardware (硬件庫)

            | |-- include (頭文件)

            | `-- modules (Default (and possibly architecture dependents) HAL modules)

            | |-- gralloc (gralloc顯示相關)

            | `-- overlay (Skeleton for the "overlay" HAL module.)

            |-- libhardware_legacy (舊的硬件庫)

            | |-- flashlight (背光)

            | |-- gps (GPS)

            | |-- include (頭文件)

            | |-- mount (舊的掛載器)

            | |-- power (電源)

            | |-- qemu (模擬器)

            | |-- qemu_tracing (模擬器跟蹤)

            | |-- tests (測試)

            | |-- uevent (uevent)

            | |-- vibrator (震動)

            | `-- wifi (無線)

            |-- msm7k (高通7k處理器開源抽象層)

            | |-- boot (啟動)

            | |-- libaudio (聲音庫)

            | |-- libaudio-qsd8k (qsd8k的聲音相關庫)

            | |-- libcamera (攝像頭庫)

            | |-- libcopybit (copybit庫)

            | |-- libgralloc (gralloc庫)

            | |-- libgralloc-qsd8k (qsd8k的gralloc庫)

            | |-- liblights (背光庫)

            | `-- librpc (RPC庫)

            |-- ril (無線電抽象層)

            | |-- include (頭文件)

            | |-- libril (庫)

            | |-- reference-cdma-sms (cdma短信參考)

            | |-- reference-ril (ril參考)

            | `-- rild (ril后臺服務程序)

            `-- ti (ti公司開源HAL)

            |-- omap3 (omap3處理器)

            | |-- dspbridge (DSP橋)

            | |-- libopencorehw (opencore硬件庫)

          | |-- liboverlay (overlay硬件庫)

            | |-- libstagefrighthw (stagefright硬件庫)

            | `-- omx (omx組件)

            `-- wlan (無線網卡)

            prebuilt 目錄 (x86和arm架構下預編譯的一些資源)

            .

            |-- android-arm (arm-android相關)

            | |-- gdbserver (gdb調試器)

            | `-- kernel (模擬的arm內核)

            |-- android-x86 (x86-android相關)

            | `-- kernel (空的)

            |-- common (通用編譯好的代碼,應該是java的)

            |-- darwin-x86 (drawin x86平臺)

            | `-- toolchain (工具鏈)

            | |-- arm-eabi-4.2.1

            | |-- arm-eabi-4.3.1

            | `-- arm-eabi-4.4.0

            |-- darwin-x86_64 (drawin x86 64bit平臺)

            |-- linux-x86 (linux x86平臺)

            | `-- toolchain (工具鏈,我們應該主要用這個)

            | |-- arm-eabi-4.2.1

            | |-- arm-eabi-4.3.1

            | |-- arm-eabi-4.4.0

            | `-- i686-unknown-linux-gnu-4.2.1 (x86版編譯器)

            |-- linux-x86_64 (linux x86 64bit平臺)

            |-- windows (windows平臺)

            `-- windows-x86_64 (64bit windows平臺)

            system 目錄 (底層文件系統庫、應用及組件——C語言)

            .

            |-- Bluetooth (藍牙相關)

            |-- core (系統核心工具盒接口)

            | |-- adb (adb調試工具)

            | |-- cpio (cpio工具,創建img)

            | |-- debuggerd (調試工具)

            | |-- fastboot (快速啟動相關)

            | |-- include (系統接口頭文件)

            | |-- init (init程序源代碼)

            | |-- libacc (輕量級C編譯器)

            | |-- libctest (libc測試相關)

            | |-- libcutils (libc工具)

            | |-- liblog (log庫)

            | |-- libmincrypt (加密庫)

            | |-- libnetutils (網絡工具庫)

            | |-- libpixelflinger (圖形處理庫)

            | |-- libsysutils (系統工具庫)

            | |-- libzipfile (zip庫)

            | |-- logcat (查看log工具)

            | |-- logwrapper (log封裝工具)

            | |-- mkbootimg (制作啟動boot.img的工具盒腳本)

           | |-- netcfg (網絡配置netcfg源碼)

            | |-- nexus (google最新手機的代碼)

            | |-- rootdir (rootfs,包含一些etc下的腳本和配置)

            | |-- sh (shell代碼)

            | |-- toolbox (toolbox,類似busybox的工具集)

            | `-- vold (SD卡管理器)

            |-- extras (額外工具)

            | |-- latencytop (a tool for software developers ,identifying system latency happen)

            | |-- libpagemap (pagemap庫)

            | |-- librank (Java Library Ranking System庫)

            | |-- procmem (pagemap相關)

            | |-- procrank (Java Library Ranking System相關)

            | |-- showmap (showmap工具)

            | |-- showslab (showslab工具)

            | |-- sound (聲音相關)

            | |-- su (su命令源碼)

            | |-- tests (一些測試工具)

            | `-- timeinfo (時區相關)

            `-- wlan (無線相關)

            `-- ti (ti網卡相關工具及庫)

          posted @ 2011-08-19 15:22 馬航 閱讀(131) | 評論 (0)編輯 收藏

          取得當前屏幕的截圖主要使用了Bitmap 類里的方法,首相取得一個bitmap 然后用取得的bitmap 去繪制一張圖片然后進行保存。

          import java.io.FileNotFoundException;
          import java.io.FileOutputStream;
          import java.io.IOException;
          import android.app.Activity;
          import android.graphics.Bitmap;
          import android.graphics.Rect;
          import android.os.Environment;
          import android.util.Log;
          import android.view.View;
          public class ShotScreen {

          private static final String TAG="shotscreen";
          @SuppressWarnings(
          "unused")
          private static Bitmap takeScreenShot(Activity activity){
          View view
          =activity.getWindow().getDecorView();
          view.setDrawingCacheEnabled(
          true);
          view.buildDrawingCache();
          Bitmap bitmap
          = view.getDrawingCache();
          Rect rect
          = new Rect();
          activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
          int statusBarHeight = rect.top;
          System.out.println(statusBarHeight);

          int width =activity.getWindowManager().getDefaultDisplay().getWidth();
          int height =activity.getWindowManager().getDefaultDisplay().getHeight();

          Bitmap bitmap2
          = Bitmap.createBitmap(bitmap,0,statusBarHeight, width, height - statusBarHeight);
          view.destroyDrawingCache();
          return bitmap2;
          }

          @SuppressWarnings(
          "unused")
          private static void savePic(Bitmap bitmap,String filename){
          FileOutputStream fileOutputStream
          = null;
          try {
          fileOutputStream
          = new FileOutputStream(filename);
          if (fileOutputStream != null) {
          bitmap.compress(Bitmap.CompressFormat.PNG,
          90, fileOutputStream);
          fileOutputStream.flush();
          fileOutputStream.close();
          }
          }
          catch (FileNotFoundException e) {
          Log.d(TAG,
          "Exception:FileNotFoundException");
          e.printStackTrace();
          }
          catch (IOException e) {
          Log.d(TAG,
          "IOException:IOException");
          e.printStackTrace();
          }
          }


          /**
          *
          *
          @param a
          */
          public static void shoot(Activity a){
          if (android.os.Environment.MEDIA_MOUNTED != "mounted") {
          ShotScreen.savePic(ShotScreen.takeScreenShot(a),
          "/sdcard/抽樣.png");
          }
          else{
          ShotScreen.savePic(ShotScreen.takeScreenShot(a),
          "/data/data/"+a.getPackageName()+"/抽樣.png");
          }
          }

          posted @ 2011-08-18 17:00 馬航 閱讀(258) | 評論 (0)編輯 收藏

          Canvas是一個畫布,你可以建立一個空白的畫布,就直接new一個Canvas對象,不需要參數。
          也可以先使用BitmapFactory創建一個Bitmap對象,作為新的Canvas對象的參數,也就是說這個畫布不是空白的,
          如果你想保存圖片的話,最好是Bitmap是一個新的,而不是從某個文件中讀入進來的,或者是Drawable對象。
           
          然后使用Canvas畫第一張圖上去,在畫第二張圖上去,最后使用Canvas.save(int flag)的方法進行保存,注意save方法里面的參數可以保存單個圖層,
          如果是保存全部圖層的 話使用 save( Canvas.ALL_SAVE_FLAG )。
           
          最后所有的信息都會保存在第一個創建的Bitmap中。代碼如下:
          Java代碼
          1. /** 
          2.     * create the bitmap from a byte array 
          3.     * 
          4.     * @param src the bitmap object you want proecss 
          5.     * @param watermark the water mark above the src 
          6.     * @return return a bitmap object ,if paramter's length is 0,return null 
          7.     */  
          8.    private Bitmap createBitmap( Bitmap src, Bitmap watermark )  
          9.    {  
          10.        String tag = "createBitmap";  
          11.        Log.d( tag, "create a new bitmap" );  
          12.        if( src == null )  
          13.        {  
          14.            return null;  
          15.        }  
          16.   
          17.        int w = src.getWidth();  
          18.        int h = src.getHeight();  
          19.        int ww = watermark.getWidth();  
          20.        int wh = watermark.getHeight();  
          21.        //create the new blank bitmap  
          22.        Bitmap newb = Bitmap.createBitmap( w, h, Config.ARGB_8888 );//創建一個新的和SRC長度寬度一樣的位圖  
          23.        Canvas cv = new Canvas( newb );  
          24.        //draw src into  
          25.        cv.drawBitmap( src, 00null );//在 0,0坐標開始畫入src  
          26.        //draw watermark into  
          27.        cv.drawBitmap( watermark, w - ww + 5, h - wh + 5null );//在src的右下角畫入水印  
          28.        //save all clip  
          29.        cv.save( Canvas.ALL_SAVE_FLAG );//保存  
          30.        //store  
          31.        cv.restore();//存儲  
          32.        return newb;  
          33.    }  
           
           對圖片進行縮小的方法:
          Java代碼
          1. /** 
          2.     * lessen the bitmap 
          3.     * 
          4.     * @param src bitmap 
          5.     * @param destWidth the dest bitmap width 
          6.     * @param destHeigth 
          7.     * @return new bitmap if successful ,oherwise null 
          8.     */  
          9.    private Bitmap lessenBitmap( Bitmap src, int destWidth, int destHeigth )  
          10.    {  
          11.        String tag = "lessenBitmap";  
          12.        if( src == null )  
          13.        {  
          14.            return null;  
          15.        }  
          16.        int w = src.getWidth();//源文件的大小  
          17.        int h = src.getHeight();  
          18.        // calculate the scale - in this case = 0.4f  
          19.        float scaleWidth = ( ( float ) destWidth ) / w;//寬度縮小比例  
          20.        float scaleHeight = ( ( float ) destHeigth ) / h;//高度縮小比例  
          21.        Log.d( tag, "bitmap width is :" + w );  
          22.        Log.d( tag, "bitmap height is :" + h );  
          23.        Log.d( tag, "new width is :" + destWidth );  
          24.        Log.d( tag, "new height is :" + destHeigth );  
          25.        Log.d( tag, "scale width is  :" + scaleWidth );  
          26.        Log.d( tag, "scale height is  :" + scaleHeight );  
          27.        Matrix m = new Matrix();//矩陣  
          28.        m.postScale( scaleWidth, scaleHeight );//設置矩陣比例  
          29.        Bitmap resizedBitmap = Bitmap.createBitmap( src, 00, w, h, m, true );//直接按照矩陣的比例把源文件畫入進行  
          30.        return resizedBitmap;  
          31.    } 

          posted @ 2011-08-18 14:44 馬航 閱讀(1184) | 評論 (0)編輯 收藏

          僅列出標題
          共4頁: 上一頁 1 2 3 4 下一頁 
          主站蜘蛛池模板: 昌乐县| 商水县| 鄢陵县| 克东县| 林芝县| 德昌县| 长海县| 东兴市| 和平区| 商河县| 宁明县| 罗平县| 宁海县| 咸丰县| 天全县| 安岳县| 永平县| 威信县| 宁河县| 玉树县| 繁昌县| 新丰县| 许昌市| 岳西县| 龙海市| 星座| 宁阳县| 汾阳市| 龙里县| 崇明县| 蒲城县| 襄垣县| 化州市| 奉新县| 大厂| 盖州市| 高密市| 左贡县| 高阳县| 泗阳县| 名山县|