
Android培训班
caimouse
在IT行业有20多年的经验。拥有20多年的C和C++开发经验,5年以上Python开发经验,资深数据库开发、上百G数据库优化经验。曾经任职嵌入式工程师、P2P开发工程师、银行信用卡交易系统工程师、全自动化电池测试部门经理。
展开
-
Android培训班(3)
从linux目录里可以看到如下图所示: 现在接着来介绍一级目录的大体功能:bin:这个目录主要用来放下载android代码的执行文件。bionic: Android的libc库,包含了一些基础库,其存在的意义在于其可规避GPL,同时减少库的体积,针对arm进行指令和内存优化。bootable:启动和恢复相关的代码和工具。build:Android工程编译的规则脚本,是其原创 2010-03-22 21:42:00 · 4972 阅读 · 1 评论 -
Android培训班(2)
前面介绍了怎么样配置编译环境、编译代码,那么现在就开始把编译出来的目标文件写到开发板里运行了,以便确认整个系统是可以成功运行的。一个完整的Android系统至少由三部分组成,分别是bootloader、kernel、rootfs,这与典型的linux系统的结构是一致的。下面介绍如何烧写一个完整的Android操作系统。bootloader、kernel、rootfs的镜像最后都要烧在nandf原创 2010-03-18 22:11:00 · 6290 阅读 · 1 评论 -
Android培训班(1)
Android是基于Linux内核的软件平台和操作系统,是Google在2007年11月5日公布的手机操作系统平台,早期由Google开发,后期由开放手机联盟(Open Handset Alliance)开发。它采用了软件栈分层的架构,主要分为三部分。底层以Linux核心工作为基础,只提供基本功能;其他的应用软件则由各公司自行开发,以Java作为应用软件开发语言。另外,为了推广此技术,Goo原创 2010-03-17 20:21:00 · 7440 阅读 · 0 评论 -
Android培训班(4)
要想Android运行起来,不但要编译内核正确,还需要有正确地安装根文件系统,才可以运行起来。第一步,就是从模拟器里提取data目录的数据。也许你会问,为什么要从模拟器里提取呢?因为这样做是最方便的,不必要每个目录和文件,都要自己去建立。在一个终端里运行模拟器,并且运行android系统正常,然后再打开一个终端,在这个终端里运行adb来获取模拟器的文件,如下命令:adbpull /da原创 2010-04-01 23:37:00 · 7333 阅读 · 5 评论 -
Android培训班(5)
<br /> 在一块开发板里,当加电时,它是直接从CPU缺省的地址开始加载指令,然后进行运行。目前设计的嵌入式芯片,都带有一段小小的引导代码,但这段代码功能都是比较有限,只支持加载几百字节然后跳到相应内存运行,比如不带网络加载,不带RAM初始化,不带USB驱动等等,不过现在S3C6410引导功能也比较强大,可以从SD卡里直接加载512字节代码运行。因此,在嵌入式系统再引导了二级引导系统,在本书里的二级引导系统,就是UBoot系统,它具非常强大的功能,支持网络加载,支持保存参数到FLASH,支持更强更大的操作原创 2010-07-12 22:42:00 · 3741 阅读 · 0 评论 -
Android培训班(7)
<br /><br />在嵌入式linux开发过程中经常需要从电脑下载引导程序uboot,如果每次都使用烧写到flash或者SD卡的方式,那是比较低效率的开发方式,导致公司没有竞争力,开发出来的产品也没有竞争力,在市场上就会落后挨打了。<br /> <br />这里就来介绍tftp方式从linux主机下载文件到开发板里运行,因此需要在主机linux系统里安装tftp服务器。<br /> <br />在Ubuntu中安装tftp服务器的方法如下:<br />1)下载并安装程序<br />通过软件管理可以安装相原创 2010-07-16 22:18:00 · 3436 阅读 · 0 评论 -
Android培训班(6)
<br /><br />网络文件系统(NFS,Network FileSystem)是一种将远程主机上的分区(目录)经网络挂载到本地系统的一种机制,通过对网络文件系统的支持,用户可以在本地系统上像操作本地分区一样来对远程主机的共享分区(目录)进行操作。<br /> <br /> 在嵌入式Linux 的开发过程中,开发者需要在Linux 服务器上进行所有的软件开发,交叉编译后,通用FTP方式将可执行文件下载到嵌入式系统运行,但这种方式不但效率低下,且无法实现在线的调试。因此,可以通过建立NFS,把L原创 2010-07-13 22:59:00 · 4843 阅读 · 0 评论 -
Android培训班(9)
android系统的初始化过程是从那里开始呢?它在加载linux基本内核后,就开始运行一个初始化进程,叫做init进程,那么怎么样知道它是加载init进程的呢?难道上天就注定的吗?呵呵,不是的,原来是从android加载linux内核时,就设置了下面的参数:Kernelcommand line: noinitrd root=/dev/nfs console=ttySAC0 init=/initnfsroot=192.168.1.103:/nfsbootip=192.168.1.20:192.16原创 2010-07-18 12:18:00 · 4114 阅读 · 0 评论 -
Android培训班(10)
<br /><br />#022 <br />#023 /* clear the umask */<br />#024 umask(0);<br />在上面这段代码里,调用函数umask来设置屏蔽位为0值。这样的意思是什么呢?是告诉系统做了那些工作呢?要了解这个,就得深入查看一下linux函数大全了,因为它的作用就一目了然了,它的解释如下:<br />linux中的 umask 函数主要用于:在创建新文件或目录时屏蔽掉新文件或目录不应有的访问允许权限。文件的访问允许权限共有9种,分别是原创 2010-07-19 23:14:00 · 3477 阅读 · 0 评论 -
Android培训班(8)
<br /><br />Android的代码是比较庞大的,如果要全部编译一遍,是花费比较多时间,这样导致开发效率非常低,那么有没有办法只编译修改那一部份代码呢?答案是肯定有的,因为面对这么多代码,如果没有好的方法是开发不成功的。下面就来学习怎么样单个目录编译的方法。<br /> <br />在android的顶层目录里,运行下面的命令:<br />. build/envsetup.sh<br /> <br />运行命令后,就添加了很多命令到sh解释器,具体命令如下:<br />-croot: C原创 2010-07-17 22:31:00 · 4211 阅读 · 0 评论 -
Android培训班(11)
<br /><br />#033 <br />#034 mount("tmpfs", "/dev","tmpfs", 0, "mode=0755");<br />#035 mkdir("/dev/pts", 0755);<br />#036 mkdir("/dev/socket", 0755);<br />#037 mount("devpts","/dev/pts", "devpts", 0, NULL);<br />#038 mount("pro原创 2010-07-21 22:25:00 · 3725 阅读 · 0 评论 -
Android培训班(12)
<br /><br />#059 <br />#060 get_hardware_name();<br />这段代码是获取当前android系统运行的硬件信息,比如硬件的CPU名称。主要从/proc/cpuinfo里读到相关的信息。<br /> <br /> <br />#061 snprintf(tmp, sizeof(tmp),"/init.%s.rc", hardware);<br />#062 parse_config_file(tmp);<br />这段代码是从原创 2010-07-22 22:23:00 · 3605 阅读 · 0 评论 -
Android培训班(13)
<br /><br />#111 <br />#112 if (qemu[0])<br />#113 import_kernel_cmdline(1);<br />这段代码是用来判断是否使用模拟器运行,如果时,就加载内核命令行参数。<br /> <br />#114 <br />#115 if(!strcmp(bootmode,"factory"))<br />#116 property_set("ro.factorytest","1");原创 2010-07-23 22:30:00 · 4074 阅读 · 0 评论 -
Android培训班(15)
<br /><br />在主函数main里调用这个函数来做什么呢?而这个函数是怎么样实现的呢?下面就来了解这个函数的功能与产现,具代码如下:<br />#001 void open_devnull_stdio(void)<br />#002 {<br />#003 int fd;<br />#004 static const char *name ="/dev/__null__";<br />这段代码是指明创建设备节点的名称,这是空设备。<br /> <br />#005原创 2010-07-25 18:30:00 · 3588 阅读 · 0 评论 -
Android培训班(14)
<br /><br />#200 <br />#201 for(;;) {<br />#202 int nr, i, timeout = -1;<br />这段代码是进入死循环处理,以便这个init进程变成一个服务。<br /> <br />#203 <br />#204 for (i = 0; i < fd_count; i++)<br />#205 ufds[i].revents = 0;<br />这段代码是清空每个socke原创 2010-07-24 23:51:00 · 3503 阅读 · 0 评论 -
Android培训班(16)
<br /><br />parse_config_file函数是分析*.rc配置文件,并且把里面的参数组成链表的方式。下面来仔细地分析代码,如下:<br />#001 int parse_config_file(const char *fn)<br />#002 {<br />输入来的参数是文件名称的路径。<br /> <br />#003 char *data;<br />#004 data = read_file(fn, 0);<br />#005 if (!data)原创 2010-07-27 00:06:00 · 3377 阅读 · 0 评论 -
Android培训班(17)
<br /><br />在上面函数主要识别的关键字有:<br />copycapability chdir chroot class class_start class_stop console chown chmodcritical disabled domainname device exec export group hostname <br />ifupinsmod import keycodes loglevel mkdir mount on oneshot onrestart res原创 2010-07-27 22:40:00 · 3540 阅读 · 0 评论 -
Android培训班(18)
<br /><br />通上面的函数就可以把服务和事件触发的命令添加队列里。其实是在文件parser.c头部,就声明了下面三个链表,如下:<br /> <br />staticlist_declare(service_list);<br />staticlist_declare(action_list);<br />staticlist_declare(action_queue);<br /> <br />service_list是定义添加分析所有资源文件里的服务,action_list是定义添原创 2010-07-28 22:28:00 · 4590 阅读 · 1 评论 -
Android培训班(20)
<br /><br />在android系统里,设计有一种系统叫做属性系统,它是用来做什么呢?这样设计有什么优势呢?其实这个属性系统主要是用来保存系统配置,或者用来交换不同进程的信息。这样的系统最大的优势是统一了系统配置的方式,统一了信息交换方式,通过共享内存的方式提高系统的性能。<br />下面就来分析属性系统的初始化函数,代码如下:<br />#001 void property_init(void)<br />#002 {<br />#003 init_property_area();<原创 2010-08-01 15:18:00 · 3242 阅读 · 0 评论 -
Android培训班(19)
<br /><br />在init初始化进程里,设备初始化是怎么进行的呢?如果要了解这方面,就需要仔细分析下面的代码,如下:<br />#001 int device_init(void)<br />#002 {<br />#003 suseconds_t t0, t1;<br />#004 int fd;<br />#005 <br />#006 fd = open_uevent_socket();<br />#007 if(fd < 0)<br />#008原创 2010-07-31 23:27:00 · 3384 阅读 · 0 评论 -
Android培训班(21)
<br /><br />前面学习了属性系统的初始化和加载,还有保存到属性文件等功能,下面来学习属性服务的方面,它主要用来提供一种服务的方式给java虚拟机上层使用,或者java应用程序使用。start_property_service函数的代码如下:<br />#001 int start_property_service(void)<br />#002 {<br />#003 int fd;<br />#004 <br />#005 load_properties_from_f原创 2010-08-04 22:45:00 · 3067 阅读 · 0 评论 -
Android培训班(22)
<br /><br />在初始化过程里,会显示一个LOGO图片,那么它是怎么实现显示这个图片的呢?它的代码如下:<br />#001 /* 565RLE image format: [count(2 bytes),rle(2 bytes)] */<br />#002 <br />#003 int load_565rle_image(char *fn)<br />#004 {<br />这段代码是加载565RLE格式的LOGO图片,函数的参数是图片路径。<br /> <br />#005原创 2010-08-08 22:10:00 · 3159 阅读 · 0 评论 -
Android培训班(23)
<br /><br />通过上面的分析,可以知道LOGO图片是RLE编码的565格式的图片,也就是采用行程编码的方式,颜色位数采用16位的方式(红色5位,绿色6位,蓝色5位)。因此,所有其它图片的格式都需要转换为这种标准的格式,初始化进程才可以显示出来。下面就来详细地介绍定制一个LOGO图片的显示过程,比如要显示的图片如下:<br /><br /> <br />这个图片的像素大小为480X272,显示屏的大小为4.3寸。直接在Windows平台里使用画笔就可以制作出来,然后保存为png文件,比如保存为xiy原创 2010-08-13 23:01:00 · 3074 阅读 · 0 评论 -
Android培训班(27)
<br /> <!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --><br />初看这段代码时,感觉非常奇怪,没有看到任何打开文件的函数,也没有任何关闭文件的函数,就可以直接操作读取和写入。难道文件是可以自动打开的吗?从linux系统调用API里知道是不可能啊!这时,反复查看输入的命令行,如下:<br />rgb2565 –rle <xiyang.raw >initlogo.rle<br />从这个命令行原创 2010-12-30 22:24:00 · 2800 阅读 · 1 评论 -
Android培训班(26)
<br /> <!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --><br />接着来分析函数to_565_rle,这个函数主要实现从24位颜色变换为565的16位颜色表示,并且进行行程压缩编码,代码如下:<br />voidto_565_rle(void)<br />{<br />unsignedchar in[3];<br />unsignedshort last, color, co原创 2010-12-28 23:35:00 · 2770 阅读 · 1 评论 -
Android培训班(28)
<br /> <!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --><br />接着分析下面这段代码:<br />voidto_565_raw(void)<br />{<br />unsignedchar in[3];<br />unsignedshort out;<br /> <br />由于这个函数不做任何压缩等处理,只是把24位颜色变换为16位,因此很简单的一个循环就行了,读取数据写到文原创 2010-12-31 22:29:00 · 2646 阅读 · 0 评论 -
Android培训班(29)
<br /> <!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --><br />接着来分析带抖动转换的565算法:<br /> <br />voidto_565_raw_dither(int width)<br />{<br />unsignedchar in[3];<br />unsignedshort out;<br />inti = 0;<br />inte;<br /> <br原创 2011-01-01 11:52:00 · 2891 阅读 · 0 评论 -
Android培训班(30)
<br /> <!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --><br />在init.rc文件里第一个初始化的服务是sh服务,如下:<br />##Daemon processes to be run by init. <br />##<br />serviceconsole /system/bin/sh <br />console<br /> <br />sh服务是控制台服务,其实它是原创 2011-01-02 12:04:00 · 3055 阅读 · 2 评论 -
Android培训班(31)
<br /> <!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --><br />在init.rc文件里,可以看到下面的服务加载并运行:<br />#adbd is controlled by the persist.service.adb.enable system property <br />serviceadbd /sbin/adbd <br />disabled<br /> <br />a原创 2011-01-03 23:03:00 · 3205 阅读 · 0 评论 -
Android培训班(32)
<br />在init.rc文件里,可以看到加载下面的服务:<br />serviceservicemanager /system/bin/servicemanager <br />user system <br />critical <br />onrestart restart zygote <br />onrestart restart media<br /> <br />servicemanager服务的代码在目录:<br />Android-2.0/frameworks/base/cmds/s原创 2011-01-05 21:41:00 · 2714 阅读 · 0 评论 -
Android培训班(33)
<br /> <!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --><br />在init.rc文件里,可以看到加载下面的服务:<br />service vold/system/bin/vold<br />socket voldstream 0660 root mount<br />vold服务的代码在目录:<br />Android-2.0/system/core/vold<br />vo原创 2011-01-06 23:30:00 · 3258 阅读 · 0 评论 -
Android培训班(34)
<br /> <!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --><br />在init.rc文件里,可以看到加载下面的服务:<br /> servicenexus /system/bin/nexus<br />socket nexus stream 0660 root system<br />disabled<br /> <br />nexus服务的代码在目录:<br />Android-原创 2011-01-09 17:49:00 · 3179 阅读 · 0 评论 -
Android培训班(35)
<br /> <!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --><br />在init.rc文件里,可以看到加载下面的服务:<br />servicezygote /system/bin/app_process -Xzygote /system/bin --zygote--start-system-server<br />socketzygote stream 666<br />o原创 2011-01-25 00:02:00 · 3103 阅读 · 0 评论 -
Android培训班(38)
<br /> <!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --><br />在init.rc文件里,可以看到加载下面的服务:<br />servicedbus /system/bin/dbus-daemon --system --nofork<br />socketdbus stream 660 bluetooth bluetooth<br />userbluetooth<br原创 2011-02-27 20:15:00 · 3230 阅读 · 0 评论 -
Android培训班(39)
<br /> <!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --><br />在init.rc文件里,可以看到加载下面的服务:<br />serviceinstalld /system/bin/installd<br />socketinstalld stream 600 system system<br />installd服务的代码在目录:<br />Android-2.0/fram原创 2011-03-05 21:57:00 · 3349 阅读 · 0 评论 -
Android培训班(36)
<br /> <!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --><br />在init.rc文件里,可以看到加载下面的服务:<br />servicemedia /system/bin/mediaserver<br />usermedia<br />groupsystem audio camera graphics inet net_bt net_bt_admin<br />med原创 2011-02-16 22:53:00 · 2915 阅读 · 0 评论 -
Android培训班(40)
<br /> <!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --><br />在init.rc文件里,可以看到加载下面的服务:<br />servicekeystore /system/bin/keystore /data/misc/keystore<br />userkeystore<br />groupkeystore<br />socketkeystore stream原创 2011-03-06 11:00:00 · 4040 阅读 · 0 评论 -
Android培训班(37)
<br /> <!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --><br />在init.rc文件里,可以看到加载下面的服务:<br />servicebootanim /system/bin/bootanimation <br />usergraphics <br />groupgraphics <br />disabled<br />oneshot<br />bootanimatio原创 2011-02-20 19:36:00 · 3511 阅读 · 0 评论 -
Android培训班(41)
在这一节,我先从一个简单的计算器入手,带着大家来分析android系统应用程序的结构、实现方式、源码的组织,以及代码修改后的效果显示。通过学习系统应用程序,可以了解android的应用程序,也可以学到开发应用程序的基本知识,也可以深入理解android系统的应用程序的实现,比如汉化、多语言、添加功能等等,这对于初始者是非常重要的一环。下面就开始来学习计算器的应用程序,接着进入下面的目录,并 查看文件:Android-2.0/packages/apps/Calculator在目录下,可以看到有如下文件:201原创 2011-03-13 09:46:00 · 2967 阅读 · 0 评论 -
Android培训班(42)
<br /> <!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --><br />Android.mk文件是用来向编译系统描述项目组织和编译方式,实际上是GNUmake文件的一小片段,它会被编译系统解析一次或多次。<br />这个文件内容如下:<br /> <br />LOCAL_PATH:= $(call my-dir) <br />这行是用来指定当前目录在那里,也就是把当前目录$(callm原创 2011-03-20 21:26:00 · 5281 阅读 · 0 评论