Andorid Studio NDK開發(fā)-編譯OpenSSL類庫

OpenSSL是一個(gè)強(qiáng)大的開源安全套接字層密碼庫水评,它包含了主要的密碼學(xué)算法癌幕,常用的密鑰和證書封裝管理以及SSL協(xié)議,并提供豐富的應(yīng)用程序供測(cè)試或其他目的使用匆浙。
Android上開發(fā)對(duì)于安全的需求越來越高员寇,雖然OpenSSL出現(xiàn)過幾次漏洞弄慰,但它仍然是在安全方面的使用最多的加密庫之一。
OpenSSL是一個(gè)基于c語言開發(fā)的蝶锋,古老的陆爽,開源的加密庫,想要在Android上使用OpenSSL必須要借助NDK,先使用NDK編譯成Android上面的動(dòng)態(tài)連接庫(或者靜態(tài)鏈接庫)扳缕,再借助JNI層的封裝慌闭,提供給Java層調(diào)用。
這篇文章主要寫的是如何編譯AndroidOpenSSL類庫躯舔。參考OpenSSL的官方文檔:https://wiki.openssl.org/index.php/Android

前期準(zhǔn)備

環(huán)境準(zhǔn)備:

  • 編譯環(huán)境為MacOS
  • OpenSSL的源代碼
  • Setenv-android.sh 構(gòu)建腳本
  • 安裝Make
  • 安裝makedepend

OpenSSL可以在github上找到源代碼,源代碼地址:https://github.com/openssl/openssl

git clone git@github.com:openssl/openssl.git

也可以在官網(wǎng)上下載最新的release版本:https://www.openssl.org/source/
由于OpenSSL項(xiàng)目的主干(master)上提交的是開發(fā)分支贡必,最好把OpenSSL切換到最新的release版本上面

git checkout OpenSSL_1_1_0e

Setenv-android.sh是用來編譯Android上的OpenSSL的腳本,下載地址:https://wiki.openssl.org/images/7/70/Setenv-android.sh

wget https://wiki.openssl.org/images/7/70/Setenv-android.sh

Setenv-android.sh腳本可以運(yùn)行的權(quán)限

chmod a+x Setenv-android.sh

安裝makedepend

brew install makedepend

運(yùn)行腳本

Setenv-android.sh腳本的作用是用來給編譯OpenSSL配置Android編譯的環(huán)境變量的庸毫。腳本下載完成之后是不能直接運(yùn)行仔拟,原因在于腳本里面的變量并沒有配置,需要配置變量:

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

已經(jīng)設(shè)置了Android NDKAndroid SDK變量的飒赃,只需要把正確的值配置到腳本就可以了,設(shè)置腳本中的變量:

ANDROID_NDK_ROOT=$NDK_HOME
_ANDROID_API="android-23"
_ANDROID_EABI="arm-linux-androideabi-4.9"

運(yùn)行腳本:

./Setenv-android.sh

沒有Error出現(xiàn)就表示配置正確了利花。

編譯OpenSSL

上面的配置已經(jīng)給OpenSSl的編譯環(huán)境設(shè)置了環(huán)境變量例如:

export MACHINE=armv7
export RELEASE=2.6.37
export SYSTEM=android
export ARCH=arm

根據(jù)上面的設(shè)置的環(huán)境變量,再運(yùn)行./config就可以實(shí)現(xiàn)編譯Android上OpenSSL的配置,make就可以開始編譯了载佳。
因?yàn)樵贏ndroid設(shè)備上面運(yùn)行炒事,建議不要編譯完整的OpenSSL庫,官方給的建議編譯Android的選項(xiàng):

shared,no-ssl2,no-ssl3,no-comp,no-hw,no-engine

編輯OpenSSl的類庫可以安裝到本地蔫慧,這樣可以像使用NDK中其他庫一樣的使用OpenSSL挠乳,編譯命令可以設(shè)置--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

運(yùn)行到這里的時(shí)候得到一個(gè)這樣的信息:

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編譯的,編譯的這個(gè)類庫是不能在Android上面使用的睡扬。原因是什么呢盟蚣?查看了下環(huán)境變量:

echo $ANDROID_API

發(fā)現(xiàn)這個(gè)變量沒有配置,上面的環(huán)境變量的配置Setenv-android.sh在設(shè)置的環(huán)境變量并沒有起作用卖怜。

優(yōu)化編譯腳本

Setenv-android.sh中屎开,嘗試下打印$ANROID_API的值,打印$ANDROID_API的內(nèi)容:

echo "ANDROID_API: echo $ANDROID_API"

得到結(jié)果為:

...
ANDROID_API: android-23
...

可以看到$ANDROID_API變量在Setenv-android.sh的生命周期內(nèi)是有效的马靠,而腳本運(yùn)行結(jié)束之后設(shè)置的變量沒有設(shè)置成功這個(gè)應(yīng)該是因?yàn)槲沂褂昧?code>fish有關(guān),因此我就考慮把編譯的命令都放在Setenv-adnroid.sh里奄抽,在Setenv-android.sh的生命周期內(nèi)運(yùn)行完所有的編譯命令。
重新建一個(gè)腳本名字為build-android-openssl.sh
復(fù)制配置好的Setenv-android.sh的內(nèi)容到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源碼的目錄是同一級(jí)目錄甩鳄。
完成編譯之后可以看到/usr/local/ssl/android-23有生成了對(duì)應(yīng)的庫和文件,OpenSSL源代碼目錄下生成了:libcrypto.solibcrypto.a
這樣就完成了Android的OpenSSL庫編譯完成峦树,下一步就可以嘗試在NDK中引用OpenSSL了册踩。

優(yōu)化后的腳本地址:https://github.com/jjz/script/blob/master/build_android_openssl.sh

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末悠轩,一起剝皮案震驚了整個(gè)濱河市碱茁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌彬祖,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件品抽,死亡現(xiàn)場(chǎng)離奇詭異储笑,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)圆恤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門突倍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人盆昙,你說我怎么就攤上這事羽历。” “怎么了淡喜?”我有些...
    開封第一講書人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵秕磷,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我炼团,道長(zhǎng)澎嚣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任瘟芝,我火速辦了婚禮易桃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘锌俱。我一直安慰自己晤郑,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著造寝,像睡著了一般磕洪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上匹舞,一...
    開封第一講書人閱讀 52,196評(píng)論 1 308
  • 那天褐鸥,我揣著相機(jī)與錄音,去河邊找鬼赐稽。 笑死叫榕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的姊舵。 我是一名探鬼主播晰绎,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼括丁!你這毒婦竟也來了荞下?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤史飞,失蹤者是張志新(化名)和其女友劉穎尖昏,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體构资,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抽诉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吐绵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片迹淌。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖己单,靈堂內(nèi)的尸體忽然破棺而出唉窃,到底是詐尸還是另有隱情,我是刑警寧澤纹笼,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布纹份,位于F島的核電站,受9級(jí)特大地震影響廷痘,放射性物質(zhì)發(fā)生泄漏矮嫉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一牍疏、第九天 我趴在偏房一處隱蔽的房頂上張望蠢笋。 院中可真熱鬧,春花似錦鳞陨、人聲如沸昨寞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽援岩。三九已至歼狼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間享怀,已是汗流浹背羽峰。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留添瓷,地道東北人梅屉。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像鳞贷,于是被迫代替她去往敵國和親坯汤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,277評(píng)論 25 707
  • Android游戲開發(fā)實(shí)踐(1)之NDK與JNI開發(fā)02 承接上篇Android游戲開發(fā)實(shí)踐(1)之NDK與JNI...
    AlphaGL閱讀 3,755評(píng)論 0 24
  • 一搀愧、NDK產(chǎn)生的背景 Android平臺(tái)從誕生起惰聂,就已經(jīng)支持C、C++開發(fā)咱筛。眾所周知搓幌,Android的SDK基于J...
    Ten_Minutes閱讀 3,509評(píng)論 1 27
  • 1. 概述 openssl可以編譯成ARM下面的二進(jìn)制代碼(動(dòng)態(tài)庫或者靜態(tài)庫),方便APP使用迅箩,APP在使用的時(shí)候...
    夏日里的故事閱讀 28,169評(píng)論 9 16
  • 我出生在五月溉愁,一個(gè)鄰里鄰居都認(rèn)識(shí)的村子里。聽媽媽說沙热,生我那天下大雨,所以罢缸,姥姥給我起的名字帶一個(gè)“雨”字篙贸。...
    簡(jiǎn)書小雨閱讀 291評(píng)論 0 0