|
|
51CTO旗下网站
|
|
vwin官网端

8月不支撑64位,App将无法上架Google Play!需求怎样做?

今日就来聊聊 Android APK 晋级 64 位 CPU 架构的细节,看看你的运用是否需求支撑 64 位 CPU 架构,假设要支撑,需求做什么?

作者:承香默影来历:掘金|2019-06-11 13:18

8月不支撑64位,App将无法上架Google Play!需求怎样做?

一. 序

工作是这样的,前几天收到 Google Play 的告知邮件,这才想起来有几款在 Google Play 上架的 App,还没有支撑 64 位 CPU 架构。

8月不支撑64位,App将无法上架Google Play!需求怎样做?

早在本年一月份,Google 就发布告知,在本年 8 月 1 日开端,上架的 App,除了供给 32 位的版别之外,还需求供给 64 位的版别。

这眼看着离强制晋级窗口,只剩下终究两个月的时间,许多第三放来历的 so 支撑库,假设没有供给 64 位的版别,还需求同步敦促合作方更新。

那今日就来聊聊 Android APK 晋级 64 位 CPU 架构的细节,看看你的运用是否需求支撑 64 位 CPU 架构,假设要支撑,需求做什么?

二. Android CPU 架构细节

2.1 这是强制规范

早在 2015 年 Google 发布 Android 5.0 版别时,就参加了 64 位处理器的支撑,其时就提出了以 19 年 8 月为终究的更新支撑期限,并在本年又重申了这个强制要求。

只需你的 App 存在国际版,需求上架 Google Play,这个规矩都必须准守。

2.2 那些 APK 需求支撑 64 位?

那假设你有一个国际化的 App 需求保护,在本年 8 月 1 日之后,更新 Google Play 时,就必须供给 64 位的版别。

那这儿说的 64 位版别支撑,究竟是什么?

假设你的运用,完全是运用 Java 或许 Kotlin 编写代码,不包括任何原生(Native)的支撑,那么就表明这个运用现已支撑 64 位。

可是运用内运用了任何原生(Native)的支撑(so 库),就需求针对这些 so 文件,针对不同的 CPU 架构供给不同的版别的 so 支撑。

需求留意的是,有些时分,在咱们自身的代码中,的确没有用到原生的支撑,可是在 App 中运用的一些第三方库中却包括了。

此刻最保险的办法,便是针对终究打包生成的 APK 文件进行剖析,来判别是否需求供给 64 位架构的支撑。

那 CPU 架构是什么?什么又是 ABIs?

在 Android 中,尽管 ARM 的 CPU 架构是干流,可是现在至少支撑几类 CPU 架构,ARM 下的 ARMv5/ARMv7/ARMv8,x86 下的 x86/x86_64,以及很不常见的 MIPS 类架构。这儿的每一种 CPU 类型对应了一种 ABI(Application Binary Interface),例如 armeabi-v7a 中的 "armeabi" 指的便是 ARM 这种类型的 ABI,后边的 “v7a” 指的是 ARMv7。

一般咱们能够简略的了解:

8月不支撑64位,App将无法上架Google Play!需求怎样做?

这三个概念是相通的,一般在技能评论中,说的是一个东西。

2.3 为什么是强制的?

谷歌之所以会有强制更新的要求,很大一方面原因是由于作为开发者,更新补全 ABIs 的动力并缺乏。

首要原因来自以下几个方面:

1. APK 体积增大

针对不同 CPU 架构供给对应的 so 库,当然是功率最高的做法。可是这种做法,最直接的影响,便是 APK 文件的增大,有些时分补全这些 so 支撑,会导致整个 APK 体积有几 MB 到几十 MB 的增幅。

APK 体积优化,许多公司都将其当作是一个 KPI 方针,参加一个新特性,导致 APK 体积的增大,在许多时分都是不允许的,为此换技能计划都是常有的事。

从添加的视点来看,越小的 APK,用户下载的志愿就更大,转化率就越高。

可是跟着现在流量越来越廉价,近期 iOS 现已将 蜂窝数据下载约束从 150MB 放宽至 200MB,针对装置包的体积优化规范,也能够恰当的放宽了。

2. 自身有必定的兼容性

运用商场中,许多 APP 其实都只要 armeabi 或许 armeabi-v7a 的支撑,而市面上的设备,支撑的并不是只要这两种 CPU 架构。

可是这并没有影响在这些设备上运转这些 App,这便是 CPU 架构的兼容性。

不同架构,并不意味着之间必定是不兼容的,在不同版别下,其实供给了两种 ABI 支撑,别离是

  • 首要 ABI:与体系自身运用的原生代码相同,最优计划。
  • 辅佐 ABI:支撑的另一个 ABI 计划,兼容计划。

这种兼容战略就不在这儿打开说了,最简略的便是 64 位的 arm64-v8a 在支撑自身的 CPU 架构之外,还兼容支撑 armeabi-v7a、armeabi;x86_64 一起也兼容支撑 X86 和 armeabi。

你看,尽管添加 64 位的支撑,能够有用的运用硬件的优势,提高功用,但大部分时分,选用兼容计划,是一种更简略的办法。

3. 没有对应架构的 so 文件

这个原因就比较为难了,咱们 App 中运用到的原生代码,其实有两种。

一种是咱们自己编写的,源码在手,想供给对应的支撑,修正装备从头编译一下就处理了。

另一种来自第三方供给的,这种时分咱们没有源码,无法做到从头编译,只能和第三方交流,看能不能供给一个对应 CPU 架构的 so 库。这种状况就十分的不可控了。

例如比较常见的一个 WebView 的替换计划,腾讯 X5 内核,自身就不供给 X86 的库。

8月不支撑64位,App将无法上架Google Play!需求怎样做?

官方给的主张是运用 armeabi 或许 armeabi-v7a。

在前文有说到,ABIs 自身是有一些兼容规矩的,可是这种兼容规矩,是有条件的。

举个比如:64 位的 arm64-v8a 是能够向下兼容的,可是这有个条件,那便是假设你的项目中,有 armeabi-v7a 和 arm64-v8a 两个目录,就需求确保这两个目录下支撑的 so 库文件坚持一致。

8月不支撑64位,App将无法上架Google Play!需求怎样做?

在左面的状况下,假设 arm64-v8a 的手机用到 b.so 时,就会去 arm64-v8a 目录下找,当然是找不到 b.so 文件的,就会直接抛反常,而不会再去 armeabi-v7a 目录下持续寻觅。

假设需求供给多套 ABIs 的支撑,就需求确保一切 ABI 目录下,对应的 so 文件坚持一致。

而在一些特别的状况下,咱们无法供给对应渠道的 so 库,例如腾讯 X5 内核这种状况,就需求做个取舍了。

在没有 Google Play 的强制战略下,一起又由于各方考虑,大多数时分咱们可能会放弃其他 ABIs 的支撑。可是现在已然强制执行了,腾讯 X5 内核就可能晋级以供给 64 位的 so 库,究竟一边是无法上架,别的一遍是一个 WebView 的内核,谁都知道怎样取舍。

三、支撑 64 位架构

3.1 是否包括 64 位库?

介绍了 Android 下 CPU 架构的一些细节,接下来就要开端正题了,怎么晋级并支撑 64 位架构。

早年文中应该了解到,支撑对应的 ABIs,反映在项目中,便是存在对应 ABIs 架构的目录,而且目录中有齐备的 so 库支撑。

Google 并不要求咱们支撑一切的 64 位架构,可是关于现已支撑的每种原生 32 位架构,就必须包括对应的 64 位架构。

例如:

  • 关于 ARM 架构,有 armeabi-v7a(32位) 就必须 arm64-v8a(64位)。
  • 关于 x86 架构,有 x86(32位) 就必须有 x86_64(64位)

这就要求咱们有对应的目录,而且目录中包括对应的 so 文件。APK 中供给了齐备的 ABIs 支撑,运转的之后,会选取对应的最优支撑进行加载和运用。

需求留意的是,有时分咱们将 32 位的 so 复制到 64 位中,运转不会出现反常,可是这仍然存在危险。最好的办法是依据不同的架构,编译对应的 so 文件,原则上,咱们的方针是确保运用能够在仅支撑 64 位架构的环境中正常运转。

3.2 判别是否支撑 64 位架构

前面也说到,咱们的项目中,可能会引进一些第三方库,导致在不明确的状况下,引进了一些预期之外的 ABIs 库。

一般咱们的做法是在 Gradle 中添加 abiFilters 过滤,来确保不会在打包输出的 APK 中存在预期之外的 ABIs 目录和 so 库。

  1. ndk { 
  2.     //设置支撑的SO库架构 
  3.     abiFilters 'armeabi-v7a'  

那么咱们拿终究打包输出的 APK 文件去剖析,是最保险的办法。

剖析的办法有两种:

1. AS 的 APK 剖析器

在 Android Studio 中,从菜单顺次挑选 Build → Analyze APK...

8月不支撑64位,App将无法上架Google Play!需求怎样做?

挑选需求剖析的 APK 文件,检查其 lib 目录,是否存在预期的 ABIs 目录以及齐备的 so 文件。

8月不支撑64位,App将无法上架Google Play!需求怎样做?

2. 运用 zipinfo 指令进行剖析

得到待剖析的 APK 文件,就能够经过 zipinfo + grep 指令,输出其内包括的 so 文件。

  1. > zipinfo -1 YOUR_APK_FILE.apk | grep \.so$ 
  2.     lib/armeabi-v7a/libmain.so 
  3.     lib/armeabi-v7a/libmono.so 
  4.     lib/armeabi-v7a/libunity.so 
  5.     lib/arm64-v8a/libmain.so 
  6.     lib/arm64-v8a/libmono.so 
  7.     lib/arm64-v8a/libunity.so 

仍然是去看对应目录和 so 文件是否齐备。

3.3 在 64 位设备上测验运用

支撑 64 位架构是为了让咱们运用 CPU 的特性,以提高功用,可是安稳仍然是咱们首先要确保的,所以在晋级之后,就需求进行测验。

要测验 App,最简略的办法是运用 adb 指令装置该运用,能够合作 --abi 参数,用以指示要将那些 so 库,装置到设备上,这样咱们在这个设备上装置的 App,就会仅包括咱们拟定的库。

  1. # 成功装置 APK : 
  2. > adb install --abi armeabi-v7a YOUR_APK_FILE.apk 
  3. Success 
  4.  
  5. # 假设 APK 中不包括 64 位 so 文件: 
  6. > adb install --abi arm64-v8a YOUR_APK_FILE.apk 
  7. adb: failed to install YOUR_APK_FILE.apk: Failure [INSTALL_FAILED_NO_MATCHING_ABIS: Failed to extract native libraries, res=-113] 
  8.  
  9. # 假设你的设备(手机)不支撑 64 位架构 
  10. > adb install --abi arm64-v8a YOUR_APK_FILE.apk 
  11. ABI arm64-v8a not supported on this device 

上一年上市的手机,大部分都是 64 位架构的,找一款来测验即可。

3.4 分包处理

假设咱们的运用只需求在国内分发,当时的战略对咱们并不影响,坚持原样就好了。可是假设存在国际版,需求上架 Google Play 就必定要注重此次晋级。

在 Google Play 上传 APK,是能够依据 CPU 架构上传不同的 APK 的,也便是咱们能够针对 32 位上传一个 APK,再上传一个 64 位的 APK。

此刻就需求用到 Gradle 的打包技巧了,别离输出几个仅包括对应渠道的 APK,以此完结 Google Play 的要求,别离上传 32 位的支撑 APK 和 64 位的支撑 APK,这样能够 APK 文件不至于增大许多。

  1. android { 
  2.     ...  
  3.     splits { 
  4.         abi { 
  5.             enable true 
  6.             reset() 
  7.             include 'x86''x86_64''armeabi-v7a''arm64-v8a' //select ABIs to build APKs for 
  8.             universalApk true //generate an additional APK that contains all the ABIs 
  9.         } 
  10.     } 
  11.     // map for the version code 
  12.     project.ext.versionCodes = ['armeabi': 1, 'armeabi-v7a': 2, 'arm64-v8a': 3, 'mips': 5, 'mips64': 6, 'x86': 8, 'x86_64': 9] 
  13.   
  14.     android.applicationVariants.all { variant -> 
  15.         // assign different version code for each output 
  16.         variant.outputs.each { output -> 
  17.             output.versionCodeOverride = 
  18.                     project.ext.versionCodes.get(output.getFilter(com.android.build.OutputFile.ABI), 0) * 1000000 + android.defaultConfig.versionCode 
  19.         } 
  20.     } 
  21.  } 

这儿运用 Gradle 的 splite 装备,有爱好能够直接查阅文档,就不打开讲了。

四. 小结时间

在本文中,咱们借此次 Google Play 的强制支撑 64 位架构的工作,解说了 Android 下 so 库的一些兼容问题。

假设你在 Google Play 上有运用需求更新,别忘了提前准备需求的 so 库,大多数原生支撑的第三方库,在此之前其实都现已供给了对应的 64 位架构。咱们只需求在终究日期之前,细心的进行添加 so 文件,以到达适配的作用。

更新完结之后,别忘了测验,本文就到这儿,你有什么更新的见地,欢迎在留言区评论。

【修改引荐】

  1. 人民日报称App过度讨取权限,手机App是技能霸凌的重灾区
  2. 报导称华为正与第三方运用商铺洽谈 将代替Google Play
  3. 苹果设备出问题了怎样办?这个官方 App 给你一站式支撑
  4. 研讨数十个抢手 APP后,我来告知你怎么规划好「点赞」功用
  5. 苹果在我国建立首个App规划开发加速器
【责任修改:未丽燕 TEL:(010)68476606】

点赞 0
共享:
我们都在看
猜你喜爱

订阅专栏+更多

WOT2019全球人工智能技能峰会

WOT2019全球人工智能技能峰会

通用技能、运用领域、企业赋能三大章节,13大技能专场,60+国内外一线人工智能精英大咖站台,共享人工智能的渠道东西、算法模型、语音视觉等技能主题,助力人工智能落地。
共50章 | WOT峰会

0人订阅学习

Spring Boot 爬虫查找轻松游

Spring Boot 爬虫查找轻松游

全栈式开发之旅
共4章 | 美码师

77人订阅学习

Linux功用调优攻略

Linux功用调优攻略

功用调优规范
共15章 | 南非蚂蚁

223人订阅学习

读 书 +更多

网络技能应试教导(三级)

本书依据教育部考试中心2004年最新发布的《全国核算机等级考试纲要》编写,针对核算机等级考试三级网络技能各方面的考点进行解说和练习。本...

订阅51CTO邮刊

点击这儿检查样刊

订阅51CTO邮刊

51CTO服务号

51CTO播客