我的编程空间,编程开发者的网络收藏夹
学习永远不晚

解读apk分包-32位安装包、32位64位兼容包和64位安装包

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

解读apk分包-32位安装包、32位64位兼容包和64位安装包

目录

1、apk为何要分包(32位安装包、32位64位兼容包和64位安装包)?

2、影响apk适配的cpu架构的因素-原生代码(C/C++代码)

3、如何判断apk支持的cpu架构?

        3.1 查看apk支持的cpu架构

        3.2 不同cpu架构之间的so库的兼容关系

4、针对应用平台适配64位政策-让apk适配 64 位架构

5、Android Studio如何构建支持不同架构的apk

6、引用:


1、apk为何要分包(32位安装包、32位64位兼容包和64位安装包)?

        安卓设备的核心是cpu(中央处理器),cpu常用架构有ARM架构和x86架构,cpu又分为32位和64位,因此不同架构也分为32位和64位。

        apk为适配市面上不同安卓设备,apk运行在Android系统调用系统驱动时需要兼容不同的CPU架构,apk的应对策略是分包。

        大部分手机使用的是ARM架构,ARM架构分为32位架构、兼容32位的64位架构,以及即将推出的只支持64位的架构。

        因此apk包分为32位安装包、32位64位兼容包和64位安装包。

        注意:32位架构只支持32位安卓应用,兼容32位的64位架构支持32和64位安卓应用,不兼容32位的64位架构只支持64位安卓应用。

2、影响apk适配的cpu架构的因素-原生代码(C/C++代码)

        为什么原生代码决定apk适配的架构?为什么java代码不影响?

        安卓系统的内核是Linux,Linux是使用C语言和汇编语言编写的,Android系统是使用Java语言开发的,Java代码需要通过JNI调用原生代码才能实现对操作系统底层的调度。

        而为适配不同的cpu架构,可能需要根据cpu架构的不同编写不同的原生代码。

3、如何判断apk支持的cpu架构?

        3.1 查看apk支持的cpu架构

        通常apk中使用原生代码,基本都是将原生代码打包成so库供Java代码使用,因此判断apk支持的cpu架构只需要判断apk中包含的so库的架构即可。

        构建apk时会将不同架构的so库分不同的文件夹放置在lib文件夹下,架构和文件夹名称的对应关系如下:

        ARM架构:

        32 位:lib/armeabi-v7a、lib/armeabi

        64 位:lib/arm64-v8a

        x86架构:

        32 :lib/x86

        64 :lib/x86_64

        判断apk支持的cpu架构的方法就是检测apk文件的结构即可,具体方法如下:

        方法一:查看apk安装包中的lib文件夹下的库文件

        使用Android Studio菜单Build->Analyze APK->选择需要检测的apk,查看检测结果lib文件夹下的文件夹,如果有 armeabi、armeabi-v7a 或 x86文件夹,则说明有 32 位库,如有x86_64或arm64-v8a文件夹,则说明有64位库,如两种都有则说明即有32位库也有64位库。

        将apk文件后缀改为.zip,然后解压查看lib文件夹下的内容也可以。

        方法二:查看安卓引用代码中支持的so库的位数

        查看app模块下build.gradle文件下的android标签下的defaultConfig标签下的ndk标签下的abiFilters包含的支持的so库的位数。

        abiFilters 的值分别有以下几种,一个安卓应用可以兼容多种,用,分割

        ARM架构:

        32 位:'armeabi', 'armeabi-v7a'

        64 位:'arm64-v8a'

        x86架构:

        32 位:'x86'

        64 位: 'x86_64'

        如安卓应用没有使用任何so库,那么该安卓应用不存在主动去调度操作系统的功能,此安卓应用不管运行的手机是32位还是64位都不存在硬件调度的兼容问题,此安卓应用可以称之为32位和64位兼容包。

        3.2 不同cpu架构之间的so库的兼容关系

        Android设备如何加载.so文件

        arm64-v8a架构:

        armeabi-v7a架构:

        armeabi架构

        x86架构

        一个应用安装在设备上,只有该设备支持的CPU架构对应的.so文件会被安装。不同CPU架构的Android手机加载时会在libs下找自己对应的目录,从对应的目录下寻找需要的.so文件;如果没有对应的目录,就会去armeabi下去寻找,如果已经有对应的目录,但是如果没有找到对应的.so文件,也不会去armeabi下去寻找了。

        当在项目的build.gradle中设置了abiFilters时,要么对应的Filter的SO文件都有,要么都没有,那么应用程序就会直接向armeabi查找SO文件进行兼容处理。

ndk {

//APP的build.gradle设置支持的SO库架构

abiFilters 'armeabi', 'armeabi-v7a','arm64-v8a'

}

         适配不同的平台

   目前主流的Android设备是armeabi-v7a架构的,然后就是x86和armeabi了。如果同时包含了 armeabi,armeabi-v7a和x86,所有设备都可以运行,程序在运行的时候去加载不同平台对应的so,这是较为完美的一种解决方案,但是同时也会导致包变大。

   armeabi-v7a是可以兼容armeabi的,而v7a的CPU支持硬件浮点运算,目前绝大对数设备已经是armeabi-v7a了,所以为了性能上的更优,就不要为了兼容放到armeabi下了。x86也是可以兼容armeabi平台运行的,另外需要指出的是,打出包的x86的so,总会比armeabi平台的体积更小,对于性能有洁癖的童鞋们,还是建议在打包so的时候支持x86。

        第三方平台的.so库怎么处理

   第三方的类库只提供了armeabi下的.so文件,我们项目里适配了armeabi-v7a和x86,如果不在对应的文件下放对应的.so文件,就可能导致某些Android设备会出一些问题,我们可以复制armeabi下得.so文件到不同的文件夹下。如果第三方提供了不同平台的.so文件,则复制不同平台的.so文件到项目中对应的文件夹下即可

4、针对应用平台适配64位政策-让apk适配 64 位架构

        原因:

        目前,Arm架构将逐步限制32位应用的运行。32位应用仅支持跑在小核之上,会导致纯32位应用在性能与功耗等方面出现明显的体验问题。预计2023底上市的旗舰机,Arm的IP架构将只支持64位应用。

        政策解读:

        Arm将推出只支持64位应用的架构,因此应用要适配64位架构,修改的目的是为了确保应用能够在仅支持 64 位架构的环境中正常运行。

        针对政策的解决方案:

        确保应用包含64位库即可,如包含不做修改,如未包含,需添加64位库即可。

        应用不一定要支持所有 64 位架构,但对于支持的每种原生 32 位架构,应用都必须包含相应的 64 位架构。

5、Android Studio如何构建支持不同架构的apk

        修改build.gradle文件下的android标签下的defaultConfig标签下的ndk标签下的abiFilters值然后打包即可。

6、引用:

小米开放平台

Android打32/64位兼容包,ABI Filter的使用及其原理 - freewsf - 博客园

如何检测Android应用是32位还是64位_黄毛火烧雪下的博客-CSDN博客_怎么看app是不是64位

来源地址:https://blog.csdn.net/li1500742101/article/details/127631236

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

解读apk分包-32位安装包、32位64位兼容包和64位安装包

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Linux(64位)使用安装包安装JDK1.8

要在Linux 64位系统上安装JDK 1.8,您可以按照以下步骤进行操作:1. 首先,在Oracle官网上下载适用于Linux 64位系统的JDK 1.8安装包(tar.gz格式)。2. 打开终端,进入下载目录,并解压下载的压缩包。使用以
2023-09-14

安装Win8.1系统32位和64位应该怎么选择

从Win7开始,Windows系统开始有了32位和64位之分,安装Win8.1系统的时候,不少用户因此陷入应该选择32位系统还是64位系统好的困境。其实两个系统都是很不错的,下面小编就为大家介绍下Win8.1系统32位和64位的区别,大家再
2022-06-04

微软宣布以USB闪存形式出售Windows 10家庭版和专业版 包含32位和64位

&编程客栈nbsp; php微软将于7月29日正式推出WindleAastows 10,不过现在有新的报道称,该操编程客栈作系统的独立家庭和专业版本可能在零售商店通过一种新的方式来出售:USB闪存驱动器。 WinFu
2023-06-16

了解pip安装包存储的位置和结构

深入了解pip安装的包存放位置,需要具体代码示例pip是Python语言常用的包管理工具,用于方便地安装、升级和管理Python包。在使用pip安装包时,它会自动从PyPI(Python包索引)下载对应的包文件,并将其安装到指定的位置。
了解pip安装包存储的位置和结构
2024-01-18

揭示pip安装包的存储位置解析

pip是Python的包管理工具,能够方便地安装、升级和卸载各种Python包。在使用pip安装包时,它会自动下载包的源码并将其安装到系统中。在安装过程中,pip会将包存储到特定的位置,这决定了我们在代码中如何引用已安装的包。一般情况下,
揭示pip安装包的存储位置解析
2024-01-18

python3 pip安装出现E: 无法定位软件包如何解决

这篇文章主要介绍了python3 pip安装出现E: 无法定位软件包如何解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python3 pip安装出现E: 无法定位软件包如何解决文章都会有所收获,下面我们一起
2023-07-05

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录