【Android】源碼編譯 時常見錯誤

一,問題解決 參考

         1)/bin/bash: prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-gcc: 權限不夠 

                解決:chmod a+x prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-gcc

         2)/bin/bash: build/core/find-jdk-tools-jar.sh: 權限不夠

               /bin/bash: build/tools/findleaves.py: 權限不夠

               chmod  a+x   build/core/find-jdk-tools-jar.sh

               chmod  a+x   build/tools/findleaves.py

         3)Your version is: java version "1.5.0".

              The correct version is: 1.6.

               解決:    新立得 上 openjdk-6-jdk

                               或到這裏下: http://www.oracle.com/technetwork/java/javase/downloads/jdk7u9-downloads-1859576.html

         4)/bin/bash: g++: 未找到命令

               解決:apt-get    install  g++

         5)external/clearsilver/cgi/cgi.c:22:18: 致命錯誤: zlib.h:沒有那個文件或目錄

              解決:apt-get install zlib1g-dev

         6)out/host/linux-x86/obj/STATIC_LIBRARIES/libutils_intermediates/RefBase.o] 錯誤 1         

               解決方法:

                        gedit frameworks/base/libs/utils/Android.mk

                        Change the line:

                        LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS)

                   To:

                        LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS)  -fpermissive

        7)/bin/bash: flex: 未找到命令

              解決:apt-get install flex

        8)out/host/linux-x86/obj/EXECUTABLES/adb_intermediates/adb] 錯誤 1

                          apt-get install libncurses5-dev 

        9)out/host/linux-x86/obj/EXECUTABLES/obbtool_intermediates/Main.o] 錯誤                

               解決:  修改源碼目錄下/build/core/combo/HOST_linux-x86.mk文件:

                        將以下語句

                  HOST_GLOBAL_CFLAGS += -D_FORTIFY_SOURCE=0

                       修改爲

                  HOST_GLOBAL_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0

               或者

原因:

因機器上的gcc版本過高,需替換成4.4.6重新進行編譯

解決方法:

1、安裝4.4版本的gccg++ 

$ sudo apt-get install gcc-4.4
$ sudo apt-get install g++-4.4

2、設置gcc版本,使gcc鏈接到gcc-4.4

$ ls -l /usr/bin/gcc*

lrwxrwxrwx 1 root root      7 2011-11-01 23:56 /usr/bin/gcc -> gcc-4.6

-rwxr-xr-x 1 root root 224544 2011-10-06 05:47 /usr/bin/gcc-4.4

-rwxr-xr-x 1 root root 302104 2011-09-17 05:43 /usr/bin/gcc-4.6

$ cd /usr/bin
$ sudo mv gcc gcc.bak
$ sudo ln -s gcc-4.4 gcc

3、設置g++版本,使g++鏈接到g++-4.4

$ sudo mv g++ g++.bak
$ sudo ln -s g++-4.4 g++

4、設置完畢後,重新進行編譯即可

     10) sh: gperf: not found
              calling gperf failed: 32512 at ./makeprop.pl line 96.
               make: *** [out/target/product/generic/obj/STATIC_LIBRARIES/libwebcore_intermediates/WebCore/css/CSSPropertyNames.h] 錯誤 25

               make: *** 正在刪除文件“out/target/product/generic/obj/STATIC_LIBRARIES/libwebcore_intermediates/WebCore/css/CSSPropertyNames.h”


              解決方法:apt-get install libgl1-mesa-dev


              結果:Android 編譯完成後,將在根目錄中生成一個 out 文件夾,所有生成的內容均放置在這個文件夾中。
              out 文件夾如下所示:

out/
|-- CaseCheck.txt
|-- casecheck.txt
|-- host
|    |-- common
|    `-- linux-x86
`-- target
      |-- common
      `-- product

           主要的兩個目錄爲 host target,前者表示在主機(x86)生成的工具,後者表示目標機(模認爲 ARMv5)運行的內容。
host 目錄的結構如下所示:
out/host/

|-- common
|     `-- obj  (JAVA 庫)
`-- linux-x86
     |-- bin   (二進制程序)
     |-- framework     (JAVA 庫,*.jar 文件)
     |-- lib       (共享庫*.so)
     `-- obj      (中間生成的目標文件)

host 目錄是一些在主機上用的工具,有一些是二進制程序,有一些是 JAVA 的程序。
target 目錄的結構如下所示:
out/target/

|-- common
|     |-- R   (資源文件)
|     |-- docs
|     `-- obj   (目標文件)
`-- product
      `-- generic

    其中 common 目錄表示通用的內容,product 中則是針對產品的內容。
    在 common 目錄的 obj 中,包含兩個重要的目錄:
          APPS 中包含了 JAVA 應用程序生成的目標,每個應用程序對應其中一個子目錄,將結合每個應用程序的原始文件生成 Android 應用程序的 APK 包。
         JAVA_LIBRARIES 中包含了 JAVA 的庫,每個庫對應其中一個子目錄。

在默認的情況下,Android 編譯將生成 generic 目錄,如果選定產品還可以生成其他的目錄。

generic 包含了以下內容:

           out/target/product/generic/

|-- android-info.txt
|-- clean_steps.mk
|-- data
|-- obj
|-- ramdisk.img
|-- root
|-- symbols
|-- system
|-- system.img
|-- userdata-qemu.img
`-- userdata.img

編譯也可以:$ make -j4

                   這裏-j4表示用四個線程編譯,4表示線程數,讀者可根據自己機器的情況設置(如機器爲單CPU雙核處理器,可設置爲-j2或-j4,即該數爲CPU內核總數或內核總數的2倍。)

成功後:

        Install: out/target/product/generic/system/app/Contacts.apk

        Finding NOTICE files: out/target/product/generic/obj/NOTICE_FILES/hash-timestamp

        Combining NOTICE files: out/target/product/generic/obj/NOTICE.html

        Target system fs image: out/target/product/generic/obj/PACKAGING/systemimage_intermediates/system.img

        Install system fs image: out/target/product/generic/system.img

        Installed file list: out/target/product/generic/installed-files.txt


運行編譯成功的文件:

$ vi .bashrc  添加:

        export Android_PRODUCT_OUT=~/桌面/android2.3.4_32bit/out/target/product/generic  
        Android_PRODUCT_OUT_BIN=~/桌面/android2.3.4_32bit/out/host/linux-x86/bin  
        export PATH=${PATH}:${ANDROID_PRODUCT_OUT_BIN}:${ANDROID_PRODUCT_OUT};

$ source .bashrc

$ emulator -image system.img -data userdata.img -ramdisk ramdisk.img

錯誤:

emulator: ERROR: You did not specify a virtual device name, and the system
directory could not be found.

If you are an Android SDK user, please use '@<name>' or '-avd <name>'
to start a given virtual device (see -help-avd for details).

Otherwise, follow the instructions in -help-disk-images to start the emulator

原因是你沒有建立avd,建立方法如下:

1、cd到bin 目錄下,終端中輸入 ./android 執行該腳本,啓動 Android SDK Manager -> Tools -> Manage AVDs -> 打開 Android Virtual Device Manager 後,新建一個avd,然後再執行emulator -avd my_avd -partition-size 512 便可正常

錯誤:

         SWT folder '/root/桌面/android2.3.4_32bit/out/host/linux-x86/framework/x86' does not exist.
         Please export ANDROID_SWT to point to the folder containing swt.jar for your platform.


錯誤:Error: Error parsing the sdk.
            Error: /root/桌面/android2.3.4_32bit/out/host/linux-x86/platforms is missing.
            Error: Unable to parse SDK content.

            但在out/host/linux-x86/sdk/android-sdk_eng.lawrencekang_linux-x86/tools目錄下 ./android 則可以 
            原來在out/host/linux-x86/sdk/android-sdk_eng.lawrencekang_linux-x86/下面有platforms目錄,可見android會查找上一級目錄下的platforms目錄
    將platforms 和add-ons copy到 out/host/linux-x86下面然後運行 android就可以了


二,編譯SDK

         $ make  sdk

                 生成:out/host/linux-x86/sdk/android-sdk_eng.root_linux-x86.zip

                 將 out/host/linux-x86/sdk/android-sdk_eng.huangjx_linux-x86.zip 解壓到本地目錄。進入tools 目錄,輸入下面的命令創建 AVD:

$ ./android create avd -t 1 -c 128M -n froyo -s HVGA           //建立目標機器 froyo

       出現錯誤:Error: Target id is not valid. Use 'android list targets' to get the target ids.


      Android 2.2 is a basic Android platform.

      Do you wish to create a custom hardware profile [no]

      Created AVD 'froyo' based on Android 2.2, with the following hardware config:

       hw.lcd.density=160

       輸入下面的命令,啓動模擬器:

$ ./emulator -avd froyo -partition-size 160 &
三,編譯完成SDK 就要啓動模擬器
        Android list 查看可以用的 sdk 和 avd  發現 爲空自己編譯的android sdk無法識別各版本platform的問題
        進入編譯結果目錄 out/host/linux-x86/sdk/android-sdk_eng.cmoaciopm_linux-x86/tools 發現android-2.3是存在的,那爲什麼SDKManager檢測不到呢?
        SDKManager無法檢測到Installpackages的原因了,我所檢出的androidgingerbread源代碼編譯出的sdk目錄結構與SDKManager檢測邏輯是不一致的。
        調整: android在2.3對sdk目錄結構進行了調整,將platform下面的tools文件夾移動到SDK根目錄下,命名爲platform-tools(裏面包含了該platform的aapt和adb等工具。這樣,platform在各操作系統下都統一了,不需要再爲不同操作系統發佈不同的platform,僅發佈不同的platform-tools即可)。
         可見gingerbreak代碼分支中sdkmanager的代碼不是“最新的”,沒有與編譯出來的sdk目錄結構保持一致。
         做了軟鏈接,騙過sdkmanager,重啓檢測一切正常
         ln  -sf   /home/justin/android/src/out/host/linux-x86/sdk/android-sdk_eng.justin_linux-x86/tools        ~/android/sdk
        根據自己的路徑設置吧

        啓動虛擬機出現
            SDL init failure, reason is: No available video device: OnUbuntu64
        問題需要安裝
                 apt-get install ia32-libs lib32stdc++6
       問題Cannot load 32-bit SWT libraries on 64-bit JVM
                 1.For Eclipse, go to Eclipse -> Preferences -> Java -> Installed JRE
                  2.For Flash Builder, go to Flash Builder -> Preferences -> Java ->Installed JREs Then, edit the selected Java VM, adding the following value forthe Default VM Arguments field -d32

啓動編譯好的源碼(模擬器)

1)自己有一個可以運行的 SDK庫,將編譯好的 SDK 版本拷貝到platforms 文件夾下面


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章