基于Intel架构开发和优化Android应用

摘要

本文主要介绍如何在Intel Atom架构下开发和优化Android应用程序,如何开发和移植Android NDK应用,以及如何通过代码阶段和编译阶段来优化NDK应用。

目录

•1.      Android* 应用程序的分类

•2.      Android* 本地开发套件(NDK)介绍

•3.      为Intel架构开发和移植NDK应用

•4.      本地代码开发注意点

•5.      通用性能优化

•6.      总结

Android* 应用程序的分类

Android应用程序大致可以分为两类:

一类是Dalvik应用,这类应用程序只包含Java代码和必须的xml,png等文件,调用Android官方SDK的API,最后通过编译为APK文件。

另一类应用是NDK应用,这类应用不仅包含Java代码和必须的xml,png等文件,还包含本地代码(.h, .c, .cc, )甚至还包括汇编代码。所有本地代码通过MakeFile编译为动态库(so文件),Java端通过JNI机制去调用动态库。

其原理如下图所示:

 

 

Android* 本地开发套件介绍

NDK的全称为本地开发套件,一般来说会在以下两个场合中使用到:

1. 构建高性能要求的部分。如音视频的编解码,图形图像的处理,会使用C或者汇编等本地代码。因为Java代码的执行需要虚拟机去解释,而本地代码直接编译成二进制文件,在高性能要求的地方,执行起来更加高效。

2. 重用已有代码。对于已有的C库,C++库,可以通过NDK的机制来调用已有的库。

对于相应的应用开发,英特尔提供了硬件加速管理器,可以显著提升应用开发过程中Android模拟器的性能。具体可以访问网址: /en-us/articles/intel-hardware-accelerated-execution-manager 获取关于硬件加速管理器的更多内容。

Intel Atom架构开发和优化NDK应用

NDK应用的开发可以分为以下五个步骤:

 

开发兼容Intel架构的NDK应用需要在第二步编写MakeFile的时候添加APP_ABI := x86 代码段。

对于已有的NDK应用向Intel Atom架构移植需要遵循以下步骤:



1. 如果是Dalvik应用,可以直接在Intel架构上运行。只需要为相应的设备调整分辨率即可。

2. 如果是NDK应用,如果仅包含C,C++代码使用上面的方法重编译本地代码,生成在Intel平台的动态库即可。如果本地代码中还调用了第三方的动态库,则第三方动态库也需要重编译一个x86平台的版本。如果包含了汇编等和硬件平台紧密相关的代码,这部分代码需要重新编写。

 

本地代码开发注意点

强制内存对齐

由于平台差异,如果不进行强制内存对齐,在其他平台设备中将数据写入一个文件,在x86平台去加载会出现大小不一致导致加载出错的情况。如下面一个结构图 testStruct:

 struct TestStruct
{
    int mVar1;
    long long mVar2;
    int mVar3;
};

在ARM平台和Intel平台编译后,大小如下图:ARM平台会自动采用double malign的方式,占用24个字节,而x86平台占用16个字节。

 

如果我们编译时添加强制对齐参数:-malign-double 则占用相同大小的字节,不会出现加载出错的情况。

 

将NEON 指令集(ARM*) 移植至SSE 指令集(英特尔)

汇编代码部分需要注意平台差异,比如大字节序和小字节序存储问题;

对于寄存器的操作,需要注意对应寄存器的大小限制,具体可以查表;

NEON指令集提供了一些本地的C库,这部分代码虽然是C代码,但是在英特尔® 凌动TM平台是不能运行的,需要重新编写。

通用新能优化

在本地代码编写阶段,尽可能将短小的经常调用的函数写成内联函数,可以减少函数调用的开销。使用float数据类型来代替double可以充分使用Atom硬件浮点数预算的功能。多线程编程来充分利用英特尔® 凌动TM 芯片的超线程性能。关于多线程编程可以参考:: http://www.intel.com/content/www/us/en/architecture-and-technology/hyper-threading/hyper-threading-technology.html

在编译阶段可以通过添加合适的Gcc编译参数来优化NDK应用程序。在Atom平台,可以添加

-march=atom

选项来指定平台。也可以添加特定的指令集,如:

-msse4

关于编译器参数可以参考:http://gcc.gnu.org/onlinedocs/gcc/i386-and-x86_002d64-Options.html

总结

1. 大多数的Android* 应用可以直接在英特尔平台运行

•²  NDK应用需要重编译本地代码

•²  平台(ARM*, IA) 相关的汇编代码需要进行移植

2. 充分使用英特尔平台特性可以提升应用程序的性能;

3. 添加平台相关的编译器参数可以让GCC编译出的代码更加高效。

声明

* 文中涉及的其它名称及商标属于各自所有者资产。

版权所有 © 2011 英特尔公司。保留所有权利。

英特尔、Intel、凌动和 Atom 是英特尔公司在美国和其他国家(地区)的商标。

本文所提供之信息均与英特尔产品相关。本文不代表英特尔公司或其它机构向任何人明确或隐含地授予任何知识产权。除相关产品的英特尔销售条款与条件中列明之担保条件以外,英特尔公司不对销售和/或使用英特尔产品做出任何其它明确或隐含的担保,包括对适用于特定用途、适销性,或不侵犯任何专利、版权或其它知识产权的担保。

除非经英特尔书面同意,英特尔产品并非设计或有意用于任何英特尔产品故障可能会引起人身伤亡事故的应用领域。

英特尔可以随时在不发布声明的情况下修改规格和产品说明。设计者不得依赖于带有"保留"或"未定义"的任何特性或说明。英特尔保留今后对其定义的权利,对于因今后对其进行修改所产生的冲突或不兼容性概不负责。此处信息可能随时更改,恕不另行通知。请勿使用本信息来对某个设计做出最终决定。

文中所述产品可能包含设计缺陷或错误,已在勘误表中注明,这可能会使产品偏离已经发布的技术规范。英特尔提供最新的勘误表备索。

订购产品前,请联系您当地的英特尔销售办事处或分销商了解最新技术规范。

如欲获得本文或其它英特尔文献中提及的带订单编号的文档副本,可致电 1-800-548-4725,或访问:http://www.intel.com/design/literature.htm

 

For more complete information about compiler optimizations, see our Optimization Notice.