编译Conscrypt

  1. 进入服务器“/home”目录,下载Conscrypt源码。

    1
    2
    cd /home
    wget https://github.com/google/conscrypt/archive/2.1.0.zip --no-check-certificate
    

  2. 解压Conscrypt源码包。

    1
    unzip 2.1.0.zip
    

  3. “conscrypt-2.1.0”更名为“conscrypt”

    1
    mv conscrypt-2.1.0 conscrypt
    

  4. 拉取Conscrypt依赖包。

    该步骤会自动下载gradle-4.8.1-all,Gradle的默认的下载路径是“/root/.gradle/wrapper/dists”

    1
    2
    cd /home/conscrypt
    ./gradlew
    

    若使用代理,执行如下命令。请根据实际的代理环境配置代理的主机名、端口号、用户名和密码。

    ./gradlew -Dhttp.proxyHost=proxysg.huawei.com -Dhttp.proxyPort=8080 -Dhttps.proxyHost=proxysg.huawei.com -Dhttps.proxyPort=8080  -Dhttps.proxyUser= -Dhttps.proxyPassword=  -Dhttp.proxyUser= -Dhttp.proxyPassword=

    如果执行./gradlew时,报错如下:

    通过如下方法解决:

    1. 进入“/root/.gradle/wrapper/dists/gradle-4.8.1-all/6fmj4nezasjg1b7kkmy10xgo2”目录。
      cd /root/.gradle/wrapper/dists/gradle-4.8.1-all/6fmj4nezasjg1b7kkmy10xgo2

      注意:6fmj4nezasjg1b7kkmy10xgo2目录有可能不同,根据实际情况修改。

    2. 下载Gradle源码。
      1
      wget https://services.gradle.org/distributions/gradle-4.8.1-all.zip --no-check-certificate
      
    3. 解压缩gradle-4.8.1-all.zip文件。
      1
      unzip gradle-4.8.1-all.zip
      
    4. 进入/home/conscrypt目录。
      1
      cd /home/conscrypt
      
    5. 重新执行编译(代理主机、端口、用户和密码,请根据实际情况填写)。
      ./gradlew -Dhttp.proxyHost=proxysg.huawei.com -Dhttp.proxyPort=8080 -Dhttps.proxyHost=proxysg.huawei.com -Dhttps.proxyPort=8080  -Dhttps.proxyUser= -Dhttps.proxyPassword=  -Dhttp.proxyUser= -Dhttp.proxyPassword=

  5. 9中编译成功的gradle-platform-native-4.8.1.jar包,替换到本地仓目录下。

    1
    cp /home/gradle/subprojects/platform-native/build/libs/gradle-platform-native-4.8.1.jar  /root/.gradle/wrapper/dists/gradle-4.8.1-all/6fmj4nezasjg1b7kkmy10xgo2/gradle-4.8.1/lib/plugins
    

  6. 重启服务器。Gradle编译完成后,使用的依然是旧的Gradle,重启服务器后,才能使编译后的Gradle生效。

    1
    reboot
    

  7. 定位到“conscrypt”目录并删除子模块openjdk-integ-tests。

    1
    2
    cd /home/conscrypt
    rm -rf openjdk-integ-tests
    

  8. 定位到“openjdk”目录。

    1
    cd openjdk
    

  9. 修改“openjdk”目录下的build.gradle文件。

    1. 打开build.gradle文件。
      1
      vim build.gradle
      
    2. “i”进入编辑模式,将原有编译64位文件后缀增加“aarch64”。
      • 在第12行添加代码。
            arm64 = 'aarch64'

      • 修改第21行。
                nativeClassifier64Bit = classifierFor(osName, arm64)

    3. 在第291行增加platform配置。
              linux_aarch64 {
                   architecture "aarch64"
                   operatingSystem "linux"
              }

    4. 将构建jni-library时64位架构改为linux_aarch64
      • 注释第304行,修改第305行arch64Name为"linux_aarch64"。
                    //if (build32Bit) { targetPlatform arch32Name }
                   if (build64Bit) { targetPlatform "linux_aarch64" }

      • 修改第326行为"aarch64"。

    5. Clang或GCC编译时args增加指定头文件地址。

      修改第339和342行,与系统GCC路径一致。

      CentOS修改如下:

                                      "-I$jniSourceDir/main/include",
                                      "-I$jniSourceDir/unbundled/include",
                                      "-I/usr/include/c++/4.8.2",
                                      "-I/usr/include/c++/4.8.2/aarch64-redhat-linux",

      openEuler修改如下:

      "-I$jniSourceDir/main/include",
      "-I$jniSourceDir/unbundled/include",
      "-I/usr/include/c++/7.3.0",
      "-I/usr/include/c++/7.3.0/aarch64-linux-gnu",

    6. 修改生成库信息代码。
      • 修改第419行到第428行。
                    def archName = binary.targetPlatform.architecture.name
                    def archNameR = archName
                    if(archName == 'aarch64'){
                      archNameR = 'aarch_64'
                    }
                    archName = archName.replaceAll('-','_')
                    def classifier = classifierFor(osName, archName)
                    def classifierR = classifierFor(osName,archNameR)
                    def sourceSetName = sourceSetName("$classifier")
                    def source = binary.sharedLibraryFile

      • 修改第435行和第437行内容为classifierR

    7. “Esc”键,输入:wq!,按“Enter”保存并退出编辑。

  10. 返回到上一级目录,修改“conscrypt”目录下的build.gradle文件。

    1. 打开build.gradle文件。
      1
      vim build.gradle
      
    2. “i”进入编辑模式,修改第39行,并增加40行43行。
                       gcc(Gcc){
                        target("linux_aarch64") {
                        cppCompiler.executable = "/usr/bin/gcc"
                        }
                      }

    3. 在第160162行增加代码。
          dependencies {
              errorprone("com.google.errorprone:error_prone_core:2.3.3")
          }

    4. “Esc”键,输入:wq!,按“Enter”保存并退出编辑。

  11. 配置Gradle网络代理。

    1. 创建gradle.properties文件。
      1
      touch gradle.properties
      
    2. 添加如下内容后,保存并退出文件。请根据实际的代理环境配置代理的主机名、端口号、用户名和密码。
      org.gradle.jvmargs=-Xmx2500m -XX:MaxPermSize=256m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
      org.gradle.parallel=true
      systemProp.http.auth.ntlm.domain=CHINA
      systemProp.http.proxyHost=proxysg.huawei.com
      systemProp.http.proxyUser=实际代理用户名
      systemProp.http.proxyPassword=实际代理用户密码
      systemProp.http.proxyPort=8080
      systemProp.http.nonProxyHosts=*.huawei.com|localhost|127.0.0.1
      systemProp.https.proxyHost=proxysg.huawei.com
      systemProp.https.proxyUser=实际代理用户名
      systemProp.https.proxyPassword=实际代理用户密码
      systemProp.https.proxyPort=8080
      systemProp.https.nonProxyHosts=*.huawei.com|localhost|127.0.0.1
      systemProp.javax.net.ssl.trustStore=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.272.b10-7.oe1.aarch64/jre/lib/security/cacerts
      systemProp.javax.net.ssl.trustStorePassword=changeit

  12. 构建Conscrypt。

    1
    2
    cd /home/conscrypt
    ./gradlew clean build --stacktrace -x :conscrypt-openjdk:linux_aarch64Test -Dorg.conscrypt.openjdk.buildUberJar=true
    

  13. 进入“openjdk-uber/build/libs”目录。

    1
    cd openjdk-uber/build/libs
    

  14. 解压conscrypt-openjdk-uber-2.1.0.jar包。

    1
    jar xvf conscrypt-openjdk-uber-2.1.0.jar
    

  15. “/home/conscrypt/openjdk/build/linux_aarch_64/native-resources/META-INF/native\”目录下的libconscrypt_openjdk_jni-linux-aarch_64.so文件放入conscrypt-open-uber-2.1.0.jar包中的“META-INF/native”目录下。

    1
    cp /home/conscrypt/openjdk/build/linux_aarch_64/native-resources/META-INF/native/libconscrypt_openjdk_jni-linux-aarch_64.so META-INF/native
    

  16. 打包JAR,移植结束。

    1
    jar cvf conscrypt-openjdk-uber-2.1.0.jar META-INF/ org