diff --git a/README.md b/README.md index 7e440a46..a6094a8c 100644 --- a/README.md +++ b/README.md @@ -161,7 +161,7 @@ void main() { see [example](https://github.com/rainyl/opencv_dart/tree/main/example) -~~More examples are on the way...~~see [opencv_dart.examples](https://github.com/rainyl/opencv_dart.examples) and share yours +~~More examples are on the way...~~ see [awesome-opencv_dart](https://github.com/rainyl/awesome-opencv_dart) and share yours ### TODO diff --git a/android/build.gradle b/android/build.gradle index 766f7fc1..14720eb7 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -68,38 +68,70 @@ android { } def SOURCE_DIR = project.buildscript.sourceFile.parentFile -def CACHE_DIR = SOURCE_DIR.parentFile -def CVD_VERSION = new File("${project.buildscript.sourceFile.parentFile.parentFile}/binary.version").text +def ROOT_DIR = SOURCE_DIR.parentFile +def CACHE_DIR = new File("${ROOT_DIR}/.dart_tool/.cache") +def CVD_VERSION = new File("${ROOT_DIR}/binary.version").text def CVD_LIB_URL_BASE = "https://github.com/rainyl/opencv_dart/releases/download" -def ARCHS = ['x86_64', 'arm64-v8a', 'armeabi-v7a'] - -task downloadLibs(type: Download) { - println "[opencv_dart] Downloading libraries..." - def SRC_URLS = ARCHS.collect { ARCH -> - "${CVD_LIB_URL_BASE}/v${CVD_VERSION}/libopencv_dart-android-${ARCH}.tar.gz" +def ABI_ALL = ['x86_64', 'arm64-v8a', 'armeabi-v7a'] +def ABI_ACCEPTED = ['x86_64', 'arm64-v8a', 'armeabi-v7a'] + +def OPENCV_DART_ANDROID_ENABLED_ABI = System.env.OPENCV_DART_ANDROID_ENABLED_ABI ?: null +if(OPENCV_DART_ANDROID_ENABLED_ABI != null){ + println "[opencv_dart] detected OPENCV_DART_ANDROID_ENABLED_ABI: $OPENCV_DART_ANDROID_ENABLED_ABI" + def enabledABI = OPENCV_DART_ANDROID_ENABLED_ABI.split(",") + def acceptedABI = [] + enabledABI.each { abi -> + if(ABI_ALL.contains(abi)){ + println "[opencv_dart] add abi: ${abi}" + acceptedABI.add(abi) + } else { + println "[opencv_dart] invalid abi: ${abi}, ignored" + } + } + println "[opencv_dart] accepted abi: $acceptedABI" + if (acceptedABI){ + ABI_ACCEPTED = acceptedABI + } else { + println "[opencv_dart] invalid OPENCV_DART_ANDROID_ENABLED_ABI: $OPENCV_DART_ANDROID_ENABLED_ABI" + println "[opencv_dart] will enable all supported ABI: $ABI_ACCEPTED" } - src(SRC_URLS) - dest CACHE_DIR - overwrite false } -ARCHS.each { arch -> +ABI_ALL.each { arch -> def extractTaskName = "opencv_dart_extract_libs_${arch}" + def targetDir = new File("${SOURCE_DIR}/src/main/jniLibs/${arch}") + if (targetDir.exists() && !ABI_ACCEPTED.contains(arch)) { + println "[opencv_dart] Deleting libraries for ${arch}..." + delete targetDir + } task(extractTaskName, type: Copy) { - def targetDir = new File("${SOURCE_DIR}/src/main/jniLibs/${arch}") onlyIf { - !file("${targetDir}/libopencv_dart.so").exists() + ABI_ACCEPTED.contains(arch) && !file("${targetDir}/libopencv_dart.so").exists() + } + doFirst { + println "[opencv_dart] Extracting libraries for ${arch}..." } from tarTree(resources.gzip("${CACHE_DIR}/libopencv_dart-android-${arch}.tar.gz")) into targetDir } } +task downloadLibs(type: Download) { + println "[opencv_dart] Downloading libraries..." + def SRC_URLS = ABI_ACCEPTED.collect { ARCH -> + "${CVD_LIB_URL_BASE}/v${CVD_VERSION}/libopencv_dart-android-${ARCH}.tar.gz" + } + src(SRC_URLS) + dest CACHE_DIR + overwrite false +} + task extractLibs(dependsOn: downloadLibs) { println "[opencv_dart] Extracting libraries..." - ARCHS.each { arch -> - finalizedBy "opencv_dart_extract_libs_${arch}" + ABI_ALL.each { arch -> + dependsOn "opencv_dart_extract_libs_${arch}" } + doLast { println "[opencv_dart] Extract finished." }