Android 64 位架构适配指南手把手教学_64位框架-程序员宅基地

技术标签: 架构  java  android  # app开发问题  

背景

2019年8月1号,在 Google Play上发布应用必须支持64位架构,紧接着 小米应用商店、OPPO 应用商店、vivo 应用商店、腾讯应用宝和百度手机助手等五大应用商店宣布,为更好提升 App 性能体验并降低功耗,五方将共同推进国内安卓生态对 64 位架构的升级支持。
在这里插入图片描述
具体的时间表:

  • 2021年12月底,现有和新发布的应用、游戏,需要上传包含 64 位包体的 APK 包。也就是说所有上传的应用都应该包含 64 位代码的版本,不再接受仅有 32 位版本的应用上传。

  • 2022年8月底,对于支持 64 位的硬件系统,将只接收 64 位版本的 APK 包。也就是如果到时用户手中的硬件设备支持 64 位系统的话,那么将只运行 64 位版本的应用。

  • 2023年底,硬件将仅支持 64 位APK,32 位应用无法在终端上运行。

现状

Platform 32-bit libraries folder 64-bit libraries folder
ARM lib/armeabi-v7a lib/arm64-v8a
x86 lib/x86 lib/x86_64

目前手机 cpu 架构是 armeabi 、 armeabi-v7a 、 arm64-v8a 、 x86 、 x86_64 ,但是目前手机基本上都是 arm 架构,x86 架构的手机基本上没有,基本上是平板,可以忽略。了解更多 Android ABI 知识

armeabi是十年前的手机CPU架构,基本上没有了。

armeabi-v7a的CPU架构是32位。

arm64-v8a的CPU架构是64位。

所以目前需要考虑的 armeabi-v7aarm64-v8a 这两款就可以了, 之前开发者在打包的时候,为了包大小的考虑,常常指定打包的时候,只指定 armeabi-v7a 架构的 so 包,这样包大小可以小很多,尤其是 so 库多的应用。

ndk {
    
	abiFilters "armeabi-v7a"
}

在项目的 gradle 中配置 ndk 就可以,64 位的手机会自适应 32 位的应用,这样可以完美的兼容市面上99.9%的手机,这样包大小也会小很多 但是这样 64 位处理器的性能就无法完美的发挥出来,那么应用 64 位有哪些好处呢?

由于一些软件功能越来越多,安装包的体积、运行时需要消耗的运行内存越来越大,32 位应用的局限性越来越突出。而 64 位系统,可以在单个线程里使用超过 4 GB 的运行内存,当处理一些大型软件、或者进行高像素图像、视频处理的时候,就更能够发挥手机硬件的优势。比如一些大型游戏、网络视频直播、高画质影音播放等等。而且 64 位系统相比 32 位系统,会带来至少 20% 以上效率的提升。

打入 64 位的 so 包必然导致包大小增大很多,导致用户下载体验差,目前 Google paly 支持上传 32 位和 64 位的两个 apk,这样用户可以根据手机 cpu 架构动态的下载那个 apk

国内市场暂不支持,但是这个是趋势,之后必然要上这个功能的,我们在开发的时候,暂时还需要支持armeabi-v7aarm64-v8a两个架构,包大小也会增大很多。

App 需要适配吗

App 需要适配吗?一个原则:如果你的 app 用了 C 库,native 代码,so 文件,就需要去适配。不光是你的代码,而且关注你引用的第三方库;对于 java 或 kotlin 代码则不需要关注。

查看 apk 的架构

点击打出来的 apk 包,就会出现在目前的 apk 架构
在这里插入图片描述
查看 Android 手机的 CPU 架构
Win + R 然后输入 cmd
执行:

adb shell  
cat  /proc/cpuinfo

在这里插入图片描述
CPU architecture:7 表示arm-v7,8表示arm-v8

处理方案

小米应用商店支持 64 位架构适配指南

vivo 应用商店 64 位架构适配指南

oppo 应用商店 64 位架构适配指南

若要确定应用是否包含 64 位库,最简单的方法就是检查 APK 文件的结构。在构建时,APK 会与应用所需的所有原生库打包在一起。原生库会根据 ABI 存储在不同的文件夹中。您的应用不一定要支持所有 64 位架构,但对于支持的每种原生 32 位架构,应用都必须包含相应的 64 位架构。

对于 ARM 架构, 32 位库位于 armeabi-v7a 中。对应的 64 位库则位于 arm64-v8a 中。
对于 x86 架构, 32 位库位于 x86 中,64 位库则位于 x86_64 中。

着手修改

我们根据小米应用商店支持 64 位架构适配指南修改我们的应用:

1、将 arm64-v8a 和/或 x86_64(视您要支持的架构而定)添加到应用的build.gradle文件中即可,我这里支持 armeabi-v7aarm64-v8a

android {
    
    defaultConfig {
    
        ......
        ndk {
    
            abiFilters "armeabi-v7a", "arm64-v8a"
        }
    }
}

2、修改 jniLibs 里的 so 文件

因为上边我支持了 armeabi-v7aarm64-v8a 两种架构,所以在 jniLibs 中新建 armeabi-v7aarm64-v8a两个文件夹,在第三方库的官网找到对应架构的 .so 文件放进去。
在这里插入图片描述
例如,因为我之前的项目只支持了 armeabi 架构,所以之前只有一个 armeabi 文件夹,我可以打开这个文件夹看一下用到的哪些第三方的库,到第三方官网找到对应架构的文件。最后把 armeabi 文件夹删了就行了。

例如 libbd 开头的这四个,是百度语音需要的 so 包
在这里插入图片描述
所以我们去百度语音官网,下载离线语音SDK,把 armeabi-v7aarm64-v8a 这两个文件夹里的内容放到我们项目里即可。
在这里插入图片描述
其他的 .so库都这样操作

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u010356768/article/details/121741867

智能推荐

使用nginx解决浏览器跨域问题_nginx不停的xhr-程序员宅基地

文章浏览阅读1k次。通过使用ajax方法跨域请求是浏览器所不允许的,浏览器出于安全考虑是禁止的。警告信息如下:不过jQuery对跨域问题也有解决方案,使用jsonp的方式解决,方法如下:$.ajax({ async:false, url: 'http://www.mysite.com/demo.do', // 跨域URL ty..._nginx不停的xhr

在 Oracle 中配置 extproc 以访问 ST_Geometry-程序员宅基地

文章浏览阅读2k次。关于在 Oracle 中配置 extproc 以访问 ST_Geometry,也就是我们所说的 使用空间SQL 的方法,官方文档链接如下。http://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/gdbs-in-oracle/configure-oracle-extproc.htm其实简单总结一下,主要就分为以下几个步骤。..._extproc

Linux C++ gbk转为utf-8_linux c++ gbk->utf8-程序员宅基地

文章浏览阅读1.5w次。linux下没有上面的两个函数,需要使用函数 mbstowcs和wcstombsmbstowcs将多字节编码转换为宽字节编码wcstombs将宽字节编码转换为多字节编码这两个函数,转换过程中受到系统编码类型的影响,需要通过设置来设定转换前和转换后的编码类型。通过函数setlocale进行系统编码的设置。linux下输入命名locale -a查看系统支持的编码_linux c++ gbk->utf8

IMP-00009: 导出文件异常结束-程序员宅基地

文章浏览阅读750次。今天准备从生产库向测试库进行数据导入,结果在imp导入的时候遇到“ IMP-00009:导出文件异常结束” 错误,google一下,发现可能有如下原因导致imp的数据太大,没有写buffer和commit两个数据库字符集不同从低版本exp的dmp文件,向高版本imp导出的dmp文件出错传输dmp文件时,文件损坏解决办法:imp时指定..._imp-00009导出文件异常结束

python程序员需要深入掌握的技能_Python用数据说明程序员需要掌握的技能-程序员宅基地

文章浏览阅读143次。当下是一个大数据的时代,各个行业都离不开数据的支持。因此,网络爬虫就应运而生。网络爬虫当下最为火热的是Python,Python开发爬虫相对简单,而且功能库相当完善,力压众多开发语言。本次教程我们爬取前程无忧的招聘信息来分析Python程序员需要掌握那些编程技术。首先在谷歌浏览器打开前程无忧的首页,按F12打开浏览器的开发者工具。浏览器开发者工具是用于捕捉网站的请求信息,通过分析请求信息可以了解请..._初级python程序员能力要求

Spring @Service生成bean名称的规则(当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致)_@service beanname-程序员宅基地

文章浏览阅读7.6k次,点赞2次,收藏6次。@Service标注的bean,类名:ABDemoService查看源码后发现,原来是经过一个特殊处理:当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致public class AnnotationBeanNameGenerator implements BeanNameGenerator { private static final String C..._@service beanname

随便推点

二叉树的各种创建方法_二叉树的建立-程序员宅基地

文章浏览阅读6.9w次,点赞73次,收藏463次。1.前序创建#include<stdio.h>#include<string.h>#include<stdlib.h>#include<malloc.h>#include<iostream>#include<stack>#include<queue>using namespace std;typed_二叉树的建立

解决asp.net导出excel时中文文件名乱码_asp.net utf8 导出中文字符乱码-程序员宅基地

文章浏览阅读7.1k次。在Asp.net上使用Excel导出功能,如果文件名出现中文,便会以乱码视之。 解决方法: fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);_asp.net utf8 导出中文字符乱码

笔记-编译原理-实验一-词法分析器设计_对pl/0作以下修改扩充。增加单词-程序员宅基地

文章浏览阅读2.1k次,点赞4次,收藏23次。第一次实验 词法分析实验报告设计思想词法分析的主要任务是根据文法的词汇表以及对应约定的编码进行一定的识别,找出文件中所有的合法的单词,并给出一定的信息作为最后的结果,用于后续语法分析程序的使用;本实验针对 PL/0 语言 的文法、词汇表编写一个词法分析程序,对于每个单词根据词汇表输出: (单词种类, 单词的值) 二元对。词汇表:种别编码单词符号助记符0beginb..._对pl/0作以下修改扩充。增加单词

android adb shell 权限,android adb shell权限被拒绝-程序员宅基地

文章浏览阅读773次。我在使用adb.exe时遇到了麻烦.我想使用与bash相同的adb.exe shell提示符,所以我决定更改默认的bash二进制文件(当然二进制文件是交叉编译的,一切都很完美)更改bash二进制文件遵循以下顺序> adb remount> adb push bash / system / bin /> adb shell> cd / system / bin> chm..._adb shell mv 权限

投影仪-相机标定_相机-投影仪标定-程序员宅基地

文章浏览阅读6.8k次,点赞12次,收藏125次。1. 单目相机标定引言相机标定已经研究多年,标定的算法可以分为基于摄影测量的标定和自标定。其中,应用最为广泛的还是张正友标定法。这是一种简单灵活、高鲁棒性、低成本的相机标定算法。仅需要一台相机和一块平面标定板构建相机标定系统,在标定过程中,相机拍摄多个角度下(至少两个角度,推荐10~20个角度)的标定板图像(相机和标定板都可以移动),即可对相机的内外参数进行标定。下面介绍张氏标定法(以下也这么称呼)的原理。原理相机模型和单应矩阵相机标定,就是对相机的内外参数进行计算的过程,从而得到物体到图像的投影_相机-投影仪标定

Wayland架构、渲染、硬件支持-程序员宅基地

文章浏览阅读2.2k次。文章目录Wayland 架构Wayland 渲染Wayland的 硬件支持简 述: 翻译一篇关于和 wayland 有关的技术文章, 其英文标题为Wayland Architecture .Wayland 架构若是想要更好的理解 Wayland 架构及其与 X (X11 or X Window System) 结构;一种很好的方法是将事件从输入设备就开始跟踪, 查看期间所有的屏幕上出现的变化。这就是我们现在对 X 的理解。 内核是从一个输入设备中获取一个事件,并通过 evdev 输入_wayland

推荐文章

热门文章

相关标签