Our Android application consists of 40-some Android Library Modules (ALMs), each of which also builds a C++ shared library with externalNativeBuild
and CMake. So far we had the dependencies between these libs set up like this:
- The dependent ALM references the dependency ALM with
api project(':lib')
- The dependent CMake script references the dependency .so with
add_library(SHARED IMPORTED lib)
andset_target_properties(lib PROPERTIES IMPORTED_LOCATION ...)
and a relative path.
Recently we had to upgrade to the latest Android API version. This started off a cascade because now we were getting deprecated warnings in code generated by the navigation-ktx library, but upgrading that requires upgrading Gradle and the Android Gradle plugin. After that I started getting errors like liblib.so, needed by 'project', missing and no known rule to make it
.
It looks like the latest Gradle parallelizes build tasks more heavily, and this means the dependent CMake/Ninja builds are being started concurrently with their dependencies, resulting in this error because the dependency is not yet built. I figured out that what we were doing was not entirely supported, but there is a "supported" way to do that now, so I refactored our entire build to use Prefab.
Now I started getting other errors, alternating between:
1.
C++ build system [prefab] failed while executing ...
Usage: prefab [OPTIONS] PACKAGE_PATH...
Error: Invalid value for "PACKAGE_PATH": Directory ... is not readable.
ld: error: undefined symbol ...
I looked into build/intermediates
and found that in the 2nd case, the cmake config script was generated incorrectly: instead of add_library(lib::lib SHARED IMPORTED )
it had add_library(lib::lib INTERFACE IMPORTED)
like it it was a header only library, and there was no IMPORTED_LOCATION
set in the file.
What am I doing wrong and what should I do to unbreak our build?