64位安卓* 和安卓运行库

本文介绍了安卓64位系统的发展,包括64位安卓L仿真器的发布,以及x86_64安卓NDK在开发中的作用。Google提供了64位L预览仿真器,支持开发人员测试程序。64位程序在内存消耗、性能优化、对齐和内在函数等方面有特殊要求。此外,文章还讨论了安卓运行时(ART)的优势,如提高性能和优化垃圾回收。开发者可以利用这些工具和知识优化面向64位架构的应用。
摘要由CSDN通过智能技术生成

简介

移动市场最新的关注点都集中在安卓 64 位系统。2013 年 9 月,Apple 发布了采用板载 64 位 A7 处理器的 iPhone* 5,进而掀起了新一轮移动技术竞争。

结果表明,基于安卓的内核 GNU/Linux* 在长时间内为带有 64 位寄存器的处理器提供了出色的支持。Ubuntu 是 "GNU/Linux",而安卓是 "Dalvik/Linux"。Dalvik 是 Google's 安卓操作系统中的程序虚拟机 (VM),专门执行为安卓系统编写的应用。Dalvik 因此成为了安卓软件堆栈不可或缺的一部分,该系统常见于手机和平板电脑等移动设备,最近还在智能电视和可穿戴设备领域有着广泛的应用。然而,所有使用 NDK 的开发人员都不得不根据最新架构重新构建程序,其难易程度取决于 Google 提供的工具。此外,Google 应提供向后兼容性,例如,NDK 32 位应用应能够在安卓 64 位中运行。

首款面向移动设备的英特尔 64 位处理器于 2013 年第 3季度创建,并随即成为移动和台式设备中功能强大的的全新多核系统芯片 (SoC)。全新 SoC 系列包括面向平板电脑和 2 合 1 设备的英特尔® 凌动TM 处理器、英特尔® 赛扬® 处理器,以及面向 2 合 1 设备、笔记本电脑、台式机和一体机的英特尔® 奔腾® 处理器。

2014 年 10 月,Google 发布了 64 位安卓 L(面向开发人员)的预览仿真器映像。它可支持开发人员在发布操作系统之前测试程序并重新编写代码(如有必要)。开发人员在 Google+ blog>Google+博客 中表示,完全使用 Java* 创建的程序无需移植。他们按照 L- 版仿真器原来的样子运行这些程序,以支持 64 位架构。而使用其他语言(特别是 C 和 C++)的开发人员则必须执行几个步骤,以按照新的安卓 NDK 创建程序。目前市场可提供几种采用 64 位处理器并且基于安卓系统设备的老旧版本。但制造商必须快速更新这些设备,否则将无法为用户提供充足的软件应用。

安卓 64 位 L 仿真器

2014 年 6 月,Google 宣布安卓将在即将发布的 L 版本中支持 64 位。对于希望发挥设备和应用最佳性能的用户来说,这绝对是一个利好消息。Google 在本次更新过程中所重点强调的优势包括支持更多寄存器、增加可寻址内存空间,并支持全新指令集。

安卓仿真器可支持移动设备中的诸多硬件特性,包括:

  • ARM* v5 CPU 和相应的内存管理单元 (MMU)
  • 16 位 LCD 显示器
  • 一个或多个键盘(基于 Qwerty 的键盘和相关 Dpad/Phone 按钮)
  • 具备输入输出功能的声卡芯片
  • 闪存分区(通过开发环境中的磁盘映射文件仿真)
  • GSM 调制解调器,包括仿真的 SIM 卡
  • 摄像头,使用连接开发计算机的网络摄像头
  • 加速计等传感器,使用连接 USB 的安卓设备所传输的数据

对于构建钟爱的设备和应用来说,这是我们所取得的巨大进展。但遗憾的是,在享用这些全新的性能提升优势之前,我们必须等待Android L 的终止。Android L 发布几周后,原生开发套件 (NDK) 版本 10 应公布其对三种 64 位架构(arm64-v8a、x86_64 和 mips64)的支持,从而能够运行新版安卓系统。如果您已使用 Java 构建应用,您的代码将基于全新 x86 64 位架构自动实现性能提升。Google 已将 NDK 更新至版本 10b,并添加了仿真器映像,开发人员可使用该插件在内置了英特尔 64 位芯片的设备上运行其应用。

请记住,NDK 仅用于原生应用,而无法支持在常规安卓 SDK 上使用 Java 构建的应用。如果您希望应用基于 64 位运行,或者需要更新至最新版本的 NDK,请访问开发人员门户网站下载。

x86_64 安卓 NDK 助力开发

原生开发套件 (NDK) 是一套工具集,可支持您使用诸如 C 和 C++ 等原生代码语言实施部分应用。对于某些应用来说,这可能会有所帮助,因为您可以重复利用通过这些语言编写的现有代码库,但大多数应用无需使用安卓 NDK。使用 NDK 时,您需要平衡其优势与劣势。值得注意的是,使用安卓的原生代码通常不仅无法实现显著的性能提升,而且还会提高应用的复杂性。请在应用确实需要的时候使用 NDK,而不要仅仅出于使用 C/C++ 编程的目的。

您可通过以下网址下载最新版安卓 NDK:https://developer.android.com/tools/sdk/ndk/index.html

在本章节中,我将简单回顾如何使用安卓 NDK 编译示例应用。

我们将使用位于安卓 NDK 示例目录的示例应用 san-angeles

$ANDROID_NDK/samples/san-angeles

原生代码位于 jni/ 目录:

$ANDROID_NDK/samples/san-angeles/jni

针对指定 CPU 架构编译原生代码。安卓应用可能在一个 apk 文件中包含面向多个架构的库。

您需要在 jni/ 目录中创建Application.mk 文件来设定目标架构。下列行可编译面向所有支持架构的原生库:

APP_ABI := all

通常,最佳的方法是指定目标架构列表。下行命令可编译面向 x86 和 ARM 架构的库:

APP_ABI := x86 armeabi armeabi-v7a

由于我们要构建 64 位应用,因此我们需要编译面向 x86_64 架构的库:

APP_ABI := x86_64

运行示例目录中的以下命令来构建库:

cd $ANDROID_NDK/samples/san-angeles

完成构建后,打开 Eclipse* 中作为安卓应用的示例,并点击“运行”。选择仿真器或连接的安卓设备,以在这些设备中运行应用。

为支持所有可用设备,您需要编译面向所有架构的应用。如果带有库(面向所有架构)的 apk 文件太大,请考虑使用 Google Play 多个 APK 支持 中的指令,为各平台准备单独的 apk 文件。

查看支持的架构

您可以使用该命令查看 apk 文件中所包含的架构:

aapt dump badging file.apk

下面的命令列出了所有架构:

native-code:'armeabi', 'armeabi-v7a', 'x86', 'x86_64'

还有一种方法是打开压缩的 apk 文件并查看 lib/ 目录中的子目录。

64 位程序优化

降低应用消耗的内存

当以 64 位模式编译程序时,其消耗的内存高于 32 位版本。人们通常忽视这种较高的内存消耗,但 64 位应用的内存消耗量有时是 32 位应用的三倍。内存消耗量由下列因素决定:

  • 指示器等部分对象,要求更大的内存
  • 数据对齐和数据结构填充
  • 增加的堆栈内存消耗量

相比于 32 位系统,64 位系统通常为用户应用提供更多的内存。因此,如果在 2GB 内存的 32 位系统中,程序的内存消耗量为 300MB,而在 8GB 内存的 64 位系统中,该程序则需消耗 400MB,那么在相关单元中,该程序在 64 位系统中所消耗的内存可降低 3 倍。它的劣势在于性能损失。尽管 64 位程序的速度更快,但从内存中提取更多数据会抵消所有优势,甚至会降低性能。内存和微处理器(高速缓存)之间的数据传输也代价高昂。

可降低内存消耗量的另一种方法是优化数据结构。还有一种方法是使用内存节约型数据类型。例如,如果我们需要保存大量整数,并知道其数值不会超过 UINT_MAX,我们可以使用 "unsigned" 类型替换 "size t" 类型(将在下一章节中讨论)。

使用地址运算中的 memsize-type

使用地址运算中的 ptrdiff_t 和 size_t 类型不仅能够额外提升性能,还可确保代码安全。例如,将大小不同于指示器容量的 int 类型用作指数,可增加二进制代码的数据转换命令。我们可能有 64 位代码,且指示器的大小为 64 位,但 int 类型的大小保持相同 - 32 位。

我们无法通过简单的例子来说明size_t 优于 unsigned。为公平起见,我们使用编译器的优化功能。但优化后代码的两个变量通常大不相同,以致于无法有效证明这种巨大的差异性。我们在尝试 6 次之后终于成功创建了简单示例。但示例还很不理想,因为它仅表示编译器能够使用 size_t 构建更高效的代码,而不是包含了上述不必要数据类别转换的代码。思考一下这个代码,它能够以倒序排列数组项:

01 <code1.txt>
02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值