FSA全栈行动 FSA全栈行动
首页
  • 移动端文章

    • Android
    • iOS
    • Flutter
  • 学习笔记

    • 《Kotlin快速入门进阶》笔记
    • 《Flutter从入门到实战》笔记
    • 《Flutter复习》笔记
前端
后端
  • 学习笔记

    • 《深入浅出设计模式Java版》笔记
  • 逆向
  • 分类
  • 标签
  • 归档
  • LinXunFeng
  • GitLqr

公众号:FSA全栈行动

记录学习过程中的知识
首页
  • 移动端文章

    • Android
    • iOS
    • Flutter
  • 学习笔记

    • 《Kotlin快速入门进阶》笔记
    • 《Flutter从入门到实战》笔记
    • 《Flutter复习》笔记
前端
后端
  • 学习笔记

    • 《深入浅出设计模式Java版》笔记
  • 逆向
  • 分类
  • 标签
  • 归档
  • LinXunFeng
  • GitLqr
  • AndroidUI

  • Android第三方SDK

  • Android混淆

  • Android仓库

  • Android新闻

  • Android系统开发

  • Android源码

  • Android注解AOP

  • Android脚本

  • AndroidTv开发

  • AndroidNDK

    • AndroidNDK - makefile语法详解
    • AndroidNDK - Cmake详解
    • AndroidNDK - 编译 openssl
      • 一、简述
      • 二、实战
      • 三、踩坑
        • 1、make 错误:make: command not found
        • 2、perl 错误:/usr/bin/env perl does work as command but not in perl script
        • 3、perl 错误:Can't locate Pod/Usage.pm in @INC
  • Android音视频

  • Android热修复

  • Android性能优化

  • Android云游戏

  • Android插件化

  • iOSUI

  • iOS工具

  • iOS底层原理与应用

  • iOS组件化

  • iOS音视频

  • iOS疑难杂症

  • iOS之Swift

  • iOS之RxSwift

  • iOS开源项目

  • iOS逆向

  • Flutter开发

  • 移动端
  • AndroidNDK
GitLqr
2023-10-25
目录

AndroidNDK - 编译 openssl

欢迎关注微信公众号:[FSA全栈行动 👋]

# 一、简述

如果你想快速在项目中使用上 openssl,可以使用网上其他开发者提供好的预编译库:

  • OpenSSL(All):https://builds.viaduck.org/prebuilts/openssl/ (opens new window)
  • OpenSSL(3.1.*) :https://github.com/217heidai/openssl_for_android (opens new window)

以上的预编译库可能最低只支持 API 21(即 Android 5),如果你的项目需要支持 API 19(Android 4.4.x)及以下的话,就得自己编译 openssl 了,本篇主要记录本人编译 openssl 1.1.1 过程以及遇到的问题,可能对你有所帮助。

# 二、实战

首先到 openssl 官网或官方仓库中,找到你需要的版本(主要分为 3.x 和 1.x),下载链接如下:

  • openssl 官网:https://www.openssl.org (opens new window)
  • GitHub releases:https://github.com/openssl/openssl/releases (opens new window)

注意:建议不要直接 clone github 仓库(仓库上的最新代码可能存在 bug),要使用官方 release 出来的归档。

这里我就使用 1.x 中最新的的 1.1.1w 为例,点击 openssl-1.1.1w.tar.gz 下载后解压。

因为 openssl 官方目前没有提供 cmake 编译脚本,还是采用传统的 make 命令编译,所以我们需要编写一个 shell 脚本,命名为 build_openssl.sh,与 openssl-1.1.1w 文件夹同级。

build_openssl.sh 文件内容如下:

#!/bin/bash
set -e
# GitLqr:执行 pwd 命令获取当前脚本所在目录路径,并赋值给 CRTDIR 变量
CRTDIR=$(pwd)
# GitLqr:拼接 openssl 源码目录路径
SRC_DIR=$CRTDIR/openssl-1.1.1w

# GitLqr:根据你当前的操作系统,使用对应的 NDK_PLATFORM 变量
# NDK_PLATFORM=darwin-x86_64
# NDK_PLATFORM=linux-x86_64
NDK_PLATFORM=windows-x86_64

# GitLqr:修改为你的 ndk 目录路径
export ANDROID_NDK_HOME=/c/Users/CharyLin/AppData/Local/Android/Sdk/ndk/21.1.6352462
# GitLqr:高版本 NDK 不再包含 gcc, 因此需要将 NDK 内置的 clang 加到入 PATH 环境变量中
export PATH=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/$NDK_PLATFORM/bin:$PATH
# GitLqr:编译 arm64 架构需要用到脚本
export PATH=$ANDROID_NDK_HOME/toolchains/aarch64-linux-android-4.9/prebuilt/$NDK_PLATFORM/bin:$PATH
# GitLqr:编译 arm 架构需要用到脚本
export PATH=$ANDROID_NDK_HOME/toolchains/arm-linux-androideabi-4.9/prebuilt/$NDK_PLATFORM/bin:$PATH

cd $SRC_DIR

function build_onearch
{
	echo ">> configure $ARCH"

	# GitLqr:指定最低支持的 api 和 cpu 架构
	./Configure $ARCH -D__ANDROID_API__=$API
	# GitLqr:只生成 .a 静态库文件
	# ./Configure $ARCH -D__ANDROID_API__=$API no-shared

	echo "<< configure $ARCH"
	make clean
	make
	make install
}

#ARCH=android-arm64
#API=21
#build_onearch

ARCH=android-arm
API=19
build_onearch

注意:Windows 系统下,文件路径是带有盘符的,例如:C:/xxx,而 PATH 中多个环境变量路径又刚好使用冒号 : 分割,为了避免不必要的麻烦,建议修改为 /c/xxx。

脚本内容不难理解,就是进入到 openssl 源码目录,执行 Configure 进行一些参数配置,然后执行 make 编译而已,请根据自己的情况,修改脚本中的变量值(例如:NDK_PLATFORM、ANDROID_NDK_HOME)。脚本中 ARCH 变量的值,需要根据当前项目情况编写,具体有哪些值,可以通过执行 ./Configure 查看,例如 Android 平台支持的架构有:

android-arm android-arm64 android-armeabi android-mips android-mips64
android-x86 android-x86_64 android64 android64-aarch64 android64-mips64
android64-x86_64

之后,运行 build_openssl.sh,等待编译完成之后(每编译一个架构大约需要 10 分钟),就可以在 openssl-1.1.1w 目录下找到编译产物了:

  • libssl.so / libssl.a
  • libcrypto.so / libcrypto.a

# 三、踩坑

因为本人使用的是 Windows 系统,不像 Mac 或 Linux 那样,天然自带各种 shell 命令,所以在执行 build_openssl.sh 文件时遇到了一些阻碍,这里将踩过的坑记录一下。想要在 Windows 下执行 .sh 文件,需要用到 MinGW 环境,因为有安装过 Git,所以可以在 Git Bash 中执行,直接在文件管理器中右键菜单中,点击 Open Git Bash here 即可打开 Git Bash 容器,并自动 cd 到了当前目录:

注:如果右键菜单中没有 Open Git Bash here 选项,可以去开始菜单搜索 Git Bash 运行,然后手动 cd 到 .sh 文件所在目录。

# 1、make 错误:make: command not found

在 Git Bash 窗口中执行 ./build_openssl.sh,报错:

./build_openssl.sh: line 32: make: command not found

这是因为 Git Bash 默认的 mingw64 环境中没有 make 工具,可以到如下地址,下载 make-4.4.1-without-guile-w32-bin.zip 文件。

  • make-4.4.1-without-guile-w32-bin.zip:https://sourceforge.net/projects/ezwinports/files/ (opens new window)

将 make-4.4.1-without-guile-w32-bin.zip 压缩包中的所有文件拷贝到 \Git\mingw64 目录下,合并文件夹即可:

# 2、perl 错误:/usr/bin/env perl does work as command but not in perl script

在 Git Bash 窗口中执行 ./build_openssl.sh,报错:

/usr/bin/env perl does work as command but not in perl script
  • stackoverflow 上关于该问题的讨论:https://stackoverflow.com/questions/34791031/usr-bin-env-perl-does-work-as-command-but-not-in-perl-script (opens new window)

其实 Git Bash 是支持 perl 的,但是个别版本的 Git Bash 可能不支持 #!/usr/bin/env perl 命令,可以改用 #!/usr/bin/perl 来使用 perl。在 openssl-1.1.1w 目录找到 Configure 文件,将第一行的 #!/usr/bin/env perl 删除,改为:

#!/usr/bin/perl

# 3、perl 错误:Can't locate Pod/Usage.pm in @INC

在 Git Bash 窗口中执行 ./build_openssl.sh,报错:

Can't locate Pod/Usage.pm in @INC (you may need to install the Pod::Usage module) (@INC contains: . /usr/lib/perl5/site_perl /usr/share/perl5/site_perl /usr/lib/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib/perl5/core_perl /usr/share/perl5/core_perl) at configdata.pm line 15251.
BEGIN failed--compilation aborted at configdata.pm line 15251.
Compilation failed in require.
BEGIN failed--compilation aborted.

这是因为 Git Bash 默认自带的 perl 工具被精简过,缺少了一些文件,比如这里就找不到 Pod/Usage.pm,所以解决该问题也简单,补全这些缺少的文件即可,到 strawberryperl 官网下载 strawberry-perl-xx.zip 文件:

  • strawberryperl 官网:https://strawberryperl.com/releases.html (opens new window)
  • strawberry-perl-5.32.1.1-64bit.zip:https://strawberryperl.com/download/5.32.1.1/strawberry-perl-5.32.1.1-64bit.zip (opens new window)

然后打开 strawberry-perl-xx.zip 压缩包,找到 \perl\lib\ 目录下的 Pod 文件夹,将其拷贝到本机的 \Git\usr\lib\perl5\vendor_perl 目录下:

注:如果本地已经有 Pod 目录,那么合并即可。

经过上述几个填坑步骤之后,在 Git Bash 窗口中就可以顺利执行完 build_openssl.sh 了。😩😩😩

#NDK#openssl
AndroidNDK - Cmake详解
Android音视频 - Libyuv使用实战

← AndroidNDK - Cmake详解 Android音视频 - Libyuv使用实战→

最近更新
01
Flutter - Xcode16 还原编译速度
04-05
02
AI - 免费的 Cursor 平替方案
03-30
03
Android - 2025年安卓真的闭源了吗
03-28
更多文章>
Theme by Vdoing | Copyright © 2020-2025 FSA全栈行动
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×