薛李滨,潘 瑜
(1.江苏理工学院 计算机工程学院,江苏 常州 213001;2.青海师范大学 计算机学院,青海 西宁 810000)
随着智能手机平台发展的日新月异,Android[1]平台操作系统以其开源,实用,功能强大等优点,与IOS[2]形成了智能手机市场两分天下的局面,与IOS相比,Android操作系统的用户视觉流畅性较差,安全性也有待提高,为解决这些现象,就需要对其平台进行一定的优化,提高其运行效率,改善用户性能。采用简洁高效的系统软件集成方式,才能改善Android平台的流畅性和安全性的同时,提高其视觉效果和操作系统的市场核心竞争力。
Android系统的程序架构主要分为四个层次构成[3]。Linux[4]核心部件位于最低层,为上层部件提供服务,底层的上一层是运行时层,包括依赖Linux内核实现线程管理的虚拟机Dalvik和使用C++构建的系统函数库组件。再向上一层是中间层,包括各种系统管理者类和系统服务,以供应用程序调用,从而透明化硬件平台,简化开发难度。最上层便是用户可见的应用层了,包含通话,通讯录,浏览器等手机常见的实用程序。
搭建Android开发环境,需要在已安装JDK的环境下进行具体步骤为:首先,使用JDK6[5]作为Java的运行环境[6]。在系统环境变量[7]中添加三个变量PATH,JAVA_HOME与CLASSPATH,我们使用E-clipse 3.7.0版本,直接解压即可使用。其次,进入SDK管理界面,运行SDK Manager.exe选择需要的SDK版本并安装,再次,找到Eclipse IDE的帮助菜单的安装更新软件菜单项,添加Android SDK路径,安装Android开发环境下的Eclipse IDE[8]所需的插件ADT。最后,在Eclipse菜单栏中点击[新建],选择AVD的容量、型号、分辨率类型等,创建AVD模拟器完成后,即完成了对整个Android开发环境的搭建。
为了提高Android平台视觉流畅性,必须从根本上提高Android平台的运行效率,我们将AES算法应用于Android操作系统,并进行改进,最后根据实验来对改进前后的效果进行对比。
AES是密码学中的高级加密标准,AES采用固定的128bit长度的区块,密钥采用128,192或256bit,其计算大多数是在一个特别的有限域完成的,其加密过程为:将一个4行4列的矩阵中的元素对应到明文区块中的一个字节,即可初始化明文。进行多轮加密时,先将矩阵体每一个字节都与本轮回合密钥进行异或运算,按照密钥方案产生每个子密钥,再通过非线性替换法,把每个字节查表替换成对应的字节,将矩阵中每行循环移位,再将每列用线性转换的方式混合。加密循环的最终一轮应省略列混合。
对于AES算法的优化截至目前主要从提高算法的效率,在不同平台实现算法以及利用密钥扩展或S盒优化算法提高系统的安全性三方面入手。为了提高Android平台的视觉流畅性,这里我们从提高AES算法的加解密速率入手来实现算法的优化,并将其在Android平台实现。
AES分组密码算法具有两个显著特点:一是输入、输出分组及加解密过程的中间分组采用的都是128 bit。二是加密与解密的过程是不对称的,解密过程是先进行行移位运算,然后字节代换,轮密钥,最终列混淆。因此AES-128加密标准的解密速度远远高于加密速度,为了提高加密速度,我们可以提高对轮变换速率影响最大的列混合运算的效率来优化加密的过程。
列混合变换将在模x4+1下将给定多项式03x3+01x2+01x与状态列多项式(F82)相乘,因多项式与模互素,因此过程是可逆的。我们可以对混合列调用xtime函数变换进行算法改进,将多项式xA(x)=通过模简化与模按位与运算,例如:计算
(56)*(11)=(fe),(56)=(1010110);(56)*(02)=xtime(56)=(1010110)=(ae);
(56)*(04)=xtime(4e);(56)*(04)=xtime(8e);
故(56)*(11)=(56)*{(01)⊕(10)}=(56)⊕(56)*(10)⊕(56)=(56)⊕(ae)⊕(06)=(fe);
因此对混合列进行xtime优化改进的方法为:
图1 算法改进前后效率对比图
(1)将4列进行异或操作得到值u;
(2)选取第二列单独与第1,3,4列进行异或操作并赋值给v,调用xtime函数使得v=xtime(v);
(3)得到 a[0]=a[0]⊕ v ⊕ u,a[1]=a[1]⊕ v ⊕ u,a[2]=a[2]⊕ v ⊕ uv=a[3]⊕ u;
再将列混合后的元组按行MixColumns矩阵运算后,即可得到新元组。通过OpenSSL0.9.7版本测试后,AES-128加密算法改进前后效率对比如图1所示。通过图1可以看出,改进后的算法明显比改进前效率有大幅度提高。
完成了对Android平台算法效率的优化之后,我们以应用层的一个手机安全防御系统来展现对Android平台系统的集成。
一个集成的系统,其应用程序可能有几万行代码,上百个源程序,所以对源程序按照包名的方式来组织项目的结构就显得必要,而采用MVC的方式进行组织是最简洁的方式之一,最内层是网络层,即通过net层的Service服务或Provider内容提供者为中间层提供数据;中间层是通过engine传递给数据适配器;界面层通过list view控件接收从数据适配器传来的数据,利用activity组件来进行界面ui层的展现。
由上述业务逻辑可以清晰的将包结构按照层次分为3类:
网络层包的种类及命名方式:服务包*.service,网络包*.net,内容提供者包*.Provider,和工具包* .Util。
(2)中间层包的种类及命名方式:数据适配器包*.adapter,数据库存储访问包*.db.dao,系统提供数据包* .Engine。
(3)界面层包的种类及命名方式:activity相关界面包*.ui,自定义的view对象包*.ui.stub。
有效的组织好系统包结构之后,第一步要实现的是欢迎窗体,实现方法为:首先新建splash.xml文件,定义欢迎窗体的图片,设置图片的颜色,宽度,高度及系统的版本号等信息;其次,取消掉标题栏,得到将当前的窗体并传入系统全屏参数将其全屏显示,获取应用程序的包名信息及版本号;最后,获得最外层的splashMain组件,设置该组件的动画时间,为欢迎窗体添加动画效果。完成后的欢迎窗体渐变动画效果如图2所示。
图2 欢迎窗体渐变效果图
欢迎窗体进入主界面前,用户应当能够自动更新服务器配置,以便在联网时能够即时得到服务器端最新的系统版本。此过程为:链接服务器,获取系统最新的版本号,判断是否需要更新,若不更新,直接进入主界面。若需要更新则按照用户的需要选择是否更新。其流程图如图3所示。
其业务逻辑的具体实现过程为:首先配置新版本号,新版本的下载路径,描述等更新信息的xml配置文件;其次,创建数据层engine包及domin包,连接服务器,得到服务器文件返回的更新信息的数据流。最后,设置判断是否需要更新升级的方法,对升级与否的结果进行判断后进入相对应版本的主界面。实现后的界面效果如图4所示。其中连接服务器获取更新的核心代码如下:
图3 获取服务器更新配置流程图
图4 升级功能效果图
在完成了获取版本更新配置的功能之后,整个系统将需集成小功能按照网格的形式排列集合起来,因此,我们首先创建配置主屏幕宽度,高度,背景色及行列数等布局信息的xml文件,初始化程序主窗体。其次,创建适配器,定义相同的文字,图标,位置,内容等信息,并在其中得到窗体布局文件的view对象。最后初始化已配置的适配器,在ui层的Activity类中得到适配器中的布局信息。程序主界面布局集成后的效果如图5所示。
图5 系统布局集成主界面
此部分的业务逻辑中主界面类的核心业务代码如下:
在完成了对系统界面的布局集成之后,便可轻松的对其进行某个小功能添加按钮的点击事件,进行此功能模块的开发,将所有小功能实现后,整个系统便整体实现集成了。
本文搭建了Android的开发环境,分析了Android系统平台的结构,进而对Android编译器进行了优化,并以一个移动手机安全防御系统为例,介绍了一种系统集成的方式,并阐述了简化的方法,降低了应用层的冗余度,提高了效率。
[1]胡世良.移动互联网:赢在下一个十年的起点[M].北京:人民邮电出版社,2012:11-15.
[2]潘轶华,刘勇波,王智微,等.苹果iOS技术在发电企业中的应用和研究[J].电力信息化,2011,9(9):66-71.
[3]刘鎏.Android的架构与应用开发分析[J].信息技术应用研究,2011(14):46-47.
[4]Robert L.Linux内核设计与实现[M].陈莉君,唐华译.北京:机械工业出版社,2011.
[5]埃克尔.Java编程思想[M].陈昊鹏译.北京:机械工业出版社,2007.
[6]张永强,王爱民.Java程序设计应用教程[M].北京:电子工业出版社,2007:7-9.
[7]梁立新,郭锐.Java核心技术应用开发[M].北京:电子工业出版社,2010.
[8]李松林,陈华清,任鑫.Eclipse宝典[M].北京:电子工业出版社,2007.