Gradle/android: единая сборка ndk для нескольких вариантов?

у меня есть настройка файла build.gradle со следующим (я, очевидно, исключил части, которые не должны иметь значения для краткости):

android { defaultConfig { ndk { abiFilters 'armeabi', 'armeabi-v7a', 'x86' } }
productFlavors {
    flavor1 { ... }
    flavor2 { ... }
    flavor3 { ... }
    flavor4 { ... }
    flavor5 { ... }
}
buildTypes {
    debug {
        externalNativeBuild { ndkBuild { cFlags '-DDEBUG' } }
        ...
    }
    release {
        externalNativeBuild { ndkBuild { cFlags '-DRELEASE' } }
        ...
    }
}
externalNativeBuild {
    ndkBuild {
       path 'jni/Android.mk'
    }
}

он работает, но компилирует нативный код для каждого flavor+buildType. так что не только отладка и релиз, но и флейвор1дебаг, флейвор2релиз и т. д., что занимает вечность

как мне указать gradle выполнять externalNativeBuild только для двух типов сборки и использовать их для всех разновидностей?


person mrqs    schedule 19.04.2017    source источник
comment
У меня аналогичная проблема со сборкой cmake. Настройка Gradle занимает почти час после добавления сборки cmake. У нас довольно много вариантов, и наша библиотека C++ и конфигурация cmake также довольно велики.   -  person Slion    schedule 13.10.2017


Ответы (1)


Это правда, если вы заглянете в файл .externalNativeBuild/ndkBuild/flavor1Debug/armeabi/ndkBuild_build_command.txt, то увидите что-то похожее на мое:

Executable : ~/Library/Android/sdk/ndk-bundle/ndk-build
arguments : 
NDK_PROJECT_PATH=null
APP_BUILD_SCRIPT=~/proj/jni/Android.mk
APP_ABI=armeabi
NDK_ALL_ABIS=armeabi
NDK_DEBUG=1
APP_PLATFORM=android-21
NDK_OUT=~/app/build/intermediates/ndkBuild/flavor1/debug/obj
NDK_LIBS_OUT=~/app/build/intermediates/ndkBuild/flavor1/debug/lib
APP_SHORT_COMMANDS=false
LOCAL_SHORT_COMMANDS=false
-B
-n
jvmArgs : 

и так далее для каждого варианта сборки. Что вы можете сделать, чтобы сократить время сборки?

  1. Извлеките трудоемкую часть в статическую библиотеку (или набор статических библиотек) и оставьте только конечную ссылку для интегрированного ndkBuild. Используйте эти статические библиотеки как $(PREBUILT_STATIC_LIBRARY).

  2. Полностью отключите встроенный ndkBuild и установите

    jniLibs.srcDir 'src/main/libs'
    

    Самый простой способ отключить встроенный ndkBuild — указать

    jni.srcDirs = []
    

    Но вы также можете сохранить индексацию файлов cpp в Android Studio, но отключить задачу gradle:

    tasks.all { task ->
        if (task.name.startsWith('compile') && task.name.endsWith('Ndk')) {
            task.enabled = false
        }
    }
    
person Alex Cohn    schedule 25.05.2017