cURL을 Android에서 사용하기 위해 Shared Library(libcurl.so)로 빌드하기(32bits/64bits/without-ssl)

2019. 6. 13. 20:04Programming/Android

반응형

2019년 8월부터 64bits를 지원하지 않는 앱은 구글 플레이에 등록할 수 없다. 그래서 지금 앱에서 어떤 라이브러리를 사용하고 있는지 확인하니, ffmpegcurl을 비롯하여 꽤 많은 라이브러리를 사용하고 있었다. ffmpeg을 어떻게건 빌드하긴 했는데, 64bits 라이브러리를 전부 포함하지 않아서 그런지 정상적으로 영상이 재생되지 않았다. 일단 할 수 있는건 curl을 포함한 나머지 라이브러리를 크로스컴파일하는 방법밖에 없었기에, 무작정 시작해봤다.


이 글에서는 Static Library에 대해서는 다루지 않는다. Android/iOS에서 사용하기 위한 curl을 Static Library로 빌드하기 위해서는, curl-android-ios, gcesarmza 깃허브를 참조하도록 하자. 체크아웃받아서 curl-compile-scripts에 포함된 셸 스크립트를 실행하면, 손쉽게 Static Library를 빌드할 수 있다.

이 글에서는 r14b 버전의 NDK를 사용했다. r19버전부터는 독립형 툴체인을 사용하지 않으므로, [Using the NDK with other build systems, Android Developers]를 참조하여 빌드 스크립트를 작성하도록 하자. r19버전 이상의 NDK를 사용하는 경우에는 이 글이 딱히 도움이 되진 않을 듯 하다.

이 글에서는 Ubuntu 16.04 LTS 환경에서 빌드를 진행했다. Cygwin은 뭘 잘못했는지 에러가 계속 나서 포기했다. ' ㅅ');;;
어지간하면 개발서버에서 진행하려고 했지만, 여러가지 에로사항이 꽃피어서 결국 개인 노트북에서 진행했다.

 
1. NDK 버전의 확인 및 다운로드

Android Studio의 SDK Manager를 통해서 NDK의 버전을 확인하고, NDK를 다운받도록 하자. 최신 버전의 경우에는 NDK 다운로드, Android Developers에서 다운받을 수 있다. 만약 구버전을 사용하고 있다면 NDK 아카이브, Android Developers에서 현재 사용중인 버전을 찾아 다운받도록 하자. 다운받고 적당한 위치에 압축을 풀면 된다.

 
2. 독립형 툴체인의 설치

독립형 툴체인을 설치하지 않고 NDK내에 위치한 toolchains의 gcc를 사용하는 경우, 링크중에 crtbegin_so.o, crtend_so.o를 찾지 못하는 경우가 발생할 수 있다. 이런 경우에는 독립형 툴체인을 설치해주도록 하자. $NDK_ROOT/build/tools에 있는 make-standalone-toolchain.sh 혹은 make_standalone_toolchain.py를 실행하면 간단하게 설치가 가능하다. 아무런 옵션도 지정하지 않는 경우에는 tmparmv7-a용 툴체인만 설치되므로, $NDK_ROOT/build/tools/make-standalone-toolchain.sh --install-dir=$HOME/toolchain --arch=arm64와 같은 방법을 이용해서 툴체인을 설치하도록 하자. --arch를 이용해서 대상 아키텍처를, --api를 이용해서 API 레벨을, --install-dir를 이용해서 설치 경로를 지정해줄 수 있다. 자세한 내용은 독립 실행형 툴체인, Android Developers를 참조하도록 하자.

 

필요한 툴체인의 설치가 완료됐다면 $TOOLCHAIN/bin을 환경변수에 등록해준다. 터미널에서 설치에 필요한 컴파일러가 잘 참조되는지 확인한다.

 
3. Configure Shell Script 작성

Configure가 없는 경우에는 buildconf를 실행하도록 하자. 이 때 빌드에 필요한 라이브러리가 설치되어있지 않은 경우, 경고와 함께 설치에 필요한 라이브러리가 안내된다. 적절하게 설치해주도록 하자.

Configure를 이용해서 빌드 설정을 해준다. 아래는 빌드를 할 때 사용했던 스크립트의 일부분이다. --host, --target는 타겟 아키텍쳐에 따라 지정해주고, --without-ssl이외의 옵션은 필요에 따라서 넣어주도록 하자. 불필요한 Static Library를 생성하고싶지 않은 경우에는 --disable-static 옵션을 지정해주면 된다. 아래는 64bits로 libcurl.so를 빌드하는 스크립트의 내용이다. 32bits로 빌드할 경우에는 컴파일러와 include, lib, --host--target값을 변경해주면 된다.

 

#!/bin/sh

export CC=aarch64-linux-android-gcc
export CPPFLAGS="-I$NDK_ROOT/platforms/android-21/arch-arm64/usr/include/"
export LDFLAGS="-pie -Wl,-rpath-link=$NDK_ROOT/platforms/android-21/arch-arm64/usr/lib/ -L$NDK_ROOT/platforms/android-21/arch-arm64/usr/lib/"
export LIBS="-lc" \
export CFLAGS="-fPIE -fPIC"

./configure \
        --host=aarch64-linux-android \
        --target=aarch64-linux-android \
        --disable-static \
        --without-ssl
 
4. Shared Library Install

위에서 생성한 스크립트를 실행하면, libcurl.so를 빌드하는데 필요한 옵션값들이 설정된다. 남은 것은 make install을 통해서 설치하는 것 뿐이다. configure에 prefix를 지정해주지 않았기 때문에 make install을 입력하면 /usr/bin 경로에 파일을 쓰려고 시도한다. 따라서 make install DESTDIR={생성된 파일을 저장할 경로}와 같이 입력하도록 하자. install 과정이 끝나면, 결과물을 확인할 수 있다. :)

 

참고:

반응형