보통 안드로이드 개발시에 Android Studio를 사용 하거나 sdkmanager를 사용해서 SDK나 NDK등등의 각종 패키지가 버전 별로 설치 가능 합니다.

하지만 자동화 등의 이유로 별도의 위치에 설치하고자 하는 경우도 있습니다. MacOS X에서는 외부 패키지를 설치하기 위해 brew 를 많이 사용하는데, 여기에는 Cask 라고 하는 바이너리 패키지 설치를 위한 기능이 있습니다. Cask에는 이미 이런 목적으로 android-ndk 패키지가 있습니다만 최신 버전을 설치하는 관계로, 오래된 특정 버전을 사용하고 하는 경우에는 약간의 트릭을 사용해야 합니다.

제 경우 작업을 위해 NDK 버전 13b를 사용해야 하는데, 물론 수동으로 받아서 설치 하는 것도 가능합니다만 관리를 약간 편하게 하기 위해서 Cask 소스를 변경하여 brew 를 사용해서 Android NDK 13b 를 설치하는 방법에 대해서 설명합니다.

android-ndk를 brew를 이용하여 설치하기

보통은 다음과 같이 설치할 수 있습니다.

% brew cask install android-ndk

하지만 이 경우 항상 최신 버전을 받아서 설치하게 됩니다. 이 글을 쓰는 현재 버전 19을 설치 합니다.

brew는 이전 버전을 설치하는 좋은 방법이 존재하지 않기도 하는데, github에서 이전 버전을 받아서 설치하는 방법이 있습니다만 공교롭게도 cask의 android-ndk 소스는 가장 오래된 것이 버전 14부터 시작 합니다. 따라서 13b 자체는 Cask 소스가 존재하지 않으므로 다음과 같은 과정을 거쳐야 합니다.

brew 의 android-ndk 설치 소스

brew 의 개별 패키지의 Cask 파일은 github에서 android-ndk의 경우 다음 위치 에서 찾을 수 있습니다. 이것을 다운로드합니다.

% wget https://raw.githubusercontent.com/Homebrew/homebrew-cask/master/Casks/android-ndk.rb

버전 19의 경우 android-ndk.rb는 다음과 같이 시작합니다:

cask 'android-ndk' do
  version '19'
  sha256 '04159ade2fc5c7d055248cf65664039b8596f4b9ee3fbc44a9bf2ce2ee28d95d'

  # dl.google.com/android/repository/android-ndk was verified as official when first introduced to the cask
  url "https://dl.google.com/android/repository/android-ndk-r#{version}-darwin-x86_64.zip"
  name 'Android NDK'
  homepage 'https://developer.android.com/ndk/index.html'
...

파일을 잘 보면 Cask는 버전 19을 위한 것이며 sha256 체크섬과 다운로드 위치가 적혀 있습니다. 원본을 받는 URL도 적혀 있는데 여기서 버전만 바꾸어서 NDK 13b를 다운로드 받습니다.

% wget https://dl.google.com/android/repository/android-ndk-r13b-darwin-x86_64.zip

파일을 다 받았으면 sha256 체크섬을 계산해 둡니다. brew에서 md5sha1sum패키지를 설치하면 들어 있는 shasum유틸리티로 계산합니다:

$ shasum -a 256 android-ndk-r13b-darwin-x86_64.zip
eba299f1cdd9059e635d159dbe71678cea9f00efb3ef9b56083c7a09dff665bf  android-ndk-r13b-darwin-x86_64.zip

이제 위의 android-ndk.rb의 소스에서 버전명과 체크섬을 위에서 구한 값으로 변경 합니다. 아래 diff 를 적용하거나 직접 변경 하세요:

--- android-ndk-19.rb   2019-02-15 17:17:07.000000000 -0800
+++ android-ndk.rb  2019-02-17 15:29:05.000000000 -0800
@@ -1,6 +1,6 @@
 cask 'android-ndk' do
-  version '19'
-  sha256 '04159ade2fc5c7d055248cf65664039b8596f4b9ee3fbc44a9bf2ce2ee28d95d'
+  version '13b'
+  sha256 'eba299f1cdd9059e635d159dbe71678cea9f00efb3ef9b56083c7a09dff665bf'

   # dl.google.com/android/repository/android-ndk was verified as official when first introduced to the cask
   url "https://dl.google.com/android/repository/android-ndk-r#{version}-darwin-x86_64.zip"

주의할 것은 설치시 파일명은 패키지 이름과 일치해야 하므로 android-ndk.rb이어야 합니다.

설치

이제 설치해 봅니다. brew cask로 설치시에는 보통 brew cask install <패키지이름>을 사용하는데 패키지 이름에는 URL도 올 수 있습니다. 로컬 파일의 경우에는 file:///를 앞에 붙이면 로컬 파일을 지정할 수 있으므로, 위에서 변경된 android-ndk.rb 파일의 전체 경로명을 지정하면 됩니다. 신규 설치의 경우 install명령을, 이미 설치된 android-ndk가 있다면 재설치를 위해서 reinstall명령을 사용하면 됩니다. 신규 설치의 경우 다음과 같이 실행하면 이제 Android NDK 버전 19 대신에 13b 를 설치하게 됩니다. (설치에는 시간이 좀 걸립니다)

% brew cask install file:///Users/junho/android-ndk.rb
==> Downloading file:/Users/junho/android-ndk.rb.
######################################################################## 100.0%
==> Caveats
You may want to add to your profile:
   'export ANDROID_NDK_HOME="/usr/local/share/android-ndk"'

==> Satisfying dependencies
==> Downloading https://dl.google.com/android/repository/android-ndk-r13b-darwin-x86_64.zip
Already downloaded: /Users/junho/Library/Caches/Homebrew/downloads/65a6a66e139e460180b51cf64e9571a101d62c9a555443b2d99243070c1dee18--android-ndk-r13b-darwin-x86_64.zip
==> Verifying SHA-256 checksum for Cask 'android-ndk'.
==> Uninstalling Cask android-ndk
==> Unlinking Binary '/usr/local/bin/ndk-build'.
==> Unlinking Binary '/usr/local/bin/ndk-depends'.
==> Unlinking Binary '/usr/local/bin/ndk-gdb'.
==> Unlinking Binary '/usr/local/bin/ndk-stack'.
==> Unlinking Binary '/usr/local/bin/ndk-which'.
==> Purging files for version 13b of Cask android-ndk
==> Installing Cask android-ndk
==> Linking Binary 'ndk_exec.sh' to '/usr/local/bin/ndk-build'.
==> Linking Binary 'ndk_exec.sh' to '/usr/local/bin/ndk-depends'.
==> Linking Binary 'ndk_exec.sh' to '/usr/local/bin/ndk-gdb'.
==> Linking Binary 'ndk_exec.sh' to '/usr/local/bin/ndk-stack'.
==> Linking Binary 'ndk_exec.sh' to '/usr/local/bin/ndk-which'.
🍺  android-ndk was successfully installed!

이제 완성입니다! 위에서 설명이 나왔지만 ANDROID_NDK_HOME환경 변수를 설정해서 현재 설치된 버전을 지정하도록 해야 합니다.

export ANDROID_NDK_HOME="/usr/local/share/android-ndk"'

설치가 제대로 되었는지 알기 위해서 다음 명령을 실행해 봅니다. android-ndk-r13b아래의 gcc를 사용할 수 있는 것을 알 수 있습니다.

% which ndk-which
/usr/local/bin/ndk-which
% ndk-which gcc
/usr/local/Caskroom/android-ndk/13b/android-ndk-r13b/prebuilt/darwin-x86_64/bin/../../../toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gcc

끝으로

원래 brew에는 pin 기능이 있어서 설치된 버전을 고정해서 업그레이드를 막는 기능이 있는데 Cask 로 설치된 패키지에는 이 글을 쓰는 현재 pin 기능이 없습니다. 이 부분은 향후 추가되면 좋겠네요.