우찬쓰 개발블로그
opencv 안드로이드용 경량화 크로스컴파일 본문
그냥 다운받을 수 있는 android opencv sdk는 불필요한 모듈이 포함되어있으므로 빌드시 용량이 크다.
(https://sourceforge.net/projects/opencvlibrary/files/4.3.0/opencv-4.3.0-android-sdk.zip/download)
opencv 소스를 새로 크로스컴파일하여 경량화 해보자.
1. ABI 선택
'x86', 'armeabi-v7a', 'arm64-v8a', 'x86_64' 의 총 4개의 ndk cpu종류(ABI)에서,
x86과 x86_64(인텔 cpu)용은 용량이 크고, 대부분의 스마트폰은 arm cpu이므로 버려도됨.
'armeabi-v7a', 'arm64-v8a' 두개만 필요.
(그냥 다운받을 수 있는 android opencv sdk도 이 과정을 Gradle에서 처리할 수 있으므로 이정도로도 만족한다면 그냥 Gradle에서 처리하자. 아래 Gradle 코드 확인)
android {
...
defaultConfig {
...
ndk {
abiFilters 'armeabi-v7a', 'arm64-v8a'
}
}
}
2. 모듈 선택
cmake시 -DBUILD_LIST에 필요한 모듈만 넣어서 하면 됨.
동시에 abi 한종류밖에 빌드가 안되므로 -DANDROID_ABI를 바꿔가면서 두번 빌드 필요.
3. 과정
opencv 소스코드를 다운받음. ( https://opencv.org/releases/)
cmake, ninja, python등 다운로드 필요 ( https://webnautes.tistory.com/1268) 참고. (전체 과정은 이 가이드를 따라할 것.)
- 이 사이트의 가이드에서 몇가지 수정해야함 (android tools 24로 빌드해야함. ant 불필요. android tools는 24에 포함되어있음.)
- github.com/opencv/opencv/issues/8460 // android tools 24링크 포함
- cmake를 위해 tools를 임시로 24버전으로 바꿀꺼면, /Users/당신의유저이름/Library/Android/sdk/tools 를 임시로 바꾸도록 하자.
- java 1.8로 하길 추천.
command 예시(mac 기준, 내가 잘 빌드됐던 command)
- ndk 버전이 안맞아서 에러가 나면 잘 바꿔서 테스트 하도록 하자
cmake -GNinja -DCMAKE_INSTALL_PREFIX=/Users/당신의유저이름/Downloads/opencv-sources/-android-sdk -DANDROID_PROJECTS_BUILD_TYPE="ANT" -DBUILD_ANDROID_PROJECTS=ON -DANDROID_ABI=x86_64 -DBUILD_EXAMPLES=OFF -DBUILD_TESTS=OFF -DBUILD_PERF_TESTS=OFF -DBUILD_JAVA=ON -DBUILD_opencv_java=ON -DBUILD_SHARED_LIBS=OFF -DBUILD_FAT_JAVA_LIB=ON -DBUILD_PYTHON=OFF -DBUILD_ANDROID_EXAMPLES=OFF -DINSTALL_ANDROID_EXAMPLES=OFF -DANDROID_EXAMPLES_WITH_LIBS=OFF -DBUILD_DOCS=OFF -DWITH_OPENCL=ON -DANDROID_NDK_HOST_X64=ON -DCMAKE_TOOLCHAIN_FILE=/Users/당신의유저이름/Library/Android/sdk/ndk/21.2.6472646/build/cmake/android.toolchain.cmake -DANDROID_NDK=/Users/당신의유저이름/Library/Android/sdk/ndk/21.2.6472646 -DANDROID_SDK=/Users/당신의유저이름/Library/Android/sdk -DANDROID_TOOLCHAIN=clang -DANDROID_STL=c++_static -DANDROID_ARM_NEON=ON -DANDROID_NDK_HOST_X64=ON -DOPENCV_ENABLE_NONFREE=ON -DBUILD_LIST=core,imgproc,imgcodecs,java -DANDROID_NATIVE_API_LEVEL=17 -DANDROID_SDK_TARGET=29 -DANDROID_PLATFORM=19 ..
이렇게 크로스컴파일하여 넣고 빌드시, core,imgproc,imgcodecs 모듈과 'armeabi-v7a', 'arm64-v8a' 두개를 넣고 빌드한 apk가 약 7.4메가 정도의 용량이 추가된다. (껍데기 앱 2.5mb -> opencv만 추가한 앱 9.9mb)
- app bundle을 쓰고있다면 각 ABI에 따라 나눠서 스토어에 올릴 수 있으므로 용량면에서 더 좋다.
4. 전체 참고 문헌
developer.android.com/ndk/guides/cmake?hl=ko
fossies.org/linux/opencv/cmake/android/android_ant_projects.cmake
github.com/opencv/opencv/issues/8460
stackoverflow.com/questions/47150410/failed-to-run-sdkmanager-list-with-java-9
stackoverflow.com/questions/25594003/build-specific-modules-opencv
'안드로이드 > 안드로이드 개발' 카테고리의 다른 글
clearFocus 후에도 focus가 제대로 안사라지는 이슈 (0) | 2021.02.22 |
---|---|
ConstraintLayout이 다른 View를 침범하지 않게 하기 (0) | 2020.12.16 |
안드로이드 풀스크린으로 만들기 (0) | 2020.03.24 |
looper.quit() 과 looper.quitSafely() 차이 (0) | 2020.02.18 |
안드로이드 CheckBox padding between background and image (0) | 2019.11.29 |