精通安卓性能优化-第二章(一)

来源:互联网 发布:程序员男朋友好不好 编辑:程序博客网 时间:2024/05/06 04:20

第二章 使用NDK

NDK(Native Development Kit)是SDK的同伴,当你期望你的应用全部或者部分使用native代码会使用到。字节码需要被虚拟机解释,native代码可以被设备的处理器直接执行,而不需要任何中间步骤,使得执行更快,有时候会快很多。Dalvik JIT(Just-In-Time)编译器把字节码编译成native代码,可以减少解释代码的次数,让你的应用程序更快(理想状态下,只有一次),因为它使用生成的native代码当native代码可用的时候。当你使用NDK,编译成native码发生在你的开发环境下而不是Android设备。你可能想知道既然JIT可以动态产生native代码,可以使用SDK写应用,为什么还需要考虑NDK。本章会告诉你为什么需要使用NDK, 和它的不同的使用方式。

有两种使用native码和NDK的方式:
(1) 应用程序可以部分是Java,其他部分用C/C++实现
(2) 应用程序可以全部用C/C++实现。

NOTE:Android 1.5开始支持NDK。现在几乎没有设备使用Android 1.5以前的版本,因此在应用中部分使用NDK是安全的。然而,整个应用都使用C/C++需要安卓2.3或者以后的版本。

本章从NDK的组成开始。接着,将学习如何在Android应用中混合使用C/C++代码和Java代码,如何保证代码在所有的目标平台上是优化的。最终,我们将深入介绍一个新类NativeActivity,在安卓2.3引入,允许使用C/C++去写整个的应用程序,我们将给出一个简单的在C/C++中使用感应器的实例。

NDK中有什么

NDK是为应用程序开发native代码的一系列工具。所有的东西都在同一个目录下,可以从http://d.android.com/sdk/ndk下载这个压缩包。比如,Windows版本的6b版NDK包括如下的目录:

(1) build
(2) docs
(3) platforms
(4) samples
(5) sources
(6) tests
(7) toolchains

NDK根目录下同样有几个文件:
(1) documentation.html
(2) GNUmakefile
(3) ndk-build
(4) ndk-gdb
(5) ndk-stack
(6) README.txt
(7) RELEASE.txt

NDK文档远不及http://d.android.com的SDK文档,所以从打开documentation.html开始吧。README.txt也要看一下。

NDK由6部分组成:
(1) Documentation
(2) Header files
(3) C/C++ files
(4) Precompiled libraries
(5) Tools to compile, link, analyze, and debug your code
(6) Sample applications

Native代从定义看针对于某个特定的体系结构。比如,Intel的CPU不会理解ARM的指令,反过来也一样。因此,NDK包括针对多平台的预编译库以及不同版本的工具。NDK 7支持3个Application Binary Interfaces(ABIs):
(1) armeabi
(2) armeabi-v7a
(3) x86

NOTE:NDK不支持ARMv6 ABI。

大多数人已经熟悉x86这个名字,因为它是intel(一个无处不在的名称)的结构。armeabi和armeabi-v7a的名字可能不够熟悉,但是你可以在许多使用产品中找到基于ARM的芯片,从洗衣机到DVD播放器。在你听到安卓之前,长期使用着基于ARM的设备。在2011第二季度基于ARM的芯片出货量接近2亿:1.1亿用于手机和平板,0.8亿用于其他消费和嵌入式设备。

单词armeabi表示ARM Embedded Application Binary Interface,v5和v7a是两种不同的架构。ARM架构从v1开始,最新的是v7。每个体系架构被一系列的处理器核所使用,v5用于ARM7、ARM9和ARM10,v7用于Cortex。Cortex系列包括A5、A8、A9和A15,当前大多数的智能机和平板使用A8和A9核。

Android NDK不支持ARMv6体系,ARM11系列的处理器采用这个架构,尽管一些Android设备采用基于ARM-11的芯片。表2-1给出了一系列的安卓设备和它们的处理器。

表2-1 一些Android设备和他们的架构


2011年9月,MIPS科技宣布基于MIPS的智能机运行Android通过了Android的CTS测试,Android NDK仍然不支持MIPS ABI。当前,ARM仍然在Android设备中占主导优势。

NOTE:2010年出的所有Google TV设备(罗技机顶盒,索尼电视,蓝光播放器等)基于Intel CE4100。然而,Google TV平台当前不支持NDK。

因为NDK频繁更新,需要尝试去使用最新的版本。新的版本可能有更好的性能,比如提供更好的编译器或者更多的预编译库。新的版本同样修正了以前版本的Bug。当发布应用更新的时候,考虑使用最新的NDK重新编译你的C/C++代码即使你只修改了Java部分。然而,要保证在C/C++上运行测试。表2-2给出了NDK的版本。

表2-2 Android NDK版本





0 0