尝试编译android-2.3.7_r1

本文详细分析了在编译Android系统时针对不同架构和JDK版本的配置调整,重点讨论了如何根据不同系统的32位或64位特性,以及主机JDK版本,来合理配置编译参数,确保编译过程顺利进行。并通过实例展示了如何在实际编译过程中应用这些调整,以适应不同开发环境。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在参考别人的编译记录时,经常会看到如下的修改:

由于我们是32位系统,所以有些文件需要修改一下:

./build/core/main.mk 中的

ifneq (64,$(findstring64,$(build_arch)))
改为:
ifneq (i686,$(findstring i686,$(build_arch)))

android-2.3.7_r1/external/clearsilver/cgi/Android.mk
android-2.3.7_r1/external/clearsilver/java-jni/Android.mk
android-2.3.7_r1/external/clearsilver/util/Android.mk
android-2.3.7_r1/external/clearsilver/cs/Android.mk

四个文件中的:
ifeq ($(HOST_JDK_IS_64BIT_VERSION),true)
LOCAL_CFLAGS += -m64
LOCAL_LDFLAGS += -m64
endif

注释掉,或者将“64”换成“32”
ifeq ($(HOST_JDK_IS_64BIT_VERSION),true)
LOCAL_CFLAGS += -m32
LOCAL_LDFLAGS += -m32
endif


而实际上android-2.3.7_r1/build/core/main.mk 中根本就没有第一条的定义!

而关于第二条的修改,我认为是治标不治本,我猜想在build/下的*.mk中肯定有对于HOST_JDK_IS_64BIT_VERSION的定义,用于判断主机PC上的JDK是不是64位的!

果然在android-2.3.7_r1/build/core/config.mk中,我们可以看到HOST_JDK_IS_64BIT_VERSION的定义:

# Is the host JDK 64-bit version?
HOST_JDK_IS_64BIT_VERSION :=
ifneq ($(filter 64-Bit, $(shell java -version 2>&1)),)
HOST_JDK_IS_64BIT_VERSION := true
endif
这个定义很明确,只有在java -version所输出的信息中64-Bit,HOST_JDK_IS_64BIT_VERSION才被定义为true!

所以关于-m64修改为-m32是没必要的。


如果要改也是改

ifeq ($(HOST_JDK_IS_64BIT_VERSION),true)
为
ifneq ($(HOST_JDK_IS_64BIT_VERSION),)
因为我担心HOST_JDK_IS_64BIT_VERSION := true,true前面的空格会导致上述原始的判断不成立!


下面是java -version运行输出的信息:

java -version

//我的PC输出为32位JDK6:
java version "1.6.0_34"
Java(TM) SE Runtime Environment (build 1.6.0_34-b04)
Java HotSpot(TM) Server VM (build 20.9-b04, mixed mode)

//他人的64位JDK6:
java version "1.6.0_33"
Java(TM) SE Runtime Environment (build 1.6.0_33-b04)
Java HotSpot(TM) 64-Bit Server VM (build 20.8-b03, mixed mode)



关于android-2.3.7_r1的编译,大致同前一篇《尝试编译android-4.0.4_r2.1》没什么区别 http://blog.youkuaiyun.com/niyufeng/article/details/8040028

主要就是andorid-2.3.7_r1的补丁和android-4.0.4_r2.1有所不同:


000-gcc4.6.x.patch

#由于使用gcc 4.6.x,最好换为4.4的gcc
--- android-2.3.7_r1/build/core/combo/HOST_linux-x86.mk.orig	2012-10-03 18:54:52.805379013 +0800
+++ android-2.3.7_r1/build/core/combo/HOST_linux-x86.mk	2012-10-03 18:56:28.773376791 +0800
@@ -58,6 +58,6 @@
 	-include $(call select-android-config-h,linux-x86)
 
 # Disable new longjmp in glibc 2.11 and later. See bug 2967937.
-HOST_GLOBAL_CFLAGS += -D_FORTIFY_SOURCE=0
+HOST_GLOBAL_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0
 
 HOST_NO_UNDEFINED_LDFLAGS := -Wl,--no-undefined
--- android-2.3.7_r1/frameworks/base/libs/utils/Android.mk.orig	2012-10-03 19:01:32.273369759 +0800
+++ android-2.3.7_r1/frameworks/base/libs/utils/Android.mk	2012-10-03 19:02:27.041368492 +0800
@@ -57,7 +57,7 @@
 
 LOCAL_MODULE:= libutils
 
-LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS)
+LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS) -fpermissive
 LOCAL_C_INCLUDES += external/zlib
 
 ifeq ($(HOST_OS),windows)



001-HOST_JDK_IS_64BIT_VERSION.patch
--- android-2.3.7_r1/external/clearsilver/cgi/Android.mk.orig	2012-10-03 18:38:25.705401876 +0800
+++ android-2.3.7_r1/external/clearsilver/cgi/Android.mk	2012-10-03 18:39:17.349400681 +0800
@@ -12,6 +12,6 @@
 
 LOCAL_CFLAGS := -fPIC
 
-ifeq ($(HOST_JDK_IS_64BIT_VERSION),true)
+ifneq ($(HOST_JDK_IS_64BIT_VERSION),)
 LOCAL_CFLAGS += -m64
 LOCAL_LDFLAGS += -m64
 endif
--- android-2.3.7_r1/external/clearsilver/java-jni/Android.mk.orig	2012-10-03 18:39:47.649399978 +0800
+++ android-2.3.7_r1/external/clearsilver/java-jni/Android.mk	2012-10-03 18:41:01.369398272 +0800
@@ -33,6 +33,6 @@
 
 LOCAL_CFLAGS := -fPIC
 
-ifeq ($(HOST_JDK_IS_64BIT_VERSION),true)
+ifneq ($(HOST_JDK_IS_64BIT_VERSION),)
 LOCAL_CFLAGS += -m64
 LOCAL_LDFLAGS += -m64
 endif
--- android-2.3.7_r1/external/clearsilver/util/Android.mk.orig	2012-10-03 18:42:44.305395886 +0800
+++ android-2.3.7_r1/external/clearsilver/util/Android.mk	2012-10-03 18:43:06.273395377 +0800
@@ -17,6 +17,6 @@
 
 LOCAL_CFLAGS := -fPIC
 
-ifeq ($(HOST_JDK_IS_64BIT_VERSION),true)
+ifneq ($(HOST_JDK_IS_64BIT_VERSION),)
 LOCAL_CFLAGS += -m64
 LOCAL_LDFLAGS += -m64
 endif
--- android-2.3.7_r1/external/clearsilver/cs/Android.mk.orig	2012-10-03 18:44:29.141393459 +0800
+++ android-2.3.7_r1/external/clearsilver/cs/Android.mk	2012-10-03 18:44:49.297392991 +0800
@@ -8,6 +8,6 @@
 
 LOCAL_CFLAGS := -fPIC
 
-ifeq ($(HOST_JDK_IS_64BIT_VERSION),true)
+ifneq ($(HOST_JDK_IS_64BIT_VERSION),)
 LOCAL_CFLAGS += -m64
 LOCAL_LDFLAGS += -m64
 endif


或者001-HOST_JDK_IS_64BIT_VERSION.patch为:(也可以直接不使用001-HOST_JDK_IS_64BIT_VERSION.patch,android编译时能正确判断)
--- android-2.3.7_r1/external/clearsilver/cgi/Android.mk.orig	2012-10-03 18:38:25.705401876 +0800
+++ android-2.3.7_r1/external/clearsilver/cgi/Android.mk	2012-10-03 18:39:17.349400681 +0800
@@ -13,8 +13,8 @@
 LOCAL_CFLAGS := -fPIC
 
 ifeq ($(HOST_JDK_IS_64BIT_VERSION),true)
-LOCAL_CFLAGS += -m64
-LOCAL_LDFLAGS += -m64
+LOCAL_CFLAGS += -m32
+LOCAL_LDFLAGS += -m32
 endif
 # We use the host compilers because the Linux SDK build
 # uses a 32-bit toolchain that can't handle -m64
--- android-2.3.7_r1/external/clearsilver/java-jni/Android.mk.orig	2012-10-03 18:39:47.649399978 +0800
+++ android-2.3.7_r1/external/clearsilver/java-jni/Android.mk	2012-10-03 18:41:01.369398272 +0800
@@ -34,8 +34,8 @@
 LOCAL_CFLAGS += -fPIC
 
 ifeq ($(HOST_JDK_IS_64BIT_VERSION),true)
-LOCAL_CFLAGS += -m64
-LOCAL_LDFLAGS += -m64
+LOCAL_CFLAGS += -m32
+LOCAL_LDFLAGS += -m32
 endif
 # We use the host compilers because the Linux SDK build
 # uses a 32-bit toolchain that can't handle -m64
--- android-2.3.7_r1/external/clearsilver/util/Android.mk.orig	2012-10-03 18:42:44.305395886 +0800
+++ android-2.3.7_r1/external/clearsilver/util/Android.mk	2012-10-03 18:43:06.273395377 +0800
@@ -18,8 +18,8 @@
 LOCAL_CFLAGS := -fPIC
 
 ifeq ($(HOST_JDK_IS_64BIT_VERSION),true)
-LOCAL_CFLAGS += -m64
-LOCAL_LDFLAGS += -m64
+LOCAL_CFLAGS += -m32
+LOCAL_LDFLAGS += -m32
 endif
 # We use the host compilers because the Linux SDK build
 # uses a 32-bit toolchain that can't handle -m64
--- android-2.3.7_r1/external/clearsilver/cs/Android.mk.orig	2012-10-03 18:44:29.141393459 +0800
+++ android-2.3.7_r1/external/clearsilver/cs/Android.mk	2012-10-03 18:44:49.297392991 +0800
@@ -9,8 +9,8 @@
 LOCAL_CFLAGS := -fPIC
 
 ifeq ($(HOST_JDK_IS_64BIT_VERSION),true)
-LOCAL_CFLAGS += -m64
-LOCAL_LDFLAGS += -m64
+LOCAL_CFLAGS += -m32
+LOCAL_LDFLAGS += -m32
 endif
 # We use the host compilers because the Linux SDK build
 # uses a 32-bit toolchain that can't handle -m64










这是原始prebuilt/android-arm/kernel/kernel-qemu内核:



这是自己编译的goldfish内核:








<think>好的,我现在要帮用户解决如何通过repo命令初始化和同步Android源码仓库的问题,特别是针对Android 2.3.7_r1版本。首先,我需要回忆一下repo工具的基本用法,它是Google为了管理多个Git仓库而开发的工具,常用于Android源码的下载和管理。 用户提到的Android 2.3.7_r1是一个比较旧的版本,可能涉及到特定的分支和仓库配置。根据用户提供的引用内容,我需要确认正确的repo init命令格式。引用[1]、[3]、[4]都提到了使用`repo init -u`后跟仓库URL和`-b`参数指定分支android-2.3.7_r1。不过,引用[2]提到的是清华的镜像源,可能国内用户访问更快。所以,可能需要建议用户选择合适的镜像源,比如官方的或者清华的。 接下来,repo sync命令用于同步代码,但用户可能需要知道是否需要额外的参数,比如`-j`来指定并行任务数,或者是否需要先配置git信息。引用[3]中的命令是先创建目录,进入后执行repo init和repo sync,这可能是一个标准的流程。另外,引用[2]提到`repo sync -l`,这里的`-l`参数是仅检出代码,可能用于本地已有仓库的情况,但初次同步应该不需要这个参数。 另外,需要注意环境准备,比如是否安装了git、curl,以及repo工具本身是否正确安装。可能用户需要先下载repo并设置可执行权限,然后添加到PATH中。用户可能没有提到这一步,但作为教程的一部分,应该包含这些前置步骤。 还有网络问题,同步Android源码需要较大的带宽,可能需要提醒用户耐心等待,或者使用清华镜像来加速下载,如引用[2]中的URL。同时,repo init时指定的分支是否存在,用户需要确保android-2.3.7_r1是有效的分支名称,根据引用[3]和[4],这个分支确实存在。 最后,是否需要初始化后的配置修改?比如.gitconfig中的信息,或者repo的配置文件。可能用户需要设置用户名和邮箱,否则在同步时可能不会出错,但最好提前配置。 总结步骤应该是:安装repo工具,创建目录,repo init指定分支,repo sync同步代码。中间可能需要注意镜像源的选择和网络问题。此外,可能还需要解释每个命令的作用,比如repo init是初始化仓库,-u指定manifest仓库的URL,-b指定分支,repo sync则是下载代码。 可能用户遇到的问题包括:repo命令找不到,这就需要安装;网络连接问题,可能需要换镜像源;分支名称错误,导致初始化失败;存储空间不足,因为Android源码很大。所以教程中需要涵盖这些常见问题的解决方法,或者至少给出提示。 另外,引用中的不同命令格式需要注意,比如URL是http还是https,是否以.git结尾,例如引用[4]用的是http,而其他用https,这可能影响某些情况下的连接,但通常应该都可以工作。不过最好统一建议使用https,因为更安全。 现在需要把这些步骤整理成用户容易理解的教程,分步骤说明,并给出示例代码。同时,根据用户的要求,生成相关问题,比如如何更换镜像源,如何处理同步中断,如何验证代码完整性等。</think>### 通过`repo`命令初始化和同步Android源码仓库(Android 2.3.7_r1) #### 环境准备 1. **安装依赖工具** 确保系统已安装`git`和`curl`: ```bash sudo apt-get install git curl ``` 2. **下载`repo`工具** 将`repo`脚本下载到本地并赋予可执行权限: ```bash mkdir ~/bin curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo chmod a+x ~/bin/repo export PATH=~/bin:$PATH # 临时添加PATH,建议写入`.bashrc`永久生效 ``` --- #### 初始化仓库 1. **创建源码目录并进入** ```bash mkdir ~/android-2.3.7 cd ~/android-2.3.7 ``` 2. **执行`repo init`** 使用官方仓库或国内镜像(以清华镜像为例)[^2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值