우찬쓰 개발블로그

opencv 안드로이드용 경량화 크로스컴파일 본문

안드로이드/안드로이드 개발

opencv 안드로이드용 경량화 크로스컴파일

이우찬 2020. 6. 1. 13:26
반응형

그냥 다운받을 수 있는 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

webnautes.tistory.com/1268

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

stackoverflow.com/questions/44593680/building-opencv4android-from-source-does-not-output-libopencv-java-so

 

반응형
Comments