Android】源码编译 ---zzz
2014-05-04 14:29
351 查看
问题解决
参考
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
9)out/host/linux-x86/obj/EXECUTABLES/obbtool_intermediates/Main.o] 错误
解决: 修改源码目录下/build/core/combo/HOST_linux-x86.mk文件:
将以下语句
修改为
或者
原因:
因机器上的gcc版本过高,需替换成4.4.6重新进行编译。
解决方法:
1、安装4.4版本的gcc和g++
2、设置gcc版本,使gcc链接到gcc-4.4
3、设置g++版本,使g++链接到g++-4.4
复制代码
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 文件夹下面
参考
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版本的gcc和g++
$ 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 文件夹下面
相关文章推荐
- 从源码安装Mysql/Percona 5.5
- 10 篇对初学者和专家都有用的 Linux 命令教程
- Linux 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门
- 运维提升
- Linux 自检和 SystemTap
- Ubuntu Linux使用体验
- c语言实现hashmap(转载)
- Linux 信号signal处理机制
- linux下mysql添加用户
- Scientific Linux 5.5 图形安装教程
- Android:一步一步实现音乐播放器
- 基于 Linux 集群环境上 GPFS 的问题诊断
- 谁是桌面王者?Win PK Linux三大镇山之宝
- vivi下重新调整分区
- Linux VS Unix:Linux欲一统天下 Unix不死
- linux下设定环境变量