1. 程式人生 > >32位Ubuntu編譯android常見錯誤

32位Ubuntu編譯android常見錯誤

原文

連結

開始正式編譯,在原始碼目錄下make即可。

make

我完全不知道跑了個啥,只知道超級卡。完成後產生的out資料夾有3.9G。

映象生成在out/target/product/generic下:android原始碼編譯後得到system.img,ramdisk.img,userdata.img映像檔案。其中, ramdisk.img是emulator的檔案系統,system.img包括了主要的包、庫等檔案,userdata.img包括了一些使用者資料,emulator載入這3個映像檔案後,會把 system和 userdata分別載入到 ramdisk檔案系統中的system和 userdata目錄下。

當然編譯是件很痛苦的事情:

1

************************************************************

You are attempting to build on a 32-bit system.

Only 64-bit build environments are supported beyond froyo/2.2.

************************************************************

解決:

需要進行如下修改即可,將

./external/clearsilver/cgi/Android.mk

./external/clearsilver/java-jni/Android.mk

./external/clearsilver/util/Android.mk

./external/clearsilver/cs/Android.mk

四個檔案中的

LOCAL_CFLAGS += -m64

LOCAL_LDFLAGS += -m64

註釋掉,或者將“64”換成“32”

LOCAL_CFLAGS += -m32

LOCAL_LDFLAGS += -m32

然後,將./build/core/main.mk 中的

ifneq (64,$(findstring 64,$(build_arch)))

改為:

ifneq (i686,$(findstring i686,$(build_arch)))

2

host C++: libutils <= frameworks/base/libs/utils/RefBase.cpp

frameworks/base/libs/utils/RefBase.cpp: In member function ‘void android::RefBase::weakref_type::trackMe(bool, bool)’:

frameworks/base/libs/utils/RefBase.cpp:483:67: error: passing ‘const android::RefBase::weakref_impl’ as ‘this’ argument of ‘void android::RefBase::weakref_impl::trackMe(bool, bool)’ discards qualifiers [-fpermissive]

make: *** [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

3

host Executable: aapt (out/host/linux-x86/obj/EXECUTABLES/aapt_intermediates/aapt)

out/host/linux-x86/obj/STATIC_LIBRARIES/libcutils_intermediates/libcutils.a(threads.o): In function `thread_store_get':

/home/leno/works/android_dev/bin/system/core/libcutils/threads.c:27: undefined reference to `pthread_getspecific'

out/host/linux-x86/obj/STATIC_LIBRARIES/libcutils_intermediates/libcutils.a(threads.o): In function `thread_store_set':

/home/leno/works/android_dev/bin/system/core/libcutils/threads.c:36: undefined reference to `pthread_key_create'

/home/leno/works/android_dev/bin/system/core/libcutils/threads.c:44: undefined reference to `pthread_setspecific'

collect2: ld returned 1 exit status

make: *** [out/host/linux-x86/obj/EXECUTABLES/aapt_intermediates/aapt] 誤 1

解決:

開啟 frameworks/base/tools/aapt/Android.mk

然後開啟檔案Android.mk,編輯下面一行:

ifeq ($(HOST_OS),linux)

#LOCAL_LDLIBS += -lrt       把這行註釋掉,改為下面一行。

LOCAL_LDLIBS += -lrt -lpthread

endif

4

target Dex: core

#

# An unexpected error has been detected by HotSpot Virtual Machine:

#

#  SIGSEGV (0xb) at pc=0x4003d848, pid=7668, tid=2889534320

#

# Java VM: Java HotSpot(TM) Client VM (1.5.0_22-b03 mixed mode)

# Problematic frame:

# C  [libpthread.so.0+0xa848]  pthread_cond_timedwait+0x168

#

# An error report file with more information is saved as hs_err_pid7668.log

#

# If you would like to submit a bug report, please visit:

#   http://java.sun.com/webapps/bugreport/crash.jsp

#

make: *** [out/target/common/obj/JAVA_LIBRARIES/core_intermediates/classes.dex] 已放棄 (core dumped)

解決:

虛擬機器給的記憶體512太小,給個1G試試。然後在本機裡開啟工作管理員,找到虛擬機器程序,優先順序設定為實時。給他最多東西。

 5

out/host/linux-x86/obj/STATIC_LIBRARIES/libcutils_intermediates/libcutils.a(threads.o): In function `thread_store_get':

/home/leno/works/android_dev/bin/system/core/libcutils/threads.c:27: undefined reference to `pthread_getspecific'

out/host/linux-x86/obj/STATIC_LIBRARIES/libcutils_intermediates/libcutils.a(threads.o): In function `thread_store_set':

/home/leno/works/android_dev/bin/system/core/libcutils/threads.c:36: undefined reference to `pthread_key_create'

/home/leno/works/android_dev/bin/system/core/libcutils/threads.c:44: undefined reference to `pthread_setspecific'

collect2: ld returned 1 exit status

make: *** [out/host/linux-x86/obj/EXECUTABLES/localize_intermediates/localize] 誤 1

解決:類似問題3

修改./framework/base/tools/localize/Android.mk檔案

ifeq ($(HOST_OS),linux)

#LOCAL_LDLIBS += -lrt       把這行註釋掉,改為下面一行。

LOCAL_LDLIBS += -lrt -lpthread

endif

誤6:

注意:external/protobuf/java/src/main/java/com/google/protobuf/GeneratedMessageLite.java 使用了未經檢查或不安全的操作。

注意:要了解詳細資訊,請使用 -Xlint:unchecked 重新編譯。
注意:external/protobuf/java/src/main/java/com/google/protobuf/micro/CodedInputStreamMicro.java 使用了未經檢查或不安全的操作。
注意:要了解詳細資訊,請使用 -Xlint:unchecked 重新編譯。
Generated: (out/target/product/generic/android-info.txt)
host C: acp <= build/tools/acp/acp.c
host C++: libhost <= build/libs/host/pseudolocalize.cpp
host C: libhost <= build/libs/host/CopyFile.c
<命令列>:0:0: 警告: “_FORTIFY_SOURCE”重定義 [預設啟用]
<built-in>:0:0: 附註: 這是先前定義的位置
<命令列>:0:0: 警告: “_FORTIFY_SOURCE”重定義 [預設啟用]
<built-in>:0:0: 附註: 這是先前定義的位置
In file included from build/libs/host/CopyFile.c:11:0:
build/libs/host/include/host/CopyFile.h:5:22: 致命誤: sys/stat.h:沒有那個檔案或目錄
編譯中斷。
In file included from /usr/include/stdlib.h:25:0,
                 from build/tools/acp/acp.c:11:
/usr/include/features.h:323:26: 致命誤: bits/predefs.h:沒有那個檔案或目錄
編譯中斷。
make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libhost_intermediates/CopyFile.o] 誤 1
make: *** 正在等待未完成的任務....
make: *** [out/host/linux-x86/obj/EXECUTABLES/acp_intermediates/acp.o] 誤 1

<命令列>:0:0: 警告: “_FORTIFY_SOURCE”重定義 [預設啟用]
<built-in>:0:0: 附註: 這是先前定義的位置
In file included from /usr/include/c++/4.6/x86_64-linux-gnu/32/bits/os_defines.h:40:0,
                 from /usr/include/c++/4.6/x86_64-linux-gnu/32/bits/c++config.h:392,
                 from /usr/include/c++/4.6/string:40,
                 from build/libs/host/include/host/pseudolocalize.h:4,
                 from build/libs/host/pseudolocalize.cpp:1:
/usr/include/features.h:323:26: 致命誤: bits/predefs.h:沒有那個檔案或目錄
編譯中斷。

make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libhost_intermediates/pseudolocalize.o] 誤 1

注意:某些輸入檔案使用或覆蓋了已過時的 API。
注意:要了解詳細資訊,請使用 -Xlint:deprecation 重新編譯。
注意:某些輸入檔案使用了未經檢查或不安全的操作。

注意:要了解詳細資訊,請使用 -Xlint:unchecked 重新編譯。

解決方法:sudo apt-get install libc6-dev-i386

http://www.blogjava.net/ZircoN/archive/2011/11/13/363452.html

誤7:

frameworks/base/libs/utils/RefBase.cpp: 在成員函式‘void android::RefBase::weakref_type::trackMe(bool, bool)’中:
frameworks/base/libs/utils/RefBase.cpp:483:67: 誤: 將‘const android::RefBase::weakref_impl’作為‘void android::RefBase::weakref_impl::trackMe(bool, bool)’的‘this’實參時丟棄了型別限定 [-fpermissive]
make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libutils_intermediates/RefBase.o] 誤 1
make: *** 正在等待未完成的任務....
frameworks/base/libs/utils/ResourceTypes.cpp: 在成員函式‘void android::ResTable::print(bool) const’中:
frameworks/base/libs/utils/ResourceTypes.cpp:4369:84: 警告: 將一個整數轉換為大小不同的指標 [-Wint-to-pointer-cast]

frameworks/base/libs/utils/ResourceTypes.cpp:4375:43: 警告: 將一個整數轉換為大小不同的指標 [-Wint-to-pointer-cast]

參考網上的解決方法:

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

將下面一行

LOCAL_CFLAGS +=-DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS)

改成

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

http://www.blogjava.net/ZircoN/archive/2011/11/13/363452.html

問題並沒有解決,反而又出現了新的誤:

host C++: libutils <= frameworks/base/libs/utils/Asset.cpp
g++: –fpermissive:沒有那個檔案或目錄
注意:某些輸入檔案使用或覆蓋了已過時的 API。
注意:要了解詳細資訊,請使用 -Xlint:deprecation 重新編譯。
注意:某些輸入檔案使用了未經檢查或不安全的操作。
注意:要了解詳細資訊,請使用 -Xlint:unchecked 重新編譯。
make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libutils_intermediates/Asset.o] 誤 1
make: *** 正在刪除檔案“out/host/linux-x86/obj/STATIC_LIBRARIES/libutils_intermediates/Asset.o”

make: *** 正在等待未完成的任務....

這個誤主要是gcc版本過高引起的:最終解決辦法是:

11.10的gcc版本過高

http://hi.baidu.com/designhouse/blog/item/fec5cdbf8d6a231618d81fc1.html)

ubuntu 11.10的gcc版本是4.6.1,版本太高,編譯android時出,要把gcc版本改為4.4.3。

通過gcc -v命令可以發現gcc庫在/usr/lib/gcc/i686-linux-gnu目錄下,該目錄下有當前系統支援的各種版本gcc庫 。在安裝gcc 4.4前該目錄下是沒有4.4目錄的,安裝gcc 4.4後該目錄下就會多出4.4這個目錄,且該4.4目錄下有各種相應庫檔案。

ubuntu 32bit系統下安裝gcc 4.4的最好方法是僅用以下兩條命令,不需要其它命令,否則編譯時可能會出

sudo apt-get install gcc-4.4

sudo apt-get install g++-4.4

裝完後在/usr/bin目錄下

$ ls -l gcc*

lrwxrwxrwx 1 root root      7 2011-10-29 09:11 gcc -> gcc-4.6

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

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

發現gcc 連結到gcc-4.6,  需要將它改為連結到gcc-4.4 :

sudo mv gcc gcc.bak

sudo ln -s gcc-4.4 gcc

$ls -l g++*

sudo -s

mv g++-4.4 g++

g++ -v

誤8:

g++: g++: selected multilib '32' not installed
selected multilib '32' not installed
make: *** [out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl] 誤 1
make: *** 正在等待未完成的任務....
make: *** [out/host/linux-x86/obj/lib/libESR_Portable.so] 誤 1


解決方法:

輸入:sudo apt-get install gcc-multilib

sudo apt-get install g++-multilib後出現新問題:

g++: g++: host SharedLib: libfst (out/host/linux-x86/obj/lib/libfst.so)
g++: selected multilib '32' not installedselected multilib '32' not installed

selected multilib '32' not installed
make: *** [out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl] 誤 1
make: *** 正在等待未完成的任務....
make: *** [out/host/linux-x86/obj/lib/libESR_Portable.so] 誤 1

make: *** [out/host/linux-x86/obj/lib/libfst.so] 誤 1

解決方法

 sudo apt-get install libc6-dev ia32-libs lib32ncurses5-dev x11proto-core-dev libx11-dev lib32readline-gplv2-dev lib32z-dev libgl1-mesa-dev mingw32 tofrodos python-markdown libxml2-utils

sudo apt-get install g++-4.4-multilib

誤9:


Could not load 'clearsilver-jni'
java.library.path = out/host/linux-x86/lib
Could not load 'clearsilver-jni'
java.library.path = out/host/linux-x86/lib
make: *** [out/target/common/docs/api-stubs-timestamp] 誤 45
make: *** 正在等待未完成的任務....
make: *** [out/target/common/docs/doc-comment-check-timestamp] 誤 45


解決方法:

這是由於clearsilver 在編譯時如果檢測到使用Java JDK 6,就使用64位編譯。要避開此誤,需要修改下面四個檔案:

* external/clearsilver/cgi/Android.mk
* external/clearsilver/java-jni/Android.mk
* external/clearsilver/util/Android.mk
* external/clearsilver/cs/Android.mk

把這四個Makefile中的下列語句注掉即可:

# This forces a 64-bit build for Java6
# Comment by Easwy
# LOCAL_CFLAGS += -m64
# LOCAL_LDFLAGS += -m64

然後在external/clearsilver目錄中執行一下make clean,然後回到專案根目錄,繼續make即可。

當編譯完成時,生成的image檔案放在out/target/product/generic目錄中。


gedit /root/.bashrc
export PATH=/root/android/mydroid/out/host/linux-x86/bin:$PATH
export ANDROID_PRODUCT_OUT=/root/android/mydroid/out/target/product/generic
export ANDROID_SWT=/root/android/mydroid/out/host/linux-x86/framework

在原始碼目錄下的out/target/product/generic/目錄下執行
emulator -image system.img -data userdata.img -ramdisk ramdisk.img 命令

誤10:

 emulator

NAND: could not write file system.img, File exists

另外:還有:

1、許可權不夠遇到多次
/bin/bash: prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-gcc: 許可權不夠
/bin/bash: prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-gcc: 許可權不夠
/bin/bash: build/core/find-jdk-tools-jar.sh: 許可權不夠
/bin/bash: build/tools/findleaves.py: 許可權不夠
/bin/bash: build/tools/findleaves.py: 許可權不夠
Checking API: checkapi-last
/bin/bash: out/host/linux-x86/bin/apicheck: 許可權不夠

解決:
chmod a+x prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-gcc
對所有沒有許可權的檔案增加可執行許可權

2.make: *** [out/host/linux-x86/obj/EXECUTABLES/acp_intermediates/acp.o] 誤 1
在32位下編譯,直接make就可以了
在64位下編譯,會出一些誤,需要額外安裝一些包:
     A, 沒有gnu/stubs-32.h檔案:
      /usr/include/gnu/stubs.h:7:27: error: gnu/stubs-32.h: 沒有該檔案或目錄
      make: *** [out/host/linux-x86/obj/EXECUTABLES/acp_intermediates/acp.o] 誤 1
解決方法:
確定你的系統是x86_64 GNU/Linux
      
[email protected]:/home/mm/android# uname -a
       Linux mm-desktop 2.6.27-9-generic #1 SMP Thu Nov 20 22:15:32 UTC 2008 x86_64 GNU/Linux
安裝libc6-dev-i386
     sudo apt-get install libc6-dev-i386

     B。找不到-lstdc++
     /usr/bin/ld: cannot find -lstdc++
解決方法:
安裝 g++-multilib,lib32z1-dev 和 lib32ncurses5-dev
      apt-get install g++-4.2-multilib  lib32z1-dev lib32ncurses5-dev


3.make: *** [out/host/linux-x86/obj/EXECUTABLES/acp_intermediates/acp] 誤 1
安裝 g++-4.5-multilib
 $ sudo aptitude install git-core gnupg flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev ia32-libs x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev java-common unixodbc

 4.arm-eabi-gcc: error trying to exec 'cc1': execvp: No such file or directory

同事編kernel的時候總是會下面的誤~~最後發現是交叉編譯工具的許可權問題,chmod -R 777 * 就可以了
arm-eabi-gcc: error trying to exec 'cc1': execvp: No such file or directory
總結一下:
1、確認CROSS-COMPILE的目錄在PATH裡面
2、確認cc1是存在的
3、確認交叉編譯工具的許可權

摘錄:

誤處理
      在Ubuntu10.10(64位)編譯Android2.3原始碼時,遇到各種各樣的問題。不是缺這個,就是少那個。現把這些問題和解決方法羅列出來,供大家參考。

誤:
/usr/include/gnu/stubs.h:7:27: error: gnu/stubs-32.h: No such file or directory
make: *** [out/host/linux-x86/obj/EXECUTABLES/acp_intermediates/acp.o] 誤 1

解決:
  sudo apt-get install libc6-dev-i386

誤:
make: *** [out/host/linux-x86/obj/EXECUTABLES/acp_intermediates/acp] error 1

解決:
  sudo apt-get install g++-multilib

誤:
external/clearsilver/cgi/cgi.c:22: fatal error: zlib.h: No such file or directory
compilation terminated.
make: *** [out/host/linux-x86/obj/SHARED_LIBRARIES/libneo_cgi_intermediates/cgi.o] Error 1

解決:
sudo apt-get install zlib1g-dev

誤:
/usr/bin/ld: cannot find -lz
collect2: ld returned 1 exit status
make: *** [out/host/linux-x86/obj/EXECUTABLES/aapt_intermediates/aapt] Error 1

解決:
sudo apt-get install lib32z1-dev

誤:
bison -d  -o out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_y.cpp frameworks/base/tools/aidl/aidl_language_y.y
/bin/bash: bison: command not found
make: *** [out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_y.cpp] Error 127

解決:
sudo apt-get install bison

誤:
Lex: aidl <= frameworks/base/tools/aidl/aidl_language_l.l
/bin/bash: flex: command not found
make: *** [out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_l.cpp] Error 127

解決:
sudo apt-get install flex

誤:
/usr/bin/ld: cannot find -lncurses
collect2: ld returned 1 exit status
make: *** [out/host/linux-x86/obj/EXECUTABLES/adb_intermediates/adb] Error 1

解決:
sudo apt-get install lib32ncurses5-dev

誤:
prebuilt/linux-x86/sdl/include/SDL/SDL_syswm.h:55: fatal error: X11/Xlib.h: No such file or directory
compilation terminated.
make: *** [out/host/linux-x86/obj/EXECUTABLES/emulator_intermediates/android/main-common.o] Error 1

解決:
sudo apt-get install libx11-dev

誤:
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] Error 25
make: *** Deleting file `out/target/product/generic/obj/STATIC_LIBRARIES/libwebcore_intermediates/WebCore/css/CSSPropertyNames.h'

解決:
sudo apt-get install gperf

誤:
build/core/java.mk:9: *** bin: Target java module does not define any source or resource files. Stop.

解決:
      刪除原始碼根目錄下的bin資料夾,這個資料夾是匯入eclipse時建立的。

cannot find -lXXX
          所有編譯過程中遇到的類似這樣的誤,都是缺少libXXX這樣的庫,解決方法就是:
首先:利用命令:apt-cache search XXX 進行庫搜尋
然後:找那些libXXX-dev這樣的庫進行安裝,命令就是:sudo apt-get install libXXX-dev
最後:繼續執行make

生成韌體

1.在原始碼根目錄下執行一下:
. build/envsetup.sh

2.通過所有編譯(make)或模組編譯(mmm)

   需要使用超級使用者進行編譯,要不會出現一下許可權問題

3.通過 export -p 檢視HOME 的路徑是否正確,否則修改 HOME 鎖指向的路徑為home/使用者 中,直接 export HOME="/home/使用者"
4.在“/home/使用者”目錄下新建資料夾 firmware
5.在Android 原始碼根目錄下 執行./mkimage.sh

修改./mkimage.sh 中的路徑指向 “/home/使用者”目錄下的資料夾 firmware

韌體在firmware中生成

誤1:

注意:external/protobuf/java/src/main/java/com/google/protobuf/GeneratedMessageLite.java 使用了未經檢查或不安全的操作。

注意:要了解詳細資訊,請使用 -Xlint:unchecked 重新編譯。
注意:external/protobuf/java/src/main/java/com/google/protobuf/micro/CodedInputStreamMicro.java 使用了未經檢查或不安全的操作。
注意:要了解詳細資訊,請使用 -Xlint:unchecked 重新編譯。
Generated: (out/target/product/generic/android-info.txt)
host C: acp <= build/tools/acp/acp.c
host C++: libhost <= build/libs/host/pseudolocalize.cpp
host C: libhost <= build/libs/host/CopyFile.c
<命令列>:0:0: 警告: “_FORTIFY_SOURCE”重定義 [預設啟用]
<built-in>:0:0: 附註: 這是先前定義的位置
<命令列>:0:0: 警告: “_FORTIFY_SOURCE”重定義 [預設啟用]
<built-in>:0:0: 附註: 這是先前定義的位置
In file included from build/libs/host/CopyFile.c:11:0:
build/libs/host/include/host/CopyFile.h:5:22: 致命誤: sys/stat.h:沒有那個檔案或目錄
編譯中斷。
In file included from /usr/include/stdlib.h:25:0,
                 from build/tools/acp/acp.c:11:
/usr/include/features.h:323:26: 致命誤: bits/predefs.h:沒有那個檔案或目錄
編譯中斷。
make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libhost_intermediates/CopyFile.o] 誤 1
make: *** 正在等待未完成的任務....
make: *** [out/host/linux-x86/obj/EXECUTABLES/acp_intermediates/acp.o] 誤 1
<命令列>:0:0: 警告: “_FORTIFY_SOURCE”重定義 [預設啟用]
<built-in>:0:0: 附註: 這是先前定義的位置
In file included from /usr/include/c++/4.6/x86_64-linux-gnu/32/bits/os_defines.h:40:0,
                 from /usr/include/c++/4.6/x86_64-linux-gnu/32/bits/c++config.h:392,
                 from /usr/include/c++/4.6/string:40,
                 from build/libs/host/include/host/pseudolocalize.h:4,
                 from build/libs/host/pseudolocalize.cpp:1:
/usr/include/features.h:323:26: 致命誤: bits/predefs.h:沒有那個檔案或目錄
編譯中斷。

make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libhost_intermediates/pseudolocalize.o] 誤 1

注意:某些輸入檔案使用或覆蓋了已過時的 API。
注意:要了解詳細資訊,請使用 -Xlint:deprecation 重新編譯。
注意:某些輸入檔案使用了未經檢查或不安全的操作。

注意:要了解詳細資訊,請使用 -Xlint:unchecked 重新編譯。

解決方法:sudo apt-get install libc6-dev-i386

http://www.blogjava.net/ZircoN/archive/2011/11/13/363452.html

誤2:

frameworks/base/libs/utils/RefBase.cpp: 在成員函式‘void android::RefBase::weakref_type::trackMe(bool, bool)’中:
frameworks/base/libs/utils/RefBase.cpp:483:67: 誤: 將‘const android::RefBase::weakref_impl’作為‘void android::RefBase::weakref_impl::trackMe(bool, bool)’的‘this’實參時丟棄了型別限定 [-fpermissive]
make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libutils_intermediates/RefBase.o] 誤 1
make: *** 正在等待未完成的任務....
frameworks/base/libs/utils/ResourceTypes.cpp: 在成員函式‘void android::ResTable::print(bool) const’中:
frameworks/base/libs/utils/ResourceTypes.cpp:4369:84: 警告: 將一個整數轉換為大小不同的指標 [-Wint-to-pointer-cast]

frameworks/base/libs/utils/ResourceTypes.cpp:4375:43: 警告: 將一個整數轉換為大小不同的指標 [-Wint-to-pointer-cast]

參考網上的解決方法:

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

將下面一行

LOCAL_CFLAGS +=-DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS)

改成

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

http://www.blogjava.net/ZircoN/archive/2011/11/13/363452.html

問題並沒有解決,反而又出現了新的誤:

host C++: libutils <= frameworks/base/libs/utils/Asset.cpp
g++: –fpermissive:沒有那個檔案或目錄
注意:某些輸入檔案使用或覆蓋了已過時的 API。
注意:要了解詳細資訊,請使用 -Xlint:deprecation 重新編譯。
注意:某些輸入檔案使用了未經檢查或不安全的操作。
注意:要了解詳細資訊,請使用 -Xlint:unchecked 重新編譯。
make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libutils_intermediates/Asset.o] 誤 1
make: *** 正在刪除檔案“out/host/linux-x86/obj/STATIC_LIBRARIES/libutils_intermediates/Asset.o”

make: *** 正在等待未完成的任務....

這個誤主要是gcc版本過高引起的:最終解決辦法是:

11.10的gcc版本過高

http://hi.baidu.com/designhouse/blog/item/fec5cdbf8d6a231618d81fc1.html)

ubuntu 11.10的gcc版本是4.6.1,版本太高,編譯android時出,要把gcc版本改為4.4.3。

通過gcc -v命令可以發現gcc庫在/usr/lib/gcc/i686-linux-gnu目錄下,該目錄下有當前系統支援的各種版本gcc庫 。在安裝gcc 4.4前該目錄下是沒有4.4目錄的,安裝gcc 4.4後該目錄下就會多出4.4這個目錄,且該4.4目錄下有各種相應庫檔案。

ubuntu 32bit系統下安裝gcc 4.4的最好方法是僅用以下兩條命令,不需要其它命令,否則編譯時可能會出

sudo apt-get install gcc-4.4

sudo apt-get install g++-4.4

裝完後在/usr/bin目錄下

$ ls -l gcc*

lrwxrwxrwx 1 root root      7 2011-10-29 09:11 gcc -> gcc-4.6

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

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

發現gcc 連結到gcc-4.6,  需要將它改為連結到gcc-4.4 :

sudo mv gcc gcc.bak

sudo ln -s gcc-4.4 gcc

誤3:

g++: g++: selected multilib '32' not installed
selected multilib '32' not installed
make: *** [out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl] 誤 1
make: *** 正在等待未完成的任務....
make: *** [out/host/linux-x86/obj/lib/libESR_Portable.so] 誤 1

解決方法:

輸入:sudo apt-get install gcc-multilib

sudo apt-get install g++-multilib後出現新問題:

g++: g++: host SharedLib: libfst (out/host/linux-x86/obj/lib/libfst.so)
g++: selected multilib '32' not installedselected multilib '32' not installed

selected multilib '32' not installed
make: *** [out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl] 誤 1
make: *** 正在等待未完成的任務....
make: *** [out/host/linux-x86/obj/lib/libESR_Portable.so] 誤 1

make: *** [out/host/linux-x86/obj/lib/libfst.so] 誤 1

解決方法

 sudo apt-get install libc6-dev ia32-libs lib32ncurses5-dev x11proto-core-dev libx11-dev lib32readline-gplv2-dev lib32z-dev libgl1-mesa-dev mingw32 tofrodos python-markdown libxml2-utils

sudo apt-get install g++-4.4-multilib

誤4:


Could not load 'clearsilver-jni'
java.library.path = out/host/linux-x86/lib
Could not load 'clearsilver-jni'
java.library.path = out/host/linux-x86/lib
make: *** [out/target/common/docs/api-stubs-timestamp] 誤 45
make: *** 正在等待未完成的任務....
make: *** [out/target/common/docs/doc-comment-check-timestamp] 誤 45

解決方法:

這是由於clearsilver 在編譯時如果檢測到使用Java JDK 6,就使用64位編譯。要避開此誤,需要修改下面四個檔案:

* external/clearsilver/cgi/Android.mk
* external/clearsilver/java-jni/Android.mk
* external/clearsilver/util/Android.mk
* external/clearsilver/cs/Android.mk

把這四個Makefile中的下列語句注掉即可:

# This forces a 64-bit build for Java6
# Comment by Easwy
# LOCAL_CFLAGS += -m64
# LOCAL_LDFLAGS += -m64

然後在external/clearsilver目錄中執行一下make clean,然後回到專案根目錄,繼續make即可。

當編譯完成時,生成的image檔案放在out/target/product/generic目錄中。


gedit /root/.bashrc
export PATH=/root/android/mydroid/out/host/linux-x86/bin:$PATH
export ANDROID_PRODUCT_OUT=/root/android/mydroid/out/target/product/generic
export ANDROID_SWT=/root/android/mydroid/out/host/linux-x86/framework

在原始碼目錄下的out/target/product/generic/目錄下執行
emulator -image system.img -data userdata.img -ramdisk ramdisk.img 命令

誤5:

 emulator

NAND: could not write file system.img, File exists

編譯Android原始碼

請按照“獲取Android原始碼”一節中的內容安裝所需的相關包,否則在編譯原始碼的時候會很多的。為了方便起見,現將所有需要安裝的包羅列如下,其中有些包是可選的,但最好都裝上,同時,在安裝之前,最好先更新一下:

$ sudo aptitude update

$ sudo aptitude upgrade

Ubuntu Linux32x86

$ sudo aptitude install git-core gnupg flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev make gcc g++ libc6dev patch texinfo ncursesdev python2.6 valgrind lib32readline5-dev

$ sudo aptitude install sunjava6jdk

Ubuntu Linux64x86

$ sudo apt-get install git-core gnupg flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev make gcc g++ libc6-dev patch texinfo ncurses-dev python2.6 valgrind gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev ia32-libs x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev

$ sudo ln -s /usr/lib32/libX11.so.6 /usr/lib32/libX11.so

$ sudo aptitude install sunjava6jdk

基本上安裝上面羅列的包,編譯時就不會有太大的問題,下面列舉本人(64位機子,Ubuntu10.04系統)在編譯時出現的一些誤,以及在出現誤時,相關的解決包。雖然google已將這些必需包在android

/usr/include/gnu/stubs.h:7:27: error: gnu/stubs-32.h: No such file or directory make: *** [out/host/linux-x86/obj/EXECUTABLES/acp_intermediates/acp.o] Error 1

解決包:$ sudo aptitude install libc6-dev-i386

/usr/bin/ld: cannot find -lstdc++

collect2: ld returned 1 exit status

make: *** [out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl] Error 1

dpkg-query -l &> packages.txt(該工具可用來查詢dpkg資料庫)

解決包:$ sudo aptitude install g++-multilib

/usr/bin/ld: cannot find -lncurses

collect2: ld returned 1 exit status

make: *** [out/host/linux-x86/obj/EXECUTABLES/adb_intermediates/adb] Error 1

make: *** Waiting for unfinished jobs....

解決包:$ sudo aptitude search lib32ncurses5-dev

/usr/bin/ld: cannot find -lz

collect2: ld returned 1 exit status

make: *** [out/host/linux-x86/obj/EXECUTABLES/zipalign_intermediates/zipalign] Error 1

make: *** Waiting for unfinished jobs....

解決包:$ sudo aptitude install lib32z-dev

提出了使用getlibs(該工具可自動解決32位程式在64位系統上的依賴關係)來解決這個問題。具體用法如下:

$ getlibs -l lib