How to set CmakeLists path in product flavor for e

2020-07-09 07:02发布

问题:

I need to have a separate CMakeLists.txt for each Android ABI. I tried to use product flavor to set the path for CMakeLists.txt. But I am getting following error on running ./gradlew assembleDebug or any other gradle command from command line.

Could not find method path() for arguments [CMakeLists.txt] on object of type com.android.build.gradle.internal.dsl.ExternalNativeCmakeOptions.

Here is how I have set product flavor in build.gradle.

productFlavors {
    arm64_v8a {
        ndk {
            abiFilters "arm64-v8a"
        }
        externalNativeBuild {
            cmake {
                path "CMakeLists.txt"
            }
        }
    }
    x86_64 {
        ndk {
            abiFilters "x86_64"
        }
        externalNativeBuild {
            cmake {
                path "CMakeLists.txt"
            }
        }
    }
}

NOTE - I had initially named the files as "CMakeLists_arm64-v8a.txt" and "CMakeLists_x86_64.txt". But that was failing so tried same name.

How to fix this or is there a workaround for this?

回答1:

No, you cannot have CMakeLists.txt paths different for different flavors and/or ABIs, but you can use the arguments to add conditionals in your cmake script, for example like this:

flavorDimensions "abi"
productFlavors {
    arm64_v8a {
        dimension "abi"
        ndk {
            abiFilters "arm64-v8a"
        }
        externalNativeBuild {
            cmake {
                arguments "-DFLAVOR=ARM"
            }
        }
    }
    x86_64 {
        dimension "abi"
        ndk {
            abiFilters "x86_64"
        }
        externalNativeBuild {
            cmake {
                arguments "-DFLAVOR=x86"
            }
        }
    }
}

Now you can check this in your CMakeLists.txt:

if (FLAVOR STREQUAL 'ARM')
  include(arm.cmake)
endif()

But in your case, you can rely on the argument that is defined by Android Studio, and don't need your own parameter:

if (ANDROID_ABI STREQUAL 'arm64-v8a')
  include(arm.cmake)
endif()

Actually, you probably don't need separate productFlavors at all, but rather use splits to produce thin APKs for each ABI.