APK 中主要 ABI 类型的 so 文件: lib/abi>/lib.so 如果没有找到,则会去查找 APK 文件中辅助 ABI 类型的 so 文件: lib/abi...时加载到内存中。如果没有查找到匹配的 so 文件,不会中断安装过程,但在运行时会崩溃。 关于加载 so 文件的过程,我们在 《说说 so 库从加载到卸载的全过程》这篇文章里已经讨论过了。...ndk. abiFilters 配置可以过滤出需要打包到 APK 中的 so 文件,例如以下配置将会把 armeabi-v7e 和 arm64-v8a 两种 ABI 类型的 so 文件打包到 APK...其实,应用市场是支持单独分发 32 位和 64 位 APK 包的能力的,我们可以使用 splits 配置。例如以下配置会将每种 ABI 类型单独打包。...市面上目前有类似的工具吗,可以分享给我。或者你可以说说那些最让你头疼的整改问题(给我提 Feature!)
但ARM64在的手机上真的有用吗?我只能说,目前确实没啥用,但今后或许有。...为什么你需要重点关注.so文件 如果项目中使用到了NDK,它将会生成.so文件,因此显然你已经在关注它了。...Android应用支持的ABI取决于APK中位于lib/ABI目录中的.so文件,其中ABI可能是上面说过的七种ABI中的一种。...文件会自动包含到引用AAR压缩包的APK中) 最终APK文件中的lib/ABI目录中 通过PackageManager安装后,在小于Android 5.0的系统中,.so文件位于app的nativeLibraryPath...以减少APK包大小为由是一个错误的借口,因为你也可以选择在应用市场上传指定ABI版本的APK,生成不同ABI版本的APK可以在build.gradle中如下配置: android
指令集,所以如果损失一些应用的性能是可以接受的,同时不希望保留库的两份拷贝,可以移除armeabi-v7a目录和其下的库文件,只保留armeabi目录;比如Apk使用第三方的so只有armeabi这一种...,可以选择删掉x86库目录,x86下配置的armeabi目录的so库一样可以正常加载使用。...比如Apk使用第三方的so只有32位ABI的so,可以考虑去掉Apk中lib目录下的64位ABI子目录,保证Apk安装后正常使用。 5....原方案使用的是共享库,这不一定都支持所有的机型,改用静态库gnustl_static问题解决。 对应的在Android Studio中需要将共享库改用静态库gnustl_static。...- 使用GNU libstdc++ 作为静态库 gnustl_shared - 使用GNU libstdc++ 作为共享库 上述例子只是一个简单的例子,可能在so编译生成时,由于没有考虑共享库的机型匹配等原因导致
在这里记录一下这个错误,防止自己以后再犯 ^ _ ^ 优化ApK大小之ABI Filters 和 APK split 想要打出的 apk 包含多个架构的 so库 需要下面的配置: android {...... // 其它配置 defaultConfig { ... // 默认配置 ndk { //选择要添加的对应cpu类型的.so库。...apk 包,可以使用 ABI 拆分,需要下面的配置: android { ... // 其它配置 splits { abi { reset()//...重置 ABI 列表为只包含一个空字符串(与 include 一起使用可以表示要使用哪一个 ABI,而不是要 exclude 哪些 ABI) enable true // 设为true...总结 如果两种方式分开配置都可以运行; 两种方式一起配置在不报错的情况下(ABI拆分注调include),ABI 拆分不生效;
指令集,所以如果损失一些应用的性能是可以接受的,同时不希望保留库的两份拷贝,可以移除armeabi-v7a目录和其下的库文件,只保留armeabi目录;比如Apk使用第三方的so只有armeabi这一种...,可以选择删掉x86库目录,x86下配置的armeabi目录的so库一样可以正常加载使用。...比如Apk使用第三方的so只有32位ABI的so,可以考虑去掉Apk中lib目录下的64位ABI子目录,保证Apk安装后正常使用。 5....原方案使用的是共享库,这不一定都支持所有的机型,改用静态库gnustl_static问题解决。 对应的在Android Studio中需要将共享库改用静态库gnustl_static。... - 使用GNU libstdc++ 作为静态库 gnustl_shared - 使用GNU libstdc++ 作为共享库 上述例子只是一个简单的例子,可能在so编译生成时,由于没有考虑共享库的机型匹配等原因导致
但是应用内使用了任何原生(Native)的支持(so 库),就需要针对这些 so 文件,针对不同的 CPU 架构提供不同的版本的 so 支持。...需要注意的是,有些时候,在我们自身的代码中,确实没有用到原生的支持,但是在 App 中使用的一些第三方库中却包含了。...-v8a" universalApk true } } ndk{abiFilters:}过滤 这个指令可以配置只打包你配置的so库,没有配置的就不打包,很灵活...//过滤x86的so库 ndk { abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a' } 这样配置会将armeabi,armeabi-v71...,arm64-v8a这3个包下的so库都打包到一个apk,而不像splits会每一个包打一个apk.
相信很多人对于NDK 开发都是懵逼的,比如都知道把加密的逻辑以及密钥放在so文件中,但是你知道怎么生成so文件吗?你知道开发jni吗?你熟悉jni语法吗?...怎么配置android studio 中的NDK环境?此时你一定很懵逼,我也是从这过来的,我不能帮助你开发Ndk,但是我可以让你不懵逼。 有需要的可以去百度,这里讲一下android studio。...因为 C语言 不跨平台,在Windows系统下使用NDK编译在 Linux 下能执行的函数库——SO文件,全称Shared Objects,其实质就是一堆c、c++的头文件和实现文件打包成一个库。...64 以本人ODM经验来说,你应该尽可能的提供专为每个ABI优化过的.so文件,(尽量不要混合着使用)。...ps: Native Libs Monitor 这个应用可以帮助我们理解手机上安装的APK用到了哪些.so文件,以及.so文件来源于哪些函数库或者框架。 二、JNI ?
官方文档分别从以下几个方面介绍了 NDK NDK 的基础概念 如何编译 NDK 项目 ABI 是什么以及不同 CPU 指令集支持哪些 ABI 如何使用您自己及其他预建的库 本节将会对文档进行总结和补充。...比如指定使用c++11还是c++14编译,会引用哪些共享库,并描述关系等,还会指定编译的 abi。只有有了这些 NDK 中的编译工具才能准确的编译 c/c++ 代码。...CMake 编译自己及其他预建的库。...同时在这推荐一个中文翻译的简易的CMake手册 2.2 CMake 使用自己及其他预建的库 当你需要引入已有的静态库/动态库(FFMpeg)或者自己编译核心部分并提供出去时就需要考虑如何在 CMake...中使用自己及其他预建的库。
其实这是一个常识问题,针对不同的架构我们肯定要提供不同的动态链接库,所以,在实际开发过程中,我们并不是将这7种so库都集成到我们的项目中去,我们会根据实际情况做一个取舍。...如果项目用到了NDK,Android apk文件将会到位于lib/ABI文件下读取相关.so文件。Android包管理器在安装APK文件时,会自动选择对应系统环境下预编译好的.so文件。...ABI和CPU的关系 在使用so库应该注意:很多设备都支持多于一种的ABI,当一个应用安装在设备上,只有该设备支持的CPU架构对应的.so文件会被安装。...但你不应该从你的应用程序中读取它,因为Android包管理器安装APK时,会自动选择APK包中为对应系统ABI预编译好的.so文件。...Android Studio工程放在jniLibs/ABI目录中(当然也可以通过在build.gradle文件中的配置jniLibs.srcDir脚本) Eclipse工程放在libs/ABI目录中 其他说明
ABI 可以非常精确地定义应用的机器代码在运行时如何与系统交互。 您必须为应用要使用的每个 CPU 架构指定 ABI。 典型的 ABI 包含以下信息: 机器代码应使用的 CPU 指令集。...运行时内存存储和加载的字节顺序。 可执行二进制文件(例如程序和共享库)的格式,以及它们支持的内容类型。 用于解析内容与系统之间数据的各种约定。...这些约定包括对齐限制,以及系统如何使用堆栈和在调用函数时注册。 运行时可用于机器代码的函数符号列表 - 通常来自非常具体的库集。..."armeabi-v7a","arm64-v8a","x86_64" } } 如果你的工程包含 NDK 开发,一般为了压缩 APK 体积都会在 build.gradle 做如上设置以声明 APK...支持的 ABI 架构,其它没有被声明的 ABI 所对应的 .so 等库就不会被打包进 APK 中。
典型的ABI包含以下信息: 1、机器代码应使用的CPU指令集 2、运行时内存存储和加载的字节顺序 3、可执行二进制文件(例如程序和共享库)的格式,以及它们支持的内容类型 4、用于解析内容与系统之间的数据的各种约定...由上述定义可以判断: ABI定义了规则,而具体的实现是由编译器、CPU、操作系统共同来完成的。...我们在Window/Linux平台使用Android NDK交叉编译工具来编译出Android平台的库也是这个道理。 (一)、.so文件与ABI 如果你的项目中使用了NDK,它就生成了.so文件。...即你应该为每个ABI目录提供对应的so文件。 2、NDK兼容性 使用NDK时,一般人会倾向于使用最新的编译凭条,但实际上这样做是有问题的。因为NDK平台是不向后兼容的,而是向前兼容的。...得到引用支持的架构索引之后就可以获取so释放到设备中的目录了。
大家好,又见面了,我是你们的朋友全栈君。 背景 Android 系统本质是一个经过改造的 Linux 系统,so库是Linux系统上使用的共享库(类似windows上的dll)。...其实这个可以不设置,这样编译时,就会将项目里所有依赖资源包里的so库都打到最终的apk里。...如果那些so库是我们自己编译出来的,那可以直接在工程中删除对应so文件,但是如果是第三方提供的,就不好删除了,所以就需要使用abiFilters来过滤了。...、armeabi-v7a、arm64-v8a的兼容性问题 看上上面的描述,以为新增一个so库文件可以随便根据需要适配的目录放,就错了。...如果你有库文件在armeabi里有,但是armeabi-v7a目录下没有,那么运行在V7a的架构时,就会出现找不到so库文件的情况。
所以需要让Android去支持那些已有的库. java源码反编译一下很容易拿到的, 当然可以加固apk, 会好一点....而编译生成.so之后, c的源码就很难看到了. ---- ndk环境配置 有个比较头痛的事情叫做配环境 下载ndk ? mac下下载ndk ? win下下载ndk 配置ndk路径 ?...打开PowerShell测试一下 终于可以开始使用NDK了, 或者你可以管它叫JNI ---- ndk上手 在包目录下创建HellJNI类, 并写入必要代码 ? mac下 ?...("HelloC");中的名称一致; Win下需要再加一个空的util.c文件进行编译, 否则会报错, 不信可以试试(手动滑稽), mac/linux下无需....一览 你可以在这个项目中使用这个由c实现的加法函数了, 但是我们有更酷的事情要做, 那就是在另外的项目中用这个函数. ---- 其他项目使用.so 这件事其实没有很难, 基本靠两步.
五.如何查看当前设备支持那些版本的so库? 我们可以通过Build.SUPPORTED_ABIS得到根据偏好排序的设备支持的ABI列表。...但你不应该从你的应用程序中读取它,因为Android包管理器安装APK时,如果在对应的lib/ABI目录中存在.so文件的话,会自动选择APK包中为对应系统ABI预编译好的.so文件。...Android Studio工程放在jniLibs/ABI目录中(当然也可以通过在build.gradle文件中的设置jniLibs.srcDir属性自己指定) Eclipse工程放在libs/ABI...目录中(这也是ndk-build命令默认生成.so文件的目录) AAR压缩包中位于jni/ABI目录中(.so文件会自动包含到引用AAR压缩包的APK中) 最终APK文件中的lib/ABI目录中...即达到了减少APK大小的目的,又能达到适配ARMv7等架构以便使用其架构的一些新特性的目的。 十一.so库开发过程中的一些错误汇总!
原来的 Experimental Gradle Plugin 构建方式仍然可用,官方建议迁移。 构建生成的 .so 文件将直接被 Gradle 打包在 apk 中。...执行构建时,Gradle 将调用 ndk-build,并将生成的 .so 文件打包进 apk 当中。...在不指定额外参数时,Gradle 将采用默认配置完成 Native 库构建,例如 Gradle 将告知 ndk-build 构建所有 ABI 的 .so 库 (即便已经在 Application.mk...3. abiFilters 字段 该字段用于设定要构建和打包进 apk 的 ABI。...这里的库名称参数与在 Android.mk 添加的 LOCAL_LDLIBS 参数一致,可用的预构建库与 Android 版本有关(详见参考资料 5)。 6.
个人博客地址 http://dandanlove.com/ 记得前年开始自己在项目中使用第三方so库的时候就接触NDK编程开发了,只不过哪个时候自己是输出了"Hello Wrold~!"。...它提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。...它集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。...它可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。 ARM 早起Android只支持ARMv5的CPU架构,而发展到现在,支持一下7种架构: ?...兼容所有CPU架构类型是在性能上比较好,但是同时它也造成了apk体积的剧增(PS:我们之前的项目因为接入so库后导致apk体积剧增,最后只支持armeabi一种类型了)。
其余的东西暂时对我们来说并没有什么太大的意义,现在我们的目的是通过这个源码通过 NDK 来编译成在 Android 中可以使用的动态链接库 so 文件。...---- 2、下载 NDK :r24 可以在如下网站中下载 NDK 的工具包,不过在 macOS 中更推荐用 Android SDK 管理器来下载,如下在 AndroidStudio 中选择 NDK 点击...其实在 Android 开发中,NDK 的作用也是如此,核心价值也是把其他语言编译成Android 平台可以访问的 so 而已。所以也不要觉得 NDK 有多么神秘,就是一个工具集而已。...项目结构 在 cpp 文件夹中处理 c++ 相关内容,jniLibs 文件夹放入文件编译的 so 库: ---- 3....NDK 将 C 和 C++ 代码编译到原生库中,然后使用 Android Studio 的集成构建系统 Gradle 将原生库打包到 APK 中。
文章目录 一、Visual Studio 安装 " 使用 C++ 的移动开发 " 二、Visual Studio 中创建 " 动态共享库(Android) " 类型应用 三、设置编译选项 四、生成 ARM...架构 SO 动态库 五、生成 x86 架构 SO 动态库 一、Visual Studio 安装 " 使用 C++ 的移动开发 " ---- 使用 Visual Studio 2019 开发环境 , 参考...Installer 中 , 安装 " 使用 C++ 的移动开发 " ; 等待安装完成 ; 二、Visual Studio 中创建 " 动态共享库(Android) " 类型应用 ---- 在 Visual...架构 SO 动态库 ---- 生成动态库 : 右键点击 " 解决方案资源管理器 " , 在弹出的菜单中 , 选择 " 仅用于项目(J) -> 仅生成 VS_NDK_Demo(B) " 选项 ; 生成动态库结果...架构的动态库 , 可以选择 x86 架构 , 再次编译 ; 可选择的架构有 ARM , ARM64 , x86 , x64 ;
系统的PMS服务(PackageManagerService)就会通过它的scanPackageDirtyLI方法进行遍历lib文件夹下的目录,目录内存放着so库,如下图所示:图片库中可能包含了“arm64...那么,划重点就是,64位的适配其实就是apk中lib文件夹下的so库的适配,java的代码是同一份,无论在64位还是32位上均可运行,而so库则不同,专门适配的版本,无论是性能和效率都会得到更高的发挥。...这里要注意一点,一旦运行了64位的进程,那么此时去加载32位的so库,是无法实现的,32位亦然。6.片多多适配6.1 包的构建方案一、构建一个支持所有abi类型的apk。...实现方案:在build.gradle里的ndk中加上相应的abi类型即可方案二、为每个abi单独构建apk优点:包体积几乎保持不变缺点:需要根据不同的情况,下发合适的apk到对应的用户设备上进行安装方案...需要查找64位与32位的so库的区别的,快速方式可以使用以下工具:EasyPrivacy:https://github.com/pengxurui/EasyPrivacy。使用日志分析即可:图片
在ANE中如果SDK调用了so库,则需要把so库放到ANE下Android-ARM/lib/armeabi (调试模式)或者 armeabi-v7a(发行模式)下。...armeabi与armeabi-v7a表示支持不同的CPU类型armeabi是指的该so库用于ARM的通用CPU,而v7a的CPU支持硬件浮点运算。...我项目中使用armeabi还是armeabi-v7a对于AIR项目来说性能问题是最大的瓶颈,能优化一点就一点,所以如果接平台方SDK或者写ANE的时候使用到SO库,个人推荐全部放到armeabi-v7a...现在还有x86的了,其实armeabi 、armeabi-v7a 和x86是编译 NDK 库时,可以使用三种支持的应用二进制接口(ABI):‘armeabi’ – 默认选项,将创建以基于 ARM* v5TE...具有这种目标的浮点运算使用软件浮点运算。 使用此 ABI 创建的二进制代码将可以在所有 ARM* 设备上运行。
领取专属 10元无门槛券
手把手带您无忧上云