发表于 2010年02月26日 16:24
分类: Android
统计: 0评/127阅
(收藏)
==========================================
如何在 Ubuntu 9.10 下编译 Android 源码
==========================================
问题:Ubuntu 升级为 9.10, 后 Android 源码无法编译通过怎么办?
原因:
这是 gcc 和 g++ 的版本太高导致的问题。Ubuntu 9.04 是4.3, 而 9.10 是4.4.
GCC 在 4.4 时把部份 string 相关的 function 回传值的 type 改变了...
char* 改成了 const char*...
也因此让一堆原本不是针对最新的gcc来写的code都无法编译成功。
解决方案:使用旧版本的 gcc 和 g++ 。
1、先下载 gcc-4.3 g++-4.3:
- apt-get install gcc-4.3 g++-4.3
apt-get install gcc-4.3 g++-4.3
2、删除原有的连接:
- sudo rm /usr/bin/gcc
sudo rm /usr/bin/g++
sudo rm /usr/bin/gcc
sudo rm /usr/bin/g++
3、添加新的连接:
- sudo ln -s /usr/bin/gcc-4.3 /usr/bin/gcc
sudo ln -s /usr/bin/g++-4.3 /usr/bin/g++
sudo ln -s /usr/bin/gcc-4.3 /usr/bin/gcc
sudo ln -s /usr/bin/g++-4.3 /usr/bin/g++
==================================================
问题:Ubuntu 中没有 Android 要求的 jdk 1.5, 怎么办?
解决方案一:安装 jdk 1.5。
方法1:从官方网站上下载 jdk 1.5,安装。
方法2:把 Ubuntu 9.10 的软件源换成 9.04 的软件源,更新源,安装 jdk 1.5。
解决方案二:如果您已经安装了 jdk 1.6, 请修改 /build/core/make.mk。(注,如果是 2.0 版本的源码,请修改 /build/core/main.mk)
在文件中搜索并分别把:
- java_version := $(shell java -version 2>&1 | head -n 1 | grep '[ "]1\.5[\. "$$]')
javac_version := $(shell javac -version 2>&1 | head -n 1 | grep '[ "]1\.5[\. "$$]')
java_version := $(shell java -version 2>&1 | head -n 1 | grep '[ "]1\.5[\. "$$]')
javac_version := $(shell javac -version 2>&1 | head -n 1 | grep '[ "]1\.5[\. "$$]')
两行改成:
- java_version := $(shell java -version 2>&1 | head -n 1 | grep '[ "]1\.6[\. "$$]')
javac_version := $(shell javac -version 2>&1 | head -n 1 | grep '[ "]1\.6[\. "$$]')
java_version := $(shell java -version 2>&1 | head -n 1 | grep '[ "]1\.6[\. "$$]')
javac_version := $(shell javac -version 2>&1 | head -n 1 | grep '[ "]1\.6[\. "$$]')
即可。
如果你有其它的开发要使用 jdk 1.6 的话,采用解决方案二是一种不错的选择,它可以避免你在两个 jdk 之间切换。
==================================================
以上方案,在 Ubuntu 9.10 + Android 2.1 环境中测试通过。即正确编译 Android 2.1 源码通过。
注意:
1、对于第二个问题的 解决方案二 请谨慎采用。由于修改了 Android 原配置文件,对编译结果的影响未知,建议经详细测试后再用于商业目的编译(要不然,出了问题可别找我哈,呵呵)。
不过到目前为止,我编译出来的结果文件,没有出现任何异常。如果大家发现了问题,不妨回复分享一下。
2、如果需要 make sdk,则需要把 javadoc 设置为 1.5 的。
安装 javadoc 1.5版本,然后 sudo update-alternatives --config javadoc,选择 1.5 版本。
不然会出现以下错误:
- javadoc: 错
误 - 在 doclet 类 DroidDoc 中,方法 start 已抛出异
常 java.lang.reflect.InvocationTargetException
com.sun.tools.javac.code.Symbol$CompletionFailure: 未
找到 sun.util.resources.OpenListResourceBundle 的类文件
1 错误
make: *** [out/target/common/docs/services-timestamp] 错误 45
javadoc: 错误 - 在 doclet 类 DroidDoc 中,方法 start 已抛出异常 java.lang.reflect.InvocationTargetException
com.sun.tools.javac.code.Symbol$CompletionFailure: 未找到 sun.util.resources.OpenListResourceBundle 的类文件
1 错误
make: *** [out/target/common/docs/services-timestamp] 错误 45
==================================================
解决了以上两个问题之后,按照 Android 官方文档的方法即可顺利进行编译。分享经验,分享快乐!放心享受 Ubuntu 9.10 带给您的惊喜吧!
作者:曾赛
日期:2010-02-25
====================
补充:常见问题解决方案
====================
1.找不到PRODUCT_POLICY
frameworks/policies/base/PolicyConfig.mk:22: *** No module defined for the given PRODUCT_POLICY (android.policy_phone).
解法: 修改build/tools/findleaves.sh的89行:
#find "${@:0:$nargs}" $findargs -type f -name "$filename" -print |
find "${@:1:$nargs-1}" $findargs -type f -name "$filename" -print |
2. fprintf未定义
frameworks/base/tools/aidl/AST.cpp:10: error: 'fprintf' was not declared in
this scope
解法:apt-get install gcc-4.3 g++-4.3,并重新ln gcc 和g++到 gcc-4.3 和g++-4.3
3.安装sun- java6-jdk,并且在环境变量中设置:
export JAVA_HOME=/usr/lib/jvm/java-6-sun/
export ANDROID_JAVA_HOME=$JAVA_HOME
这部分摘自:!8006E36532087D51!213.entry
android 中 安 装 java5
阅读(936) | 评论(0) | 转发(0) |