大家好,我是考100分的小小码 ,祝大家学习进步,加薪顺利呀。今天说一说印象笔记目录架构_android基础架构建设,希望您对编程的造诣更进一步.
-
64位架构升级的背景
为更好地提升APP性能体验,降低APP功耗影响,小米应用商店与OPPO应用商店、vivo应用商店共同推进国内安卓生态对64位架构的升级支持。行业适配节奏如下:
- 2021年12月底:现有和新发布的应用/游戏,需上传包含64位包体的APK包(支持双包在架,和64位兼容32位的两个形式,不再接收仅支持32位的APK包)
- 2022年8月底:硬件支持64位的系统,将仅接收含64位版本的APK包
- 2023年底:硬件将仅支持64位APK,32位应用无法在终端上运行
-
64位架构升级前期准备
64 位 CPU 能够为您的用户提供更快、更丰富的体验。添加 64 位的应用版本不仅可以提升性能、为未来创新创造条件,还能针对仅支持 64 位架构的设备做好准备。
-
1、评估您的应用
如果您的应用仅使用以 Java 编程语言或 Kotlin 编写的代码(包括所有库或 SDK),那么就表示该应用已经能支持 64 位设备。如果您的应用使用了任何原生代码,或者您不确定应用是否使用了这类代码,那么您需要评估应用并采取措施。
-
2、查看你的应用是否使用了原生代码?
首先需要检查您的应用是否使用了任何原生代码。 如果您的应用符合以下情况,便是使用了原生代码:
-
使用了任何 C/C++(原生)代码。
-
与任何第三方原生库关联。
-
通过使用原生库的第三方应用构建程序构建而成。
-
3、应用是否包含 64 位库?
若要确定应用是否包含 64 位库,最简单的方法就是检查 APK 文件的结构。在构建时,APK 会与应用所需的所有原生库打包在一起。原生库会根据 ABI 存储在不同的文件夹中。您的应用不一定要支持所有 64 位架构,但对于支持的每种原生 32 位架构,应用都必须包含相应的 64 位架构。
对于 ARM 架构,32 位库位于 armeabi-v7a 中。 对应的 64 位库则位于 arm64-v8a 中。
对于 x86 架构,32 位库位于 x86 中,64 位库则位于 x86_64 中。
首先要确保这两个文件夹中都有原生库。总结如下:
平台 | 32 位库文件夹 | 64 位库文件夹 |
---|---|---|
ARM | lib/armeabi-v7a | lib/arm64-v8a |
x86 | lib/x86 | lib/x86_64 |
请注意,每个文件夹中的一套库可能完全相同,也可能不完全相同,这取决于应用的具体情况。您应达到的目标是确保您的应用能够在仅支持 64 位架构的环境中正常运行。
通常情况下,同时针对 32 位和 64 位架构构建的 APK 或软件包会具有这两种 ABI 的文件夹,每个文件夹中都有一套相应的原生库。如果您的应用不支持 64 位架构,那么您很可能会看到 32 位 ABI 文件夹,但没有 64 位文件夹。
-
4、查看你的应用中的原生库
参考文档:developer.android.com/distribute/…
-
使用64位架构构建APK
通过查看apk中的原生库,我们需要一一找到各个原生库的64位版本,并编译打包到apk中 以我们的工程为例:
如果上图所示,apk中引用了十几个原生库,我们需要找到各个来源并重新打包apk。 原生库的so来源大致可以分几类:
- 引用第三方SDK的aar里面的so
- 引用第三方SDK,复制so文件到jnilib目录
- 本地工程的C++源码,编译成so引入工程中
接下来我们挨个分析场景:
-
1、第三方SDK中aar的so
如上图所示,小米支付的aar中,只有armeabi-v7a的so,没有arm64-v8a的so。 因为我们需要升级小米支付,一般情况下,最新版的SDK,都会提供64位的so。 如下图所示:
-
2、直接复制第三方SDK的so到工程目录
如上图所示,libetconverter.so 就是第三方SDK的一个原生库。 我们能做的就是找到这个第三个SDK的提供者,并找到不同平台的so,如armeabi-v7a,arm64-v8a,x86,x86_64。 然后将so放到对应的文件夹目录,重新打包即可。
由于工程历史较久远,相关SDK可能已停止维护,因此这一项可能会耗费你很多精力去查找。
-
3、本地工程的C++源码编译so
如上图所示,工程中有部分功能,为了更快的效率或者从PC、ios等共享的源码,我们需要编译相关C++文件,生成so。
-
3.1 使用ndk-build编译so
使用ndk-build 编译文档,可以参考:
Android Studio 简单生成so文件并调用
如何编译可执行程序
编译流程,简单概况如下:
(1)创建.c源文件,编写C代码。
(2)编写两个android.mk和application.mk文件:文件官方说明点 Application.mk
android.mk示例
Application.mk 示例,其中APP_STL := stlport_static 由于ndk版本升级,改为了APP_STL := c++_static
(3)Android studio下载ndk,并配置环境变量
(4)打开命令行,cd到项目工程的jni目录,输入ndk-build 即可编译,
编译后生成的文件目录:
复制各平台的so,到工程的对应目录即可。
-
3.2 使用CMake编译so
使用CMake的方式,可以参考如下文档
developer.android.com/studio/proj…
-
使用gradle 64 位库构建应用
使用 Android Studio 或 Gradle 进行构建
大多数 Android Studio 项目都使用 Gradle 作为底层构建系统,因此本部分适用于使用这两种工具进行构建的情况。针对原生代码进行构建很简单,只需将 arm64-v8a 和/或 x86_64(视您要支持的架构而定)添加到应用的“build.gradle”文件中的 ndk.abiFilters 设置中即可:
// Your app's build.gradle
apply plugin: 'com.android.app'
android {
compileSdkVersion 27
defaultConfig {
appId "com.google.example.64bit"
minSdkVersion 15
targetSdkVersion 28
versionCode 1
versionName "1.0"
ndk.abiFilters 'armeabi-v7a','arm64-v8a','x86','x86_64'
// ...
由于so文件不是很大,因此32位和64位的so,我们都打包到同一个apk了。 如果so文件过大,可以考虑,32位和64位so打包两个apk安装包,降低体积 小米、oppo等商店支持32位和64位分开上传安装包,并且在应用商店搜索,也只会跟进手机硬件型号,只搜到一apk。
上传apk参考文档:dev.mi.com/distribute/…
-
在64位硬件上测试应用
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/13355.html