Как мне собрать несколько платформ Android (и, возможно, ABI), используя vs-android?
Я портирую нативный движок C++ на Android NDK. Попробовав некоторые среды и инструменты, я обнаружил, что последняя версия vs-android (0.9) наиболее удобна. У меня есть несколько проблем с этим (некоторые мне, возможно, придется задать в будущих вопросах), но сейчас - вот одна:
Собственный движок компилируется в собственную разделяемую библиотеку. Мы хотим, чтобы движок был совместимым с Android-8 API (Android 2.2).
У нас есть несколько приложений для тестирования, которые мы используем внутри компании. Я также портировал один из них на Android, но, поскольку я использую нативную активность (и к тому же нативный клей приложения), для нее требуется android-9 (2.3).
У меня есть несколько проектов модулей - статических библиотек - которые используются как в движке, так и в приложении для тестирования. Они нужны мне для компиляции Android-8 для двигателя и Android-9 для тестера. В дополнение ко всему, мы хотим поддерживать как arm5, так и arm7.
С помощью скриптов сборки ndk я могу сделать это довольно легко. В MS-Build (который использует vs-android), кажется, требуется экспоненциальное количество конфигураций (не забудьте о debug / profile / release).
Есть ли способ сделать это без создания всех этих конфигураций? Например, когда я собираю свой движок, он скомпилирует модули для android-8 и для arm5 и arm7, а когда я соберу тестер, он скомпилирует модули для android-9 и для arm5 и arm7 без создание 4 практически одинаковых конфигураций для каждого проекта и для отладки, профиля, выпуска?
Я нашел это, но я не уверен, как использовать это и возможно ли применить технику родительских / дочерних проектов здесь.
(Сказать мне "перестать быть ленивым и просто создавать конфигурации, несмотря на тот факт, что всякий раз, когда вы захотите изменить параметр, вам придется изменять его во всех конфигурациях", это приемлемо в качестве комментария, но, пожалуйста, не в качестве ответа. То же самое касается "использования ndk-build и ручной сборки вашего apk вместо использования vs-android").
Спасибо!
(Кстати, может кто-нибудь добавить тег vs-android?)
РЕДАКТИРОВАТЬ: я придумал частичное решение - только вопрос уровня API. Смотрите мой ответ ниже.
1 ответ
Хорошо, вот частичное решение, которое я нашел (так как никто не придумал другого ответа).
Это касается проблемы уровня API. Это также будет работать для всего, что зависит от решения. Специально для моей проблемы - Для каждого проекта (все статические библиотеки, библиотека общего доступа для движка и библиотека общего доступа для тестера) я добавил в файл проекта следующее:
<Import Condition="Exists('$(SolutionDir)AndroidSolution.props')" Project="$(SolutionDir)AndroidSolution.props" />
Затем каждое решение может определить параметры, необходимые для всех своих проектов, добавив файл с именем "AndroidSolution.props" в ту же папку, что и файл решения. Пример файла реквизита:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<AndroidAPILevel>android-8</AndroidAPILevel>
<!-- <AndroidArch>armv7-a</AndroidArch> -->
</PropertyGroup>
</Project>
Таким образом, уровень API определяется для всех проектов в решении, и они могут изменяться для разных решений.
Что касается нескольких ABI, я добавил следующее в XML:
<AndroidArch>__ANDROID_ARCHITECTURE__</AndroidArch>
<PlatformToolset>__PLATFORM_TOOLSET__</PlatformToolset>
И использовал короткий скрипт (который вызывается несколько раз перед каждым выполнением msbuild), чтобы заменить оба параметра в скрипте сборки