Andorid Studio NDK開發-編譯OpenSSL類庫
OpenSSL
是一個強大的開源安全套接字層密碼庫,它包含了主要的密碼學演算法,常用的金鑰和證照封裝管理以及SSL協議,並提供豐富的應用程式供測試或其他目的使用。
在Android
上開發對於安全的需求越來越高,雖然OpenSSL
出現過幾次漏洞,但它仍然是在安全方面的使用最多的加密庫之一。OpenSSL
是一個基於c語言開發的,古老的,開源的加密庫,想要在Android
上使用OpenSSL
必須要藉助NDK
,先使用NDK編譯成Android上面的動態連線庫(或者靜態連結庫),再借助JNI層的封裝,提供給Java層呼叫。
這篇文章主要寫的是如何編譯Android
的OpenSSL
類庫。參考OpenSSL的官方文件:https://wiki.openssl.org/index.php/Android
前期準備
環境準備:
- 編譯環境為MacOS
- OpenSSL的原始碼
- Setenv-android.sh 構建指令碼
- 安裝Make
- 安裝makedepend
OpenSSL
可以在github上找到原始碼,原始碼地址:https://github.com/openssl/openssl
git clone git@github.com:openssl/openssl.git
也可以在官網上下載最新的release版本:https://www.openssl.org/source/
由於OpenSSL
專案的主幹(master)上提交的是開發分支,最好把OpenSSL
切換到最新的release版本上面
git checkout OpenSSL_1_1_0e
Setenv-android.sh
是用來編譯Android上的OpenSSL的指令碼,下載地址:https://wiki.openssl.org/images/7/70/Setenv-android.sh
給Setenv-android.sh
指令碼可以執行的許可權
chmod a+x Setenv-android.sh
安裝makedepend
brew install makedepend
執行指令碼
Setenv-android.sh
指令碼的作用是用來給編譯OpenSSL配置Android編譯的環境變數的。指令碼下載完成之後是不能直接執行,原因在於指令碼里面的變數並沒有配置,需要配置變數:
ANDROID_NDK_ROOT:
ANDROID_ARCH: arch-arm
ANDROID_EABI: arm-linux-androideabi-4.9
ANDROID_API: android-23
ANDROID_SYSROOT: /platforms/android-23/arch-arm
ANDROID_TOOLCHAIN:
FIPS_SIG:
CROSS_COMPILE: arm-linux-androideabi-
ANDROID_DEV: /platforms/android-23/arch-arm/usr
已經設定了Android NDK
和Android SDK
變數的,只需要把正確的值配置到指令碼就可以了,設定指令碼中的變數:
ANDROID_NDK_ROOT=$NDK_HOME
_ANDROID_API="android-23"
_ANDROID_EABI="arm-linux-androideabi-4.9"
執行指令碼:
./Setenv-android.sh
沒有Error
出現就表示配置正確了。
編譯OpenSSL
上面的配置已經給OpenSSl的編譯環境設定了環境變數例如:
export MACHINE=armv7
export RELEASE=2.6.37
export SYSTEM=android
export ARCH=arm
根據上面的設定的環境變數,再執行./config
就可以實現編譯Android上OpenSSL的配置,make就可以開始編譯了。
因為在Android裝置上面執行,建議不要編譯完整的OpenSSL庫,官方給的建議編譯Android的選項:
shared,no-ssl2,no-ssl3,no-comp,no-hw,no-engine
編輯OpenSSl
的類庫可以安裝到本地,這樣可以像使用NDK中其他庫一樣的使用OpenSSL,編譯命令可以設定--openssldir
用來指定OpenSSL的安裝目錄。
cd openssl-1.0.1t
perl -pi -e 's/install: all install_docs install_sw/install: install_docs install_sw/g' Makefile.org
./config shared no-ssl2 no-ssl3 no-comp no-hw no-engine --openssldir=/usr/local/ssl/$ANDROID_API
執行到這裡的時候得到一個這樣的資訊:
perating system: i686-apple-darwinDarwin Kernel Version 15.5.0: Tue Apr 19 18:36:36 PDT 2016; root:xnu-3248.50.21~8/RELEASE_X86_64
WARNING! If you wish to build 64-bit library, then you have to
invoke './Configure darwin64-x86_64-cc' *manually*.
You have about 5 seconds to press Ctrl-C to abort.
編譯的OpenSSL
使用的是本地的darwin64-x86_64-cc
,並不是想要的arm-linux-androideabi-gcc
編譯的,編譯的這個類庫是不能在Android上面使用的。原因是什麼呢?檢視了下環境變數:
echo $ANDROID_API
發現這個變數沒有配置,上面的環境變數的配置Setenv-android.sh
在設定的環境變數並沒有起作用。
優化編譯指令碼
在Setenv-android.sh
中,嘗試下列印$ANROID_API
的值,列印$ANDROID_API
的內容:
echo "ANDROID_API:
echo $ANDROID_API
"
得到結果為:
...
ANDROID_API: android-23
...
可以看到$ANDROID_API
變數在Setenv-android.sh
的生命週期內是有效的,而指令碼執行結束之後設定的變數沒有設定成功這個應該是因為我使用了fish
有關,因此我就考慮把編譯的命令都放在Setenv-adnroid.sh
裡,在Setenv-android.sh
的生命週期內執行完所有的編譯命令。
重新建一個指令碼名字為build-android-openssl.sh
複製配置好的Setenv-android.sh
的內容到build-android-openssl.sh
,再新增命令:
cd openssl
make clean
perl -pi -e 's/install: all install_docs install_sw/install: install_docs install_sw/g' Makefile.org
./config shared no-ssl2 no-ssl3 no-comp no-hw no-engine --openssldir=/usr/local/ssl/$ANDROID_API
make depend
make all
sudo -E make install CC=$ANDROID_TOOLCHAIN/arm-linux-androideabi-gcc RANLIB=$ANDROID_TOOLCHAIN/arm-linux-androideabi-ranlib
注:該指令碼和openssl
原始碼的目錄是同一級目錄。
完成編譯之後可以看到/usr/local/ssl/android-23
有生成了對應的庫和檔案,OpenSSL原始碼目錄下生成了:libcrypto.so
和libcrypto.a
這樣就完成了Android的OpenSSL
庫編譯完成,下一步就可以嘗試在NDK中引用OpenSSL了。
優化後的指令碼地址:https://github.com/jjz/script/blob/master/build_android_openssl.sh
相關文章
- Andorid Studio NDK 開發 – 編譯 OpenSSL 類庫編譯
- Andorid Studio NDK開發-使用NDK庫
- Andorid Studio NDK 開發 – NDK 開發利器 gradle-experimentalGradle
- android studio配置ndk開發Android
- Android Studio中NDK開發Android
- FFmpeg開發筆記(十六)Linux交叉編譯Android的OpenSSL庫筆記Linux編譯Android
- libusb android ndk編譯--編譯mipsAndroid編譯
- Android Studio NDK開發-環境配置Android
- Mac之Android Studio開發NDK入門MacAndroid
- Android Studio NDK開發-JNI呼叫Java方法AndroidJava
- Android Studio3.0 NDK配置與開發Android
- Android NDK祕籍--編譯靜態庫、呼叫靜態庫Android編譯
- Qt開發筆記:OpenSSL庫介紹、windows上mingw32版本的OpenSSL編譯模組化QT筆記Windows編譯
- Visual Studio 2022 靜態庫編譯編譯
- 交叉編譯-Mac環境使用NDK編譯FFmpeg編譯Mac
- Android:JNI與NDK(二)交叉編譯與動態庫,靜態庫Android編譯
- AndroidStudio使用NDK編譯C/C++程式碼使用原生庫Android編譯C++
- Android 基於ffmpeg開發簡易播放器 - NDK交叉編譯ffmpegAndroid播放器編譯
- QT支援https及編譯OpenSSLQTHTTP編譯
- openssl-3.0.0-alpha9編譯編譯
- Andorid SQLite資料庫開發基礎教程(2)SQLite資料庫
- Andorid SQLite資料庫開發基礎教程(1)SQLite資料庫
- Andorid SQLite資料庫開發基礎教程(3)SQLite資料庫
- Windows系統編譯libhv帶SSL,開啟WITH_OPENSSLWindows編譯
- AndroidStudio之NDK常見編譯錯誤Android編譯
- NDK clang編譯器的一個bug編譯
- OpenSSL 編譯(vs2015+win10)編譯Win10
- openssl原始碼編譯及配置方法原始碼編譯
- Android開發編譯curl庫給Android使用Android編譯
- Android-NDK-11-C語言編譯原理AndroidC語言編譯原理
- Linux系統下編譯Openssl 步驟:Linux編譯
- Android NDK開發(二) 使用ndk-build構建工具進行NDK開發AndroidUI
- DevEco Studio 3.1 Release | 動態共享包開發,編譯更快,包更小dev編譯
- Android Studio NDK:三、打包SOAndroid
- NDK學習筆記-NDK開發流程筆記
- [譯]開發類 redux 庫來理解狀態管理Redux
- Android Studio 已有專案新增NDK支援(mac/ndk-build)AndroidMacUI
- 編譯開源 Swift Foundation 庫編譯Swift
- Ndk 初步開發 In AndroidAndroid