Android NDK and CPU architectures

Android NDK and CPU architectures

本文关键字:architectures CPU and NDK Android      更新时间:2023-10-16

我刚刚开始使用 Android NDK,我看到大多数使用 Android NDK 的开源应用程序都针对多个 CPU 架构编译了C++库。这真的有必要吗?如果是这样,这是否意味着生成的apk将包含多次编译的C++库,因此apk会变得非常大?如果有人尝试在没有编译库的 CPU 架构上运行该应用程序,会发生什么?另外,有关如何为Android构建C++库的好教程将不胜感激。

没有必要将它们全部放置,但如果您不这样做,则排除了此体系结构的设备。apk 将包含所有二进制文件,安装程序将在安装时选择正确的二进制文件,因此不会发生运行针对另一个应用程序的二进制文件的情况(除非我们正在考虑越狱设备)。

NDK 软件包包含构建 Android 原生代码所需的所有文档(在文档文件夹中)。

您可以为不同的处理器架构构建单独的APK文件,Play商店完全支持此功能。您的客户不会下载一个"胖"APK,而是只会得到他们真正需要的东西,请参阅Android为不同的处理器架构构建单独的Apk

要使用 ant 执行此类构建,可以使用以下脚本:

<target name="-pre-build">
    <exec executable="${ndk.dir}/ndk-build" failonerror="true"/>
    <arg value="APP_ABI=${abi}"/>
</target>

并使用批处理文件运行循环(我使用一个简单的sed脚本;sed 在 %NDK_ROOT%prebuiltwindowsbin 和所有其他平台上可用):

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" .

请注意,从技术上讲,没有理由更改 armeabimips 变体的版本代码,但将 armeabi 保留 可能很重要。