Android系列之AnBetter工作室Word格式文档下载.docx
《Android系列之AnBetter工作室Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《Android系列之AnBetter工作室Word格式文档下载.docx(8页珍藏版)》请在冰豆网上搜索。
程序的执行效率上去,开发速度就下去了。
如何解决二者的忙着,请听《如何成为Android高手》一文想大家娓娓道来。
5,学会至少一门服务器端开发技术:
没搞错吧,成为Android高手还需要学习服务端开发技术?
对,需要!
《如何成为Android高手》一文就该问题和大家进行了分享。
“蜀之鄙,有二僧:
其一贫,其一富。
贫者语于富者曰:
"
吾欲之南海,何如?
富者曰:
子何恃而往?
曰:
吾一瓶一钵足矣。
吾数年来欲买舟而下,犹未能也。
子何恃而往!
越明年,贫者自南海还,以告富者,富者有惭色。
西蜀之去南海,不知几千里也,僧富者不能至,而贫者至之,人之立志,顾不如蜀鄙之僧哉”
Android一出生就被打上了富二代的胎记,不仅仅是因为诞生于当今的网络霸主Google,更主要还有一个空前强大和壮观的开放手机联盟OHA(OpenHandsetAlliance)提供全力的支持。
OHA是什么?
OHA涵盖了中国移动、T-Mobile、Sprint等移动运营商,包括HTC、Motolora、三星等手机制造商,有Google为代表的手机软件商,还有Inter、Nvidia为标志的底层硬件厂商和AstonishingTribe等商业运作公司,该组织声称组织的所有成员都会基于Android来开发新的手机业务。
但是,要成为Android高手并不是一件容易的事情。
并不是很多人想象的能够飞快的写出几行漂亮的代码去解决一些困难的问题就是Android高手了。
真正的Android高手需要考虑的问题远远不是写些漂亮的代码就足够的。
下面是成为一名真正的Android高手必须掌握和遵循的一些准则:
1,学会懒惰
2,精通Android体系架构、MVC、常见的设计模式、控制反转(IoC)
3,编写可重用、可扩展、可维护、灵活性高的代码
4,高效的编写高效的代码
5,学会至少一门服务器端开发技术
一:
学会懒惰
没搞错吧?
竟然让程序开发人员学会懒惰?
程序开发人员可能是世界上最为忙碌的一类人啦!
对,没错,学会懒惰!
正因为程序开发人员忙碌,正因为程序开发
人
员可能会在客户无限变化的需求之下没日没夜的加班,所以要学会懒惰,这样,你就可以把更多的时间浪费在美好的事物身上!
如何懒惰:
1,Don'
tReinventtheWheel(不要重复发明轮子)。
2,InventingtheWheel(发明轮子)。
“轮子理论”,也即“不要重复发明轮子”,这是西方国家的一句谚语,原话是:
Don'
tReinventtheWheel。
“不要重复发明轮子”意思是企业中任何一项工作实际上都有人做过,我们所需要做的就是找到做过这件事情的人。
拿到软件领域中就是指有的项目或功能,别人已经做过,我们需要用的时候,直接拿来用即可,而不要重新制造。
Android号称是首个为移动终端打造的真正开放和完整的移动软件。
Android发布后不久Google公司就发布了操作系统核心(Kernel)与部分驱动程序的源代码,到目前位置除了GoogleMap等Google公司的核心组件没有开放源代码外,Android基本完成了完全的开源,这就极大的促进了Android的普及和移植。
受到Android开放行为和开源精神的影响,在世界各地,有成千上万的程序员喜欢和别人分享自己的聪明才智和自己编写的代码。
你可以在Google的Android讨论组或者Google搜索引擎上搜索到很多优秀的程序代码。
这样做并不是鼓励大家整天等着让别人为你编写代码,而是你可以“站在伟人的肩膀上”,充分发扬“拿来主义”,聪明地应用别人的程序代码可以节省你大量的时间
发明轮子?
不错,发明轮子!
我们不仅要发明轮子,更要成为努力成为世界上发明轮子的主导力量,唯有这样,才能谈的上中华名族软件大业的真正强大。
在Android,要发明轮子,就是我们要主动的是解决一些世界上他人未解决的难题或者创造新的编程框架或者对Android进行深度的改造以适合自己的业务发展需要。
Google发布了Android后不久,中国移动便投入了大量的人力和物力,在Android的基础上创建融入自己业务并开发、封装了新的功能的和框架的OMS,这是Android中发明轮子的一个非常重要的例子。
可能你会说,这发明轮子也太难了吧,别急,我们慢慢来,开发一个框架特定领域的框架吧!
你可能会一脸无辜的说,开发一个框架是说的那么容易吗?
当然不是啦。
但是也并非不可能,首先,我们分析一下框架的魅力的源泉,看看Spring、Struts等JavaEE框架,在看看.NET框架,当然也可以看看发展的如火如荼、层出不穷的PHP框架,她们的强大和魅力的源泉都在于:
IoC(InversionofControl)。
tcallus,we'
llcallyou(别找我,我会来找你的)。
二:
精通Android体系架构、MVC、常见的设计模式、控制反转(IoC)
1,请看某个著名的IT公司一则招聘信息的其中一条要求:
“熟悉Android系统架构及相关技术,1年以上实际Android平台开发经验;
”,里面非常明确的说道要求熟练Android系统架构,这从某种程度上说明了对Android体系架构的理解的重要性。
LinuxKernel:
负责硬件的驱动程序、网络、电源、系统安全以及内存管理等功能。
Libraries和AndroidRuntime:
Libraries:
即C/C++函数库部分,大多数都是开放源代码的函数库,例如WebKit,该函数库负责Android网页浏览器的运行,例如标准的C函数库Libc、OpenSSL、SQLite等,当然也包括支持游戏开发2DSGL和3DOpenGL|ES,在多媒体方面有MediaFramework框架来支持各种影音和图形文件的播放与显示,例如MPEG4、H.264、MP3、AAC、AMR、JPG和PNG等众多的多媒体文件格式。
Android的Runtime负责解释和执行生成的Dalvik格式的字节码。
ApplicationFramework(应用软件架构),Java应用程序开发人员主要是使用该层封装好的API进行快速开发。
Applications:
该层是Java的应用程序层,Android内置的GoogleMaps、E-mail、即时通信工具、浏览器、MP3播放器等处于该层,Java开发人员开发的程序也处于该层,而且和内置的应用程序具有平等的位置,可以调用内置的应用程序,也可以替换内置的应用程序。
上面的四个层次,下层为上层服务,上层需要下层的支持,调用下层的服务,这种严格分层的方式带来的极大的稳定性、灵活性和可扩展性,使得不同层的开发人员可以按照规范专心特定层的开发。
Android应用程序使用框架的API并在框架下运行,这就带来了程序开发的高度一致性,另一方面也告诉我们,要想写出优质高效的程序就必须对整个ApplicationFramework进行非常深入的理解。
精通ApplicationFramework,你就可以真正的理解Android的设计和运行机制,也就更能够驾驭整个应用层的开发。
Android系列之如何成为Android编程高手第二篇
2010-08-0808:
49by$等待$,1496visits,网摘,收藏,编辑
三:
编写可重用、可扩展、可维护、灵活性高的代码
Android应用程序的开发是使用Java编写,在架构上使用MVC,鼓励组件之间的若耦合。
开发出编写可重用、可扩展、可维护、灵活性高的代码需要经历遵循以下原则:
l"
开-闭"
原则(OCP):
一个软件实体应当对扩展开放,对修改关闭。
这个原则说的是,在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展。
换言之,应当可以在不必修改源代码的情况下改变这个模块的行为。
l里氏代换原则(LSP):
一个软件实体如果使用的是一个基类的话,那么一定使用于其子类,而且它根本不能察觉出基类对象和子类对象的区别。
l依赖倒转原则(DIP):
要依赖于抽象,不要依赖于具体。
l接口隔离原则(ISP):
使用多个专门的接口比使用单一的总接口要好。
一个类对另外一个类的依赖性应当是建立在最小的接口上的。
l合成/聚合复用原则(CARP):
又称合成复用原则(CRP),就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;
新的对象通过向这些对象的委派达到复用已有功能的目的。
简而言之就是:
要尽量使用合成/聚合,尽量不要使用继承。
l迪米特法则(LoD):
又称最少知识原则(LKP),就是说一个对象应当对其他对象尽可能少的了解。
狭义的迪米特法则是指如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用.如果其中一个类需要调用另一个类的方法的话,可以通过第三者转发这个调用.。
广义的迪米特法则是指一个模块设计得好坏的一个重要的标志就是该模块在多大的程度上将自己的内部数据与实现有关的细节隐藏起来。
信息的隐藏非常重要的原因在于,它可以使各个子系统之间脱耦,从而允许它们独立地被开发,优化,使用阅读以及修改.。
灵活的使用设计模式可以在面对千变万化的业务需求是编写出可重用、可扩展、可维护、灵活性高的代码。
当然,由于Android是运行在移动设备上的,而移动设备的处理能力是有限的,所以有时间必须在编写可重用、可扩展、可维护、灵活性高的代码与高效的代码之间做出适当的平衡。
四:
高效的编写高效的代码
高效快速的编写代码和编写高效率执行的代码很多时候都是对立的死敌,很多时候,你想快速的开发,代码的执行效率往往就会慢下来;
你想编写高效的代码,开发速度就会慢下来。
不重复发明轮子和发明新的轮子是高效的编写高效的代码的正确是道路。
关于高效的代码,下面网络的一篇文章,直接转载(不知道是哪位哥们写的)如下:
“现代的手持设备,与其说是电话,更像一台拿在手中的电脑。
但是,即使是“最快”的手持设备,其性能也赶不上一台普通的台式电脑。
这就是为什么我们在书写Android应用程序的时候要格外关注效率。
这些设备并没有那么快,并且受电池电量的制约。
这意味着,设备没有更多的能力,我们必须把程序写的尽量有效。
本文讨论了很多能让开发者使他们的程序运行更有效的方法,遵照这些方法,你可以使你的程序发挥最大的效力。
对于占用资源的系统,有两条基本原则:
1.不要做不必要的事
2.不要分配不必要的内存
所有下面的内容都遵照这两个原则。
有些人可能马上会跳出来,把本节的大部分内容归于“草率的优化”(xing:
参见[TheRootofAllEvil]),不可否认微优化(micro-optimization。
xing:
代码优化,相对于结构优化)的确会带来很多问题,诸如无法使用更有效的数据结构和算法。
但是在手持设备上,你别无选择。
假如你认为Android虚拟机的性能与台式机相当,你的程序很有可能一开始就占用了系统的全部内存(xing:
内存很小),这会让你的程序慢得像蜗牛一样,更遑论做其他的操作了。
Android的成功依赖于你的程序提供的用户体验。
而这种用户体验,部分依赖于你的程序是响应快速而灵活的,还是响应缓慢而僵化的。
因为所有的程序都运行在同一个设备之上,都在一起,这就如果在同一条路上行驶的汽车。
而这篇文档就相当于你在取得驾照之前必须要学习的交通规则。
如果大家都按照这些规则去做,驾驶就会很顺畅,但是如果你不这样做,你可能会车毁人亡。
这就是为什么这些原则十分重要。
当我们开门见山、直击主题之前,还必须要提醒大家一点:
不管VM是否支持实时(JIT)编译器(xing:
它允许实时地将Java解释型程序自动编译成本机机器语言,以使程序执行的速度更快。
有些JVM包含JIT编译器。
),下面提到的这些原则都是成立的。
假如我们有目标完全相同的两个方法,在解释执行时foo()比bar()快,那么编译之后,foo()依然会比bar()快。
所以不要寄希望于编译器可以拯救你的程序。
Android开发——android调试工具集【转】
2010-08-1109:
54byHalZhang,272visits,网摘,收藏,编辑
1.查看当前堆栈
1)功能:
在程序中加入代码,使可以在logcat中看到打印出的当前函数调用关系
2)方法:
newException(“printtrace”).printStackTrace();
2.MethodTracing
用于热点分析和性能优化,分析每个函数占用的CPU时间,调用次数,函数调用关系等
a)在程序代码中加入追踪开关
1:
importandroid.os.Debug;
2:
……
3:
android.os.Debug.startMethodTracing(“/data/tmp/test”);
//先建/data/tmp目录
4:
……//被追踪的程序段
5:
android.os.Debug.stopMethodTracing();
b)编译,运行后,设备端生成/data/tmp/test.trace文件
c)把trace文件复制到PC端
$adbpull/data/tmp/test.trace./
d)使用android自带工具分析trace文件
$$ANDROID_SRC/out/host/linux-x86/bin/traceviewtest.trace
此时可看到各个函数被调用的次数CPU占用率等信息
e)使用android自带工具分析生成调用关系类图
$apt-getinstallgraphviz#安装图片相关软件
$ANDROID_SRC/out/host/linux-x86/bin/dmtracedump-gtest.pngtest.trace
此时目录下生成类图test.png
3)注意
trace文件生成与libdvm模块DEBUG版本相冲突,所以此方法只适用于对非DEBUG版本模拟器的调试,否则在分析trace文件时会报错
3.HProf(HeapProfile)
用于java层面的内存分析,显示详细的内存占用信息,指出可疑的内存泄漏对象
a)在代码中加入dump动作
importjava.io.IOException;
try{
android.os.Debug.dumpHprofData(“/data/tmp/input.hprof”);
6:
}catch(IOExceptionioe){
7:
}
b)把hprof文件复制到PC端
$adbpull/data/tmp/input.hprof./
c)使用命令hprof-conv把hprof转成MAT识别的标准的hprof
$$ANDROID_SRC/out/host/linux-x86/bin/hprof-convinput.hprofoutput.hprof
d)使用MAT工具看hprof信息
下载MAT工具:
http:
//www.eclipse.org/mat/downloads.php
用工具打开output.hprof
3)注意:
此工具只能显示java层面的,而不能显示C层的内存占用信息
4.SamplingProfile(android2.0上版本使用)
1)功能
每隔N毫秒对当前正在运行的函数取样,并输出到log中
2)在代码中加入取样设定
importdalvik.system.SamplingProfiler
SamplingProfilesp=SamplingProfiler.getInstance();
sp.start(n);
//n为设定每秒采样次数
sp.logSnapshot(sp.snapshot());
sp.shutDown();
它会启一个线程监测,在logcat中打印信息
5.用发系统信号的方式取当前堆栈情况和内存信息
1)原理
dalvik虚拟机对SIGQUIT和SIGUSR1信号进行处理(dalvik/vm/SignalCatcher.c),分别完成取当前堆栈和取当前内存情况的功能
2)用法
a)$chmod777/data/anr-R#把anr目录权限设为可写
$rm/data/anr/traces.txt#删除之前的trace信息
$ps#找到进程号
$kill-3进程号#发送SIGQUIT信号给该进程,此时生成trace信息
$cat/data/anr/traces.txt
功能实现:
遍历threadlist(dalvik/vm/Thread.c:
dvmDumpAllThreadEx()),并打印当前函数调用关系(dalvik/vm/interp/Stack.c:
dumpFrames())
b)$chmod777/data/misc-R
$kill-10进程号#发送SIGQUIT信事信号给该进程,此时生成hprof信息
$ls/data/misc/*.hprof
此时生成hprf文件,如何使用此文件,见第二部分(HProf)
注意:
hprof文件都很大,注意用完马上删除,以免占满存储器
6.logcat及原理
1)android.util.Log利用println的标准java输出词句,并加前缀I/V/D….
2)dalvik利用管道加线程的方式,先利用dup2把stdout和stderr重定向到管理中(vm/StdioConverter.c:
dvmstdioConverterStartup),然后再启动一个线程从管道另一端读出内容(dalvik/vm/StdioConverter.c:
stdioconverterThreadStart()),使用LOG公共工具(system/core/liblog/logd_write.c:
__android_log_print())输出到/dev/log/*中去
3)logcat通过加不同参数看/dev/log/下的不同输入信息
#logcat-bmain显示主缓冲区中的信息
#logcat-bradio显示无线缓冲区中的信息
#logcat-bevents显示事件缓冲区中的信息
7.jdwp(javadebugwireprotocol)及原理
1)虚拟机(设备端)在启动时加载了AgentJDWP从而具备了调试功能。
在调试器端(PC端)通过JDWP协议与设备连接,通过发送命令来获取的状态和控制Java程序的执行。
JDWP是通过命令(command)和回复(reply)进行通信的。
2)JDK中调试工具jdb就是一个调试器,DDMS也提供调试器与设备相连。
3)dalvik为JDWP提供了两种连接方式:
tcp方式和adb方式,tcp方式可以手工指定端口,adb方式自动设定为8700端口,通常使用DDMS调试就是通过adb方式
8.monkey
1)monkey是一个android自带的命令行工具。
它向系统发送伪随机的用户事件流,实现对正在开发的应用程序进行压力测试。
2)方法
在设备端打开setting界面
$adbshell
#monkey-pcom.android.settings-v500
此时可以看到界面不断被切换
9.其它小工具
具体见android.os.Debug中提供的工具
1)取毫微秒级的时间,用于计算时间
threadCpuTimeNanos()
2)统计两点间的内存分配情况
startAllocCounting()
stopAllocCounting()
getGlobalAllocCount()
get…..
3)打印当前已load的class
getLoadedClassCount()
printLoadedClasses()它需要打开NDEBUG功能才能打开system/core/中Log功能
10.打印debug信息
$adbbugreport
11.参考
1)android中monkey的用法
转自: