Android的本地实现层次具有基本的库和程序。这些库和程序是Android基本系统运行的基础。主要包含了以下的内容:C语言底层库libcutils、Init进程、Shell工具、C++工具库libutils。

Android的源代码结构分为三部分:

(1)核心工程:是建立android系统的基础,在根目录下的若干文件夹。

bionic:提供C/C++标准库的功能,它是一个专为嵌入式系统设计的轻量级标准库实现。bionic还加入了一些Android独有的功能,比如log的底层支持。另外它还实现了一套property系统,这是整个Android的全局变量的存储区域,bionic使用共享内存的方式来实现维护property系统。

bootable:boot loader参考代码。

build:Build系统。

dalvik:虚拟机。

development:高层的开发和调试工具。

frameworks/base:核心框架库。

frameworks/policies:框架配置策略。

hardware:硬件抽象层。

prebuilt:对一些系统平台的二进制支持。

system:环境和一些配置工具及组件。

(2)扩展工程:external project目录。在external文件夹中。

(3)包:Package目录,提供android 的应用程序和服务。系统应用程序在apps目录下,内容提供器在providers目录下。其中,launcher.apk是android的主屏幕,也就是启动后的第一个显示界面。

***************************************************************************************

常用术语包括:

(1)apk扩展名:apk是Android包的扩展名,一个Android包包含了与某个Android应用程序相关的所有文件,apk文件将AndroidManifest.xml文件、应用程序代码(dex文件)、资源文件和其他文件组成一个压缩包,一个项目只能打包压缩成一个apk文件。
(2)dex扩展名:Android的程序被编译成.dex(Dalvik Executable)格式文件, 然后再进行打包生成可直接安装的apk文件。
(3)应用程序(APP) :一个或多个Activity、服务、监听和Intent接收器的集合,一个应用程序有一个文件清单,并且打包成一个apk文件。 4,Action:对Intent发送器意图的描述,一个活动是一个指派给Intent的字符串值。
(4)ADB( Android Debug Bridge ):SDK自带的一个基于命令行的调试程序。它提供了设备浏览工具、设备上的拷贝工具和为调试转寄端口的功能。
(5)内容源:内容源是建立在类ContentProvider之上的用于处理指定格式的内容请求字符串,并返回指定格式的数据的类。
(6)Dalvik Android:虚拟机的名字,Dalvik虚拟机是一个只能解释执行dex文件的虚拟机,dex文件针对存储性能和内存管理进行了优化。 Dalvik虚拟机是基于寄存器的虚拟机,并且能够运行经过Dalvik自带的“dx”工具转换过的Java类。 虚拟机运行在兼容Posix的操作系统上,依赖于底层的功能(如线程和低级内存管理)。Dalvik的核心类库有意做得与Java标准版非常类似,但它明显更适合小型移动设备。
(7)意图(Intent) :意图是一个Intent类,它包含很多描述调用者意图做什么的字段。调用者发送意图到Android意图处理器,意图处理器会遍历所有应用程序的意图过滤器来查找与该意图最匹配的Activity。意图字段包括渴望的动作、种类、数据、数据的MIME类型、一个处理类和其他约束。
(8)意图过滤器(intent-filter):Activity和意图接收器(Receiver)在它们的文件清单中包含一个或多个过滤器,用来描述什么类型的意图或者信息是它们能处理或想接收的。一个意图过滤器列出了一系列要求,例如,意图或信息必须满足的数据类型、被请求的动作和URI的格式。 对于Activity,Android搜索意图和Activity过滤器匹配程度最高的Activity;对于消息,Android会将消息转发给所有匹配意图过滤器的接收器。
(9)Intent接收器(Receiver):一个监听是由Context.broadcastIntent()发出的信息广播的类。
(10)布局资源:一个描述Activity屏幕布局的XML文件。
(11)文件清单:应用程序中的一个XML文件,用于描述包中多个Activity、Intent过滤器、服务和其他内容。可以打开AndroidManifest.xml查看其包含的内容。
(12)资源:用户提供的XML、位图或其他文件,构建程序时会导入进来,稍后会被代码加载,Android支持多种类型的资源,请参考Resources中的详细描述,程序定义的资源文件应当保存在res/ 子目录下。
(13)服务(Service) :运行在后台执行多种固定任务的类,如播放音乐或检测网络活动。
(14)URIs:Android使用URI字符串请求数据(如通信录列表)和动作(如在浏览器中打开网页)。字符串可以具有不同的格式。所有请求数据的URI必须以“content://”开头。有效的动作URI字符串会被设备上的适当的程序处理,例如,以“ http://”开头的URI字符串会被浏览器处理。

(15)JNI:java本地编程接口,是 Java Native Interface 的英文缩写。他能够使java代码与用其他编程语言编写的应用程序和库进行互操作。(其他编程语言大多是c,c++和汇编语言。

(16)JAR:JAR(Java Archive,Java 归档文件)是与平台无关的文件格式,它允许将许多文件组合成一个压缩文件,为 J2EE 应用程序创建的。

========================================================================================

C语言底层库libcutils:这是Android本地中最为基础的库,基本上Android中所有的本地的库和程序都连接了这个库。头文件的路径:system/core/include/cutils,库的路径
system/core/libcutils,编译的结果是:libcutils.so。libcutil 中主要的头文件:threads.h:线程;sockets.h:Android的套接字;properties.h:Android的属性;log.h :log 信息;array.h:数组;ashmem.h:匿名共享内存;atomic.h:原子操作;mq.h:消息队列。

Shell工具:Android系统的启动后,提供了基本shell界面供开发调试使用。需要启动了一个名称为console的服务,实际上执行的程序:/system/bin/sh,sh代码的路径:
system/core/sh。

C++工具库libutils:libutils 是Android的底层库,这个库以C++实现,它提供的API也是C++的。Android的层次的C语言程序和库,大都基于libutils 开发。头文件的路径:
frameworks/base/include/utils,库的路径frameworks/base/libs/utils,编译的结果是:libutils.so。

====================================================================================

有些APP应用或者工程,如果我们想把它放进android的CODEBASE中编译,想让生成的apk直接就在system/app中(甚至于有些APP在eclipse中编译会出错),这个时候就需要用到如何把一个app编译进工程。

(1)对APP工程,首先在packages/app目录下新建工程名,比如xxxx,然后移入工程的src,res,androidmanifest.xml即可(要删除bin跟gen)。配以对应的android.mk文件。内容是:

[html] view plain copy
  1. LOCAL_PATH:=$(callmy-dir)
  2. include$(CLEAR_VARS)
  3. LOCAL_JAVA_LIBRARIES:=mediatek-framework
  4. LOCAL_MODULE_TAGS:=optional
  5. LOCAL_SRC_FILES:=$(callall-java-files-under,src)
  6. LOCAL_PACKAGE_NAME:=<spanstyle="color:#ff0000;"></span><spanstyle="color:#330033;">xxxx
  7. </span>LOCAL_CERTIFICATE:=platform
  8. LOCAL_PROGUARD_ENABLED:=full
  9. #LOCAL_PROGUARD_FLAG_FILES:=proguard.flags
  10. include$(BUILD_PACKAGE)
  11. #Usethefollowingincludetomakeourtestapk.
  12. include$(callall-makefiles-under,$(LOCAL_PATH))

修改了对应的工程名就行。然后运行./mk mm xxxx,即可在out\target\product\xxxx\system\app\下生成对应的apk。

(2)对APP应用,已经是一个现成的apk了,要放进系统中。新建一个目录,把apk跟android.mk放在一起,mk内容是:

[html] view plain copy
  1. LOCAL_PATH:=$(callmy-dir)
  2. include$(CLEAR_VARS)
  3. #Modulenameshouldmatchapknametobeinstalled
  4. LOCAL_MODULE:=xxxx
  5. LOCAL_MODULE_TAGS:=optional
  6. LOCAL_SRC_FILES:=$(LOCAL_MODULE).apk
  7. LOCAL_MODULE_CLASS:=APPS
  8. LOCAL_MODULE_SUFFIX:=$(COMMON_ANDROID_PACKAGE_SUFFIX)
  9. LOCAL_CERTIFICATE:=platform
  10. include$(BUILD_PREBUILT)

写好apk的名字就行了。
(3)以上两个过程,都要在对应的系统mk文件中给PRODUCT_PACKAGES赋值(PRODUCT_PACKAGES是系统变量,有可能会在多个文件夹的mk文件中赋值)。我的路径是build\target\product\common.mk,里面的

[java] view plain copy
  1. PRODUCT_PACKAGES:=\
  2. AccountAndSyncSettings\
  3. DeskClock\

在后面跟上APK包名就行了。只需要执行systemimage就行了,不需要编译安卓。

(4)在内置skype这个apk时,碰到一个例外现象。一开机就提示“unfortunately,skype has stopped”,且该提示框一直存在导致平台无法操作。后来找到解决方法,是因为有些apk包含so库:把skype这个apk以ZIP的方式解压,将其中的Lib文件夹下的so库,拷贝到alps/vendor/mediatek/${Project}/artifacts/out/target/product/${Project}/system/lib/目录下,执行systemimage命令,之后在out\target\product\soyo\system\lib\下即可找到对应的库。重新烧录系统,就没有此问题了。


原文:http://blog.csdn.net/zhandoushi1982/article/details/4695460

更多相关文章

  1. NPM 和webpack 的基础使用
  2. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
  3. Android配置蓝牙键值
  4. Android(安卓)NDK编程入门笔记
  5. 如何在Android工程中导入其它工程作为引用,解决NoClassDefFound
  6. 在Android(安卓)so文件的.init、.init_array上和JNI_OnLoad处下
  7. Android高手进阶教程(四)之----Android(安卓)中自定义属性(attr.
  8. android 对于asset下文件的操作
  9. Android技术沙龙系列之:Android(安卓)广播接收器

随机推荐

  1. c++学习路线
  2. c语言数组中以列优先对吗
  3. c语言函数调用例子
  4. c语言的文件存取方式只能是顺序存取?
  5. c语言打印菱形
  6. c++异常处理的方法
  7. 格式化代码是什么意思
  8. c++类型转换
  9. .net是什么语言 视频
  10. 按位取反运算符的使用