源码编译安装GO1.6

一、问题

GO1.6的编译过程需要GO1.4的二进制来实现bootstrap(自举)(简单来说:GO需要GO自身来编译

二、解决方案

从Github的GO仓库镜像来获取GO的源码,首先编译GO1.4(只需要gcc和glibc,不需要GO来编译),使用编译好的GO1.4的二进制来编译GO1.6。

三、步骤

1. 如果之前已经安装过老版本的GO,清除$GOPATH,$GOROOT变量。

2. 安装好Git

3. 安装好gcc和glibc

4. 从源码编译安装GO1.4

cd ~/
git clone git@github.com:golang/go.git
cd go
git checkout -b 1.4.3 go1.4.3
cd src
./all.bash

5. 复制 ~/go 到 $GOROOT_BOOTSTRAP(默认值是 ~/go1.4)

cp -rf ~/go ~/go1.4

6. 从源代码编译安装GO1.6

cd ~/go
git clean -dfx
git checkout -b 1.6 go1.6
cd src
./all.bash

7. 设置 $GOPATH 以及添加GO二进制路径到 $PATH


转载于:https://my.oschina.net/hncscwc/blog/662031

<think>我们正在处理如何在Android源码编译中配置和使用多种JDK版本的问题。根据用户的问题,他希望在编译过程中使用多个JDK版本。在Android源码编译中,通常需要指定一个默认的JDK版本,但有时不同的模块可能需要不同的JDK版本。我们可以通过以下方式实现: ### 解决方案 Android构建系统(Soong)允许通过环境变量和模块属性来指定JDK版本。以下是具体步骤: #### 1. **设置全局默认JDK版本** 在Android构建系统中,可以通过设置环境变量`JAVA_HOME`来指定默认的JDK路径。但若要同时使用多个JDK,我们需要在模块级别进行覆盖。 ```bash # 在终端中设置全局默认JDK(仅对当前会话有效) export JAVA_HOME=/path/to/jdk1.8.0_291 ``` 或者,在`build/make/core/main.mk`中设置默认值(不推荐直接修改,但可以创建自定义的`BoardConfig.mk`): ```makefile # 在BoardConfig.mk中设置 JAVA_VERSION := 1.8 ``` #### 2. **为特定模块指定JDK版本** 对于需要不同JDK版本的模块(如`java_library`、`android_app`),可以在其定义中通过`java_version`属性指定: ```starlark java_library { name: "my_java9_module", srcs: ["src/**/*.java"], java_version: "9", # 使用JDK 9编译 } ``` 注意:`java_import`模块不支持`java_version`属性,因为它只是导入预编译的jar包。 #### 3. **同时安装多个JDK并配置路径** 在编译主机上安装多个JDK,并设置环境变量指向它们。例如: - JDK 8 路径: `/usr/lib/jvm/java-8-openjdk-amd64` - JDK 11 路径: `/usr/lib/jvm/java-11-openjdk-amd64` 然后,在模块中通过`java_version`选择需要的版本。构建系统会根据`java_version`自动选择对应的JDK路径(前提是这些JDK已安装且路径被系统识别)。 #### 4. **使用Soong的`java_defaults`复用配置** 创建`java_defaults`模块来集中管理JDK版本: ```starlark java_defaults { name: "java9_defaults", java_version: "9", } java_library { name: "my_lib", defaults: ["java9_defaults"], srcs: ["*.java"], } ``` #### 5. **检查构建系统支持的JDK版本** 确保构建系统支持你指定的JDK版本。在`build/soong/java/config/config.go`中定义了支持的版本: ```go var validJavaVersions = []string{ "1.6", "1.7", "1.8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", } ``` #### 6. **编译命令中指定JDK(临时)** 在运行`m`或`mm`编译命令时,可以通过环境变量临时指定JDK: ```bash JAVA_HOME=/path/to/jdk11 mm ``` ### 完整示例 假设我们有两个模块:一个需要JDK 8,另一个需要JDK 11。 **模块1(JDK 8):** ```starlark java_library { name: "module_jdk8", srcs: ["src/module8/**/*.java"], java_version: "1.8", # 使用JDK 8 } ``` **模块2(JDK 11):** ```starlark java_library { name: "module_jdk11", srcs: ["src/module11/**/*.java"], java_version: "11", # 使用JDK 11 } ``` ### 注意事项 1. **版本兼容性**:确保模块指定的JDK版本不高于构建系统支持的最高版本(当前Android构建系统支持到JDK 20)[^1]。 2. **预编译库**:`java_import`模块无法指定`java_version`,因为它不涉及编译过程。 3. **引导类路径**:如果使用高版本JDK编译低版本目标,可能需要通过`javacflags`设置`-bootclasspath`指向正确的rt.jar(但构建系统通常自动处理)。 ### 相关问题 1. 如何为 Android.bp 中的 `java_import` 模块指定 Java 版本? 2. 在 Android 源码编译中如何检查当前模块使用的 JDK 版本? 3. 如何解决因 JDK 版本不匹配导致的构建错误? 4. Android 构建系统支持哪些 JDK 版本? 通过上述方法,可以在Android源码编译中灵活配置多个JDK版本,满足不同模块的编译需求[^1][^2]。</think>在 Android 源码编译中配置和使用多种 JDK 版本,可以通过以下方法实现: ### 方法 1:全局配置(推荐) 在 `BoardConfig.mk` 中设置默认 JDK 版本: ```makefile # 设置全局默认 JDK 版本 JAVA_VERSION := 1.8 ``` ### 方法 2:模块级配置 在 Android.bp 文件中为特定模块指定 JDK 版本: ```starlark java_library { name: "my_module", srcs: ["src/**/*.java"], java_version: "11", # 指定使用 JDK 11 } ``` ### 方法 3:环境变量覆盖 在编译命令前设置环境变量临时切换 JDK: ```bash # 切换到 JDK 11 编译特定模块 export JAVA_HOME=/path/to/jdk-11 make my_module ``` ### 方法 4:多版本共存配置 1. **安装多个 JDK**: ```bash sudo apt install openjdk-8-jdk openjdk-11-jdk ``` 2. **创建版本切换脚本** (`switch-jdk.sh`): ```bash #!/bin/bash version=$1 sudo update-alternatives --config java <<< $(sudo update-alternatives --list java | grep "$version" | awk -F'/' '{print $NF}') sudo update-alternatives --config javac <<< $(sudo update-alternatives --list javac | grep "$version" | awk -F'/' '{print $NF}') ``` 3. **编译前切换版本**: ```bash ./switch-jdk.sh 11 # 切换到 JDK 11 make module_name ``` ### 方法 5:构建系统扩展 对于需要同时使用多版本的特殊场景: ```starlark java_library { name: "jdk8_module", srcs: ["legacy/**/*.java"], java_version: "1.8", } java_library { name: "jdk11_module", srcs: ["modern/**/*.java"], java_version: "11", libs: ["jdk8_module"] # 依赖低版本模块 } ``` ### 验证 JDK 版本 编译后检查字节码版本: ```bash # 检查生成的 .class 文件版本 file out/target/common/obj/JAVA_LIBRARIES/my_module_intermediates/classes.jar ``` ### 注意事项 1. **版本兼容性**: - JDK 8:适用于大多数传统模块 - JDK 11+:推荐新模块使用(Android 13+ 默认支持)[^1] 2. **构建环境**: ```bash # 初始化构建环境 source build/envsetup.sh lunch target_name ``` 3. **模块编译**: ```bash mma -j4 # 编译当前目录模块 mmma -j4 path/to/module # 编译指定模块 ``` ### 完整示例 ```starlark // 传统模块使用 JDK 8 java_library { name: "legacy_support", srcs: ["src/legacy/**/*.java"], java_version: "1.8", } // 新模块使用 JDK 17 java_library { name: "modern_feature", srcs: ["src/modern/**/*.java"], java_version: "17", libs: ["legacy_support"], javacflags: ["-Xlint:unchecked"], } ``` > 通过组合全局配置和模块级覆盖,可实现灵活的 JDK 版本管理[^1]。 --- ### 相关问题 1. 如何为 Android.bp 中的 `java_import` 模块指定 Java 版本? 2. 在 Android 构建系统中如何检查当前使用的 JDK 版本? 3. 如何解决因 JDK 版本不匹配导致的 `UnsupportedClassVersionError` 错误? 4. Android 13+ 对 JDK 版本有哪些新要求? 5. 如何在 Android Studio 中配置多版本 JDK 支持?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值