Android 打包分析

简介: Android 打包分析

Android 打包分析


问题:make project 项目生成的apk大小在15M左右

   run 到设备里的apk 大小在5M左右  

通过解包分析 ,主要差异在lib文件夹下

15M的包

 

 

5M的包

 

 

如需控制打包的内容,在app的build.gradle中配置即可

ndk{

           abiFilters 'armeabi-v7a'

}

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值然后打包即可。


目录
相关文章
|
1月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
135 4
|
1月前
|
安全 Android开发 数据安全/隐私保护
深入探讨iOS与Android系统安全性对比分析
在移动操作系统领域,iOS和Android无疑是两大巨头。本文从技术角度出发,对这两个系统的架构、安全机制以及用户隐私保护等方面进行了详细的比较分析。通过深入探讨,我们旨在揭示两个系统在安全性方面的差异,并为用户提供一些实用的安全建议。
|
3月前
|
开发工具 Android开发 Swift
安卓与iOS开发环境对比分析
在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统无疑是主角。它们各自拥有独特的特点和优势,为开发者提供了不同的开发环境和工具。本文将深入浅出地探讨安卓和iOS开发环境的主要差异,包括开发工具、编程语言、用户界面设计、性能优化以及市场覆盖等方面,旨在帮助初学者更好地理解两大平台的开发特点,并为他们选择合适的开发路径提供参考。通过比较分析,我们将揭示不同环境下的开发实践,以及如何根据项目需求和目标受众来选择最合适的开发平台。
54 2
|
23天前
|
Java 开发工具 Android开发
安卓与iOS开发环境对比分析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自占据半壁江山。本文深入探讨了这两个平台的开发环境,从编程语言、开发工具到用户界面设计等多个角度进行比较。通过实际案例分析和代码示例,我们旨在为开发者提供一个清晰的指南,帮助他们根据项目需求和个人偏好做出明智的选择。无论你是初涉移动开发领域的新手,还是寻求跨平台解决方案的资深开发者,这篇文章都将为你提供宝贵的信息和启示。
28 8
|
2月前
|
缓存 Java Shell
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
81 15
Android 系统缓存扫描与清理方法分析
|
26天前
|
安全 Android开发 数据安全/隐私保护
深入探索Android与iOS系统安全性的对比分析
在当今数字化时代,移动操作系统的安全已成为用户和开发者共同关注的重点。本文旨在通过比较Android与iOS两大主流操作系统在安全性方面的差异,揭示两者在设计理念、权限管理、应用审核机制等方面的不同之处。我们将探讨这些差异如何影响用户的安全体验以及可能带来的风险。
34 1
|
2月前
|
存储 Linux Android开发
Android底层:通熟易懂分析binder:1.binder准备工作
本文详细介绍了Android Binder机制的准备工作,包括打开Binder驱动、内存映射(mmap)、启动Binder主线程等内容。通过分析系统调用和进程与驱动层的通信,解释了Binder如何实现进程间通信。文章还探讨了Binder主线程的启动流程及其在进程通信中的作用,最后总结了Binder准备工作的调用时机和重要性。
Android底层:通熟易懂分析binder:1.binder准备工作
|
3月前
|
安全 Android开发 数据安全/隐私保护
探索安卓与iOS的安全性差异:技术深度分析与实践建议
本文旨在深入探讨并比较Android和iOS两大移动操作系统在安全性方面的不同之处。通过详细的技术分析,揭示两者在架构设计、权限管理、应用生态及更新机制等方面的安全特性。同时,针对这些差异提出针对性的实践建议,旨在为开发者和用户提供增强移动设备安全性的参考。
154 3
|
2月前
|
开发工具 Android开发 Swift
安卓与iOS开发环境的差异性分析
【10月更文挑战第8天】 本文旨在探讨Android和iOS两大移动操作系统在开发环境上的不同,包括开发语言、工具、平台特性等方面。通过对这些差异性的分析,帮助开发者更好地理解两大平台,以便在项目开发中做出更合适的技术选择。
|
3月前
|
安全 Linux Android开发
探索安卓与iOS的安全性差异:技术深度分析
本文深入探讨了安卓(Android)和iOS两个主流操作系统平台在安全性方面的不同之处。通过比较它们在架构设计、系统更新机制、应用程序生态和隐私保护策略等方面的差异,揭示了每个平台独特的安全优势及潜在风险。此外,文章还讨论了用户在使用这些设备时可以采取的一些最佳实践,以增强个人数据的安全。