Android培训班
caimouse
在IT行业有20多年的经验。拥有20多年的C和C++开发经验,5年以上Python开发经验,资深数据库开发、上百G数据库优化经验。曾经任职嵌入式工程师、P2P开发工程师、银行信用卡交易系统工程师、全自动化电池测试部门经理。
展开
-
Android培训班(43)
<br /> <!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } A:link { so-language: zxx } --><br />arity-1.3.3.jar文件是一个针对计算表达式处理的库,主要内容是编译原理的相关部份,比如词法分析/语法分析,计算表达式等等。它的源码在网址:http://code.google.com/p/arity/。<br /> <br /> <br />res目录是原创 2011-03-27 10:29:00 · 2918 阅读 · 0 评论 -
Android培训班(48)
<br /><br />在android的计算器应用程序里,源程序主要放在目录src目录下面,然后在这个目录根据包的名称进行子目录排列,由于这个程序在XML里包名称如下:<br />package="com.android.calculator2"<br />因此,它的目录就是这样排列的:<br />src<br />|<br />---com<br />|<br />---android<br />|<br />--- calculator2<br />所有java的代码都在目录calculator2下面原创 2011-05-22 10:26:00 · 3395 阅读 · 0 评论 -
Android培训班(49)
<br /><br />接着下来,打开这个文件Calculator.java,查看它的源码,如下:<br />/*<br />*Copyright (C) 2008 The Android Open Source Project<br />*<br />*Licensed under the Apache License, Version 2.0 (the "License");<br />*you may not use this file except in compliance with原创 2011-05-29 10:19:00 · 3529 阅读 · 0 评论 -
Android培训班(44)
<br /> <!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --><br />layout-land和layout-port目录主要用来保存应用程序的界面布局的文件。layout-land是android应用程序界面横屏显示的布局设置;layout-port是android应用程序界面竖屏显示的布局设置。由于这两种显示,导致应用程序的显示比例不一样,因此应用程序需要根据不同的比例进行重新布局,不能简单地原创 2011-04-10 19:24:00 · 3102 阅读 · 0 评论 -
Android培训班(50)
publicclass Calculator extends Activity {这行代码定义计算器类Calculator是继承Activity类。这是计算器主要管理类,从前面的XML资源里,就知道Calculator类是第一个运行的类,是运行代码的入口点。 下面开始创建和定义使用的变量和常量。 EventListener mListener = new原创 2011-06-04 20:05:00 · 3564 阅读 · 0 评论 -
Android培训班(51)
接着来修改一下资源,看看是否可以显示出来?通过如下步骤进处:1)找到目录Android-2.0/packages/apps/Calculator/res/values-zh-rCH2)打开资源文件strings.xml。3)找到“清除历史记录”,把它改为“删除历史记录”,如下图: 4)进入终端里编译,如下:tony@tony-desktop:~/android/Andr原创 2011-06-05 08:28:00 · 3838 阅读 · 0 评论 -
Android培训班(52)
应用程序编译过程:1)资源文件编译像资源文件xml、图片等文件,需要通过aapt工具来编译,生成资源文件表“resources.arsc”和资源关系文件“R.java”,JAVA编译器连接代码里使用的资源时,就是通过R.java来实现,同时aapt工具还负责把所有资源生成二进制文件,以应用程序运行时方便访问。 2)java源码编译所有java源码是通过javac来编译,并跟原创 2011-06-06 20:59:00 · 3061 阅读 · 0 评论 -
Android培训班(45)
<br /> <!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } A:link { so-language: zxx } --><br />帧布局(FrameLayout)方式是每次显示时都把屏幕当作一个整体的显示屏,并且是从左上角开始画起。不过这种方式有一个叫做显示顺序的问题,也就是最先显示层,一定是在最底层,最后显示的,就在最后一层。如果每一层都在左上角上留一下空位,就像Windows系统里的层叠的原创 2011-04-17 12:52:00 · 2951 阅读 · 0 评论 -
Android培训班(53)
<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } A:link { so-language: zxx } -->Calculator.apk内容为什么叫apk呢?其实apk是AndroidPackage的缩写,意思就是android安装包。在Linux的目录下,可以查看Calc原创 2011-06-12 14:45:00 · 3750 阅读 · 1 评论 -
Android培训班(46)
<br /> <!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } A:link { so-language: zxx } --><br />在目录res/values里,主要包括界面缺省的资源。比如从前面XML里看到下面这行:<br />android:text="@string/clear"<br />这行是指明显示的字符串,但真正要在界面上显示的字符串并不是“@string/clear”,这里仅是指原创 2011-04-24 09:52:00 · 2797 阅读 · 2 评论 -
Android培训班(54)虚拟机的历史
<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } A:link { so-language: zxx } -->虚拟机的英文名称是VirtualMachine,简称为VM。通过这个名称就可知虚拟机是假的,不真实的机器,当然是与硬件的机器相比。比较科学的理解是这样:指通过软件模拟的具有完原创 2011-06-16 21:15:00 · 3521 阅读 · 0 评论 -
Android培训班(56)Dalvik虚拟机的入口点
<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } -->要分析Dalvik虚拟机的代码,到底从那里开始比较好呢?从事软件开发人员都知道,每个程序都有生命周期,都有出生点,也就是程序的进入位置。像C语言里控制台程序是使用main函数作为入口点的,java程序也是使用main函数作为入口点。其实Da原创 2011-06-19 18:13:00 · 5129 阅读 · 0 评论 -
Android培训班(55)Dalvik虚拟机的目录结构
<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } -->为了挖掘Dalvik虚拟机的秘密,需要仔细分析Dalvik的每一个目录,每一个文件,才能把它的细节了然于胸。下面就开始吧! Android.mk 这个文件是虚拟机编译的makefile文件。 dalvik原创 2011-06-18 21:31:00 · 5246 阅读 · 1 评论 -
Android培训班(47)
<br /> <!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } A:link { so-language: zxx } --><br />在资源的目录res/values-zh-rCN,从目录的名称就可以看到这个是保存跟中文相关的资源的目录。现在来仔细地查看这个目录的文件strings.xml,内容如下:<br /><?xmlversion="1.0" encoding="UTF-8"?><b原创 2011-04-30 11:52:00 · 4911 阅读 · 0 评论 -
Android培训班(57)Dalvik虚拟机运行ZygoteInit类
<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } -->从上一节可以知道Dalvik虚拟机入口点和创建虚拟机的函数,这一节继续分析运行时类调用虚拟机的代码片段,需要搞清楚怎么样运行JAVA的ZygoteInit类,Dalvik虚拟机又提供什么样的接口调用。运行时类代码如下:/*start原创 2011-06-27 21:43:00 · 3690 阅读 · 0 评论 -
Android培训班(58)Dalvik虚拟机的JNI方法和类表示
<!--@page {margin:2cm}p {margin-bottom:0.21cm}td p {margin-bottom:0cm}th p {margin-bottom:0cm}pre.western {font-family:"DejaVu Sans Mono",monospace}pre.cjk {font-family:"原创 2011-07-02 23:02:11 · 3348 阅读 · 0 评论 -
Android培训班(59)Dalvik虚拟机的指令格式
<!--@page {margin:2cm}td p {margin-bottom:0cm}p {margin-bottom:0.21cm}-->在分析Dalvik虚拟机运行之前,先要了解Davlik指令,但是了解Davlik指令之前又原创 2011-07-10 10:00:14 · 3485 阅读 · 0 评论 -
Android培训班(63)dex文件格式4
<!--@page {margin:2cm}td p {margin-bottom:0cm}p {margin-bottom:0.21cm}-->map_off字段 这个字段主要保存map开始位置,就是从文件头开始到map出现的数据长度原创 2011-07-23 18:23:03 · 3930 阅读 · 0 评论 -
Android培训班(61)dex文件格式2
<!--@page {margin:2cm}p {margin-bottom:0.21cm}-->魔数字段,主要就是Dex文件的标识符,它占用4个字节,在目前的源码里是 “dex\n”,它的作用是用来区别其它文件的,比如有一个文件也叫Dex原创 2011-07-16 23:57:27 · 3744 阅读 · 0 评论 -
Android培训班(60)dex文件格式
<!--@page {margin:2cm}td p {margin-bottom:0cm}p {margin-bottom:0.21cm}-->在android系统里,通过复杂的编译过程,会把java源代码生成dex文件,然后在虚拟机原创 2011-07-15 23:18:29 · 4529 阅读 · 0 评论 -
Android培训班(62)dex文件格式3
SHA-1签名字段 从dex文件头里,已经看到前面有一个4字节的字段检验码了,那为什么又需要一个SHA-1签名字段呢? 这不是重复了吗?起初始看来,好像是有点重复,可是仔细考虑一下,这样设计,还是比较高明的。因为dex文件的大小,一般都不是很小,简单的应用程序都有几十K大小原创 2011-07-17 19:11:49 · 3817 阅读 · 0 评论 -
Android培训班(64)dex文件格式5
string_ids_size和string_ids_off字段 这两个字段主要用来访问字符串资源,由于源程序里编译后,程序所需要使用到的字符串都保存在这个数据段里,以便解释执行这个dex文件代码时使用。比如调用库函数里的类名称描述,输出显示给用户查看的字符串。string_原创 2011-07-31 08:07:36 · 4246 阅读 · 0 评论 -
Android培训班(65)dex文件打开
我们知道,要读取一个类代码,或读取类里的方法代码,都需要打开Dex文件,然后按前面介绍的格式去分析,并且读取出相应的内容,才可以给虚拟机进行解释执行。现在,我们就来学习和分析Dex文件的读取相关的代码。如下:/* *Open the specified file read-onl原创 2011-08-05 18:09:30 · 5850 阅读 · 4 评论 -
Android培训班(68)dex文件打开流程
在上面的函数里,提到使用dvmJarFileOpen函数找到classes.dex文件,并加载到内存里,然后提供后面的函数使用。现在就来分析这个函数的代码,如下:intdvmJarFileOpen(const char* fileName, const char* odexOut原创 2011-09-04 14:21:24 · 12331 阅读 · 0 评论 -
Android培训班(67)dex文件打开流程
从上面可知调用函数Dalvik_dalvik_system_DexFile_openDexFile来打开Dex文件,这个函数的源码如下:staticvoid Dalvik_dalvik_system_DexFile_openDexFile(const u4* args, JV原创 2011-09-03 21:46:51 · 8626 阅读 · 1 评论 -
Android培训班(69)Dex文件里类定义
当在虚拟机里加载Dex文件后,这个文件的数据已经读取到内存里,能不能马上使用呢?能不能使用里面的类呢?显然是不行的,因为那些加载到内存的数据,只是储存的格式,不具备运行的条件,因此需要调用方法defineClass来定义类,才可以运行在虚拟机里。所有Java编译后的类保存在Dex原创 2011-09-09 22:29:12 · 6338 阅读 · 0 评论 -
Android培训班(70)Dex文件里类定义dvmDefineClass
接着来分析函数dvmDefineClass,它的代码如下: ClassObject*dvmDefineClass(DvmDex*pDvmDex, constchar*descriptor, Object*classLoader) { 这个函数输入的参数有三个,第一个pDvm原创 2011-09-12 15:08:54 · 5414 阅读 · 0 评论 -
Android培训班(71)Dex文件里类定义dvmDefineClass
clazz= dvmLookupClass(descriptor, loader, true);if(clazz == NULL) { constDexClassDef*pClassDef;这段代码是调用函数dvmLookupClass在已经加载的类里查找是否已经存在原创 2011-09-18 11:00:58 · 4736 阅读 · 0 评论 -
Android培训班(66)dex文件打开流程
下面来分析这个函数代码,如下:intdexZipPrepArchive(int fd, const char* debugFileName, ZipArchive*pArchive){这个函数输入文件句柄、文件名称、压缩文件对象。 MemMapping map; int原创 2011-08-28 09:26:59 · 10122 阅读 · 0 评论 -
Android培训班(72)Dex文件里类定义dvmDefineClass
/*found a match, try to load it */ clazz =loadClassFromDex(pDvmDex, pClassDef, loader);这行代码是已经发现合适的类,并且找到相应的Dex文件时,就可以调用函数loadClassFro原创 2011-09-24 20:22:26 · 5104 阅读 · 0 评论 -
Android培训班(73)Dex文件里类定义dvmDefineClass
接着下来,来分析怎么样加载方法的代码,loadMethodFromDex函数的代码如下:staticvoidloadMethodFromDex(ClassObject*clazz, const DexMethod*pDexMethod, Method*meth){这个函数传入原创 2011-09-25 18:50:27 · 5299 阅读 · 0 评论 -
Android培训班(74)Dalvik虚拟机的FindClass函数
从前面我们知道,在虚拟机初始化后,运行Java代码的方法时,要先查找到类,也就是调用函数FindClass。接着后面分析怎么样从dex文件加载类数据到内存,现在开始对查找函数FindClass进行分析,就很好理解了,因为前面介绍加载类到内存的流程已经很清楚。函数FindClass原创 2011-10-06 11:04:40 · 7134 阅读 · 0 评论 -
Android培训班(75)Dalvik虚拟机的GetStaticMethodID函数
在Dalvik虚拟机启动时,曾经使用函数GetStaticMethodID获取静态函数main的ID,以便调用整个Java程序运行起来,那么这个函数怎么样从加载的类里查找到静态方法的ID呢?下面就来分析这个函数的代码,来回答这个问题。函数GetStaticMethodID调用JN原创 2011-10-08 21:34:44 · 9320 阅读 · 0 评论 -
Android培训班(76)Dalvik虚拟机的CallStaticVoidMethod函数
在前面两个函数的介绍里,已经找到要执行方法的类,要执行的方法ID,那么接着下来要做的事情,就是执行方法,其实就是解释Java程序的字节码。那么Davlik虚拟机是怎么样执行方法的代码呢?又是怎么样解释这些字节码指令呢?因此,就先来分析函数CallStaticVoidMethod的代码,直接拿这个函数名称在源程序里查找,是查找不到的,因为代码里并没有直接使用这个名称来声明函数,其实是使用宏来实现的,原创 2011-10-22 19:37:18 · 9809 阅读 · 0 评论 -
Android培训班(77)Dalvik虚拟机的dvmInterpretStd函数
通上面的学习,先初始化解释器的状态,然后调用解释器来执行方法。解释器又分为两种,一种是使用汇编写成性能优化的解释器,一种是使用标准C语言写成的解释器,可以很通用,理解起来也容易一些。接着下来,就先来理解C语言写成的解释器,函数dvmInterpretStd的代码如下:boolINTERP_FUNC_NAME(Thread* self,InterpState* interpState){这个函数输入原创 2011-10-23 09:36:12 · 4925 阅读 · 2 评论 -
Android培训班(81)Dalvik虚拟机的垃圾回收3
下面就来先看看Dalvik虚拟机整个标记和清除中使用到那些函数,在文件alloc/MarkSweep.h里有函数如下:1)调用函数dvmHeapBeginMarkStep来创建位图,并从对象位图里拷贝一份位图出来,以便后面对这个位图进行标记。2)调用函数dvmHeapMarkRootSet对所有根对象进行标记。3)调用函数dvmHeapScanMarkedObjects根据上一个函数给出的根对象位原创 2011-11-27 10:33:39 · 5638 阅读 · 0 评论 -
Android培训班(79)Dalvik虚拟机的垃圾回收1
垃圾回收技术已经出现很久了,可以追溯到20世纪60年代,在LISP语言中就开始进行应用,而后的Smalltalk,java,c#等语言更是一步一步地将其推向新的高潮。它广受技术专家的推崇,并被高度的评价,被认为是提高软件质量和生产力的一个有效的银弹,是一个具有革命性技术。由于计算机的内存资源总是有限的,为了不同的程序运行,必须把不需要使用的内存回收,以便重新使用。假如那一天计算机的内存足够大,可以原创 2011-11-06 13:20:58 · 5629 阅读 · 0 评论 -
Android培训班(78)Dalvik虚拟机的寄存器操作
在前面已经说到Dalvik虚拟机是基于寄存器运行的虚拟机,这是与JAVA虚拟机有本质上的区别,因为它是基于栈运行的虚拟机,因而Dalvik虚拟机运行的速度更快,更高效。下面就来分析一段代码片段,看看是怎么样基于寄存器操作的,以便有更深入的了解。代码如下:#defineHANDLE_OP_SHX_INT(_opcode, _opname, _cast, _op)原创 2011-11-05 19:48:05 · 5098 阅读 · 0 评论 -
Android培训班(80)Dalvik虚拟机的垃圾回收2
二、Mark Sweep算法标记-清除算法依赖于对所有存活对象进行一次全局遍历来确定哪此对象可以回收,遍历的过程从根出发,找到所有可到达对象,其它不可到达的对象就是垃圾对象,可被回收。正如其名称所暗示的那样,这个算法分为两大阶段:标记和清除。这种分步执行的思路构成了现代垃圾收集算法的思想基础。与引用计数算法不同的是,标记-清除算法不需要监测每一次内存分配和指针操作,只需要在标记阶段进行一次统计就行原创 2011-11-13 10:03:18 · 5209 阅读 · 0 评论 -
Android培训班(82)Dalvik虚拟机的垃圾回收4
通过上面的学习,了解了垃圾回收的原理和过程。那么Dalvik虚拟机是什么时候进行垃圾回收呢?要回答这个问题,那么得继续分析代码,继续进入下面的学习。其实,垃圾回收主要有两种方式,一种是虚拟机线程自动进行的,一种是手动进行的。现在先来学习自动进行的方式,所谓自动方式,就是虚拟机创建一个线程,这个线程定时进行。虚拟机在初始化时,就进行创建这个线程,如下的代码: if(gDvm.zygote){原创 2011-12-03 22:41:46 · 6048 阅读 · 0 评论