热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

AndroidApp—适配arm64v8a的探索

目前,华为、小米、三星、OPPO、VIVO等应用商店已经支持32位和64位APP,GooglePlay已经强制要求上传64位的APP,而且

        目前,华为、小米、三星、OPPO、VIVO等应用商店已经支持32位和64位APP,Google Play已经强制要求上传64位的APP,而且Google明确了在Android 12上只支持64位的APP,32位App将会被抛弃。

        随着手机CPU采用arm64-v8a架构达到了90%以上,剩余的基本是32位架构的armeabi-v7a,而armeabi、x86、x86_64基本已经没有在使用的真实设备。虽然我们依旧可以在arm64-v8a架构的设备上运行只适配了32位armeabi-v7a架构的APP,但是适配了64位的APP有内存使用率、性能体验等方面的优势,所以APP针对arm64-v8a架构的64位适配势在必行。

        分析APP启动过程发现,64适配重点就是so库的适配,这里先不讨论so动态下发、应用内更新、以及具体的踩坑过程。由于无论是自己编译生成so库,还是第三方直接提供so库,最后都能得到相应架构的so库,所以这里主要讲述下:如何做工程改造、以及如何做链路改造。


方案一:ABI Filters

        在 gradle.properties 文件中,配置 COMPLIE_32_BIT_VERSION 变量:

#编译的APK是否为32位
COMPLIE_32_BIT_VERSION = true

        在app模块的 build.gradle 文件里, 读取 COMPLIE_32_BIT_VERSION 变量,来确定需要包含哪些架构的so库:

android {...defaultConfig {...ndk {def filters = "arm64-v8a"boolean compile32Bit = Boolean.valueOf(COMPILE_32_BIT_VERSION)if (compile32Bit) {filters = "armeabi-v7a"}abiFilters filters}}packagingOptions {// 剔除打包了无用so库的问题exclude 'lib/x86/xxx.so'exclude 'lib/x86_64/xxx.so'// 解决so库重复打包的问题pickFirst 'lib/armeabi-v7a/xxx.so'pickFirst 'lib/arm64-v8a/xxx.so'}...
}

        在Jenkins参数化构建时,替换掉 COMPLIE_32_BIT_VERSION 变量的值,来生成期望架构的APK:

结果如下:

 







方案二:APK Split

        在app模块的 build.gradle 文件里,做类似以下的配置,会自动生成多个APK文件。其可通过屏幕密度(mdpi, hdpi, xhdpi…)或者处理器架构(arm64-v8a, armeabi-v7a…)来进行拆分,还可以生成是否包含多种架构的通版APK。

android {...defaultConfig {...splits {// Configures multiple APKs based on ABI.abi {def isReleaseBuild = falsegradle.startParameter.taskNames.find {// Enable split for release builds in different build flavors// (assemblePaidRelease, assembleFreeRelease, etc.).if (it ==~ /:app:assemble.*Release/) {isReleaseBuild = true// breakreturn true}// continuereturn false}// Enables building multiple APKs per ABI.enable isReleaseBuild// By default all ABIs are included, so use reset() and include to specify that we only// want APKs for x86, armeabi-v7a, and mips.reset()// Specifies a list of ABIs that Gradle should create APKs for.include "armeabi-v7a", "arm64-v8a", "x86_64"// Specifies that we want to also generate a universal APK that includes all ABIs.universalApk true}}}...
}

        除了生成像方案一中arm64-v8a、armeabi-v7a架构的APK,还生成了只包含x86架构和所有架构的通版APK:


方案三:APK Split + ABI Filters

        在开发中发现,方案二不支持Android Studio直接install APK到设备上运行。为了方便调试,debug包依然采用ABI Filters包含多种架构的方式:

android {...defaultConfig {...splits {abi {def isDebugBuild = falsegradle.startParameter.taskNames.find {if (it.toLowerCase().contains("debug")) {isDebugBuild = true}}if (!isDebugBuild) {enable truereset()universalApk false} else {// AS直接run到设备上ndk {abiFilters "armeabi-v7a", 'arm64-v8a', 'x86-64'}}}}}...
}

参考:

https://developer.android.com/google/play/publishing/multiple-apks

https://blog.csdn.net/weixin_38753262/article/details/107873316

https://mp.weixin.qq.com/s/SHFqS3RKKlprijlf6hL09w

https://blog.csdn.net/wangqjpp/article/details/107115599

https://www.jianshu.com/p/76db8b87fac3

https://www.jianshu.com/p/a5314382b64c


推荐阅读
  • 本文记录了作者对x265开源代码的实现与框架进行学习与探索的过程,包括x265的下载地址与参考资料,以及在Win7 32 bit PC、VS2010平台上的安装与配置步骤。 ... [详细]
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
  • Centos7搭建ELK(Elasticsearch、Logstash、Kibana)教程及注意事项
    本文介绍了在Centos7上搭建ELK(Elasticsearch、Logstash、Kibana)的详细步骤,包括下载安装包、安装Elasticsearch、创建用户、修改配置文件等。同时提供了使用华为镜像站下载安装包的方法,并强调了保证版本一致的重要性。 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
author-avatar
皇家让梦起飞jie
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有