Я только начинаю работать с Android NDK и вижу, что большинство приложений с открытым исходным кодом, использующих Android NDK, имеют свои библиотеки C ++, скомпилированные для нескольких архитектур ЦП. Это действительно необходимо? Если это так, значит ли это, что полученный apk будет содержать библиотеки C ++, скомпилированные много раз, так что apk станет довольно большим? А что будет с приложением, если кто-то попытается запустить его на архитектуре процессора, в которой нет скомпилированной библиотеки? Также будет полезно получить хороший урок о том, как создавать библиотеки C ++ для Android.
Не обязательно помещать их все, но если вы этого не сделаете, вы исключаете устройства этой архитектуры. АПК будет содержать все двоичные файлы, и установщик выберет правильный при установке, поэтому случай запуска бинарного файла, нацеленного на другое приложение, не произойдет (если только мы не рассматриваем устройства, сломанные в тюрьме).
Пакет NDK содержит всю необходимую документацию (в папке docs) для создания собственного кода для Android.
Вы можете создавать отдельные файлы APK для разных архитектур процессоров, и Play Store полностью поддерживает это. Вместо того, чтобы загружать один «толстый» APK, ваши клиенты получат только то, что им действительно нужно, смотрите Android сборка отдельных приложений для разных архитектур процессоров.
Чтобы выполнить такую сборку с муравей, Вы можете использовать следующий скрипт:
<target name="-pre-build">
<exec executable="${ndk.dir}/ndk-build" failonerror="true"/>
<arg value="APP_ABI=${abi}"/>
</target>
и использовать командный файл для запуска цикла (я использую простой sed
сценарий; sed доступен в %NDK_ROOT%\prebuilt\windows\bin\
и на всех других платформах):
sed -i -e "s/versionCode=\"\([0-9]*\).]\"/versionCode=\"\11\"/" AndroidManifest.xml
ant -Dsdk.dir=%SDK_ROOT% -Dndk.dir=%NDK_ROOT% -Dabi=armeabi release
ren %apkfile%.apk %apkfile%_armeabi.apk
sed -i -e "s/versionCode=\"\([0-9]*\).\"/versionCode=\"\12\"/" AndroidManifest.xml
ant -Dsdk.dir=%SDK_ROOT% -Dndk.dir=%NDK_ROOT% -Dabi=mips release
ren %apkfile%.apk %apkfile%_mips.apk
sed -i -e "s/versionCode=\"\([0-9]*\).\"/versionCode=\"\13\"/" AndroidManifest.xml
ant -Dsdk.dir=%SDK_ROOT% -Dndk.dir=%NDK_ROOT% -Dabi=armeabi-v7a release
ren %apkfile%.apk %apkfile%_armeabi-v7a.apk
sed -i -e "s/versionCode=\"\([0-9]*\).\"/versionCode=\"\14\"/" AndroidManifest.xml
ant -Dsdk.dir=%SDK_ROOT% -Dndk.dir=%NDK_ROOT% -Dabi=x86 release
ren %apkfile%.apk %apkfile%_x86.apk
Это предполагает, что android.verisonCode в файле манифеста есть ноль в качестве последней цифры, например android:versionCode="40260"
,
Обратите внимание, что технически нет причин менять versionCode для armeabi а также MIPS варианты, но может быть важно сохранить armeabi < armeabi-v7a < x86.