MMS 源码目录结构(android)
华为彩信中心原理
取消息
BTS
BSC
BSC MSC/VLR/HLR
BTS
提纲
MMS 原理介绍 华为MMS体系结构、接口及
组网
MMS
业务流程介绍
infoX MMSC的接口(4-1)
序号 接口名称
1 MM1
连接实体
MMSC-WAP GW
说明
3GPP和OMA有很明确的定义, infoX MMSC是查考了两种协议来 实现的,可以兼容支持,其中阅读 报告就是很好的例子。 3GPP等国际规范没有明确定义, 各个厂家都是私有协议。infoX MMSC将MM2接口扩充为软件总线 的接口和功能。
2
MM2
Relay - Server
3
MM3
基于SMTP的接口。3GPP等国际规 MMSC-E-mail Server 范有明确定义,对于E-mail Server 来讲,MMSC就是一个邮件服务器。 用于MMSC之间的互连,大多数厂 家都遵循“归属地服务”的原则, 在不同网络和不同运营商互连上, 建议使用MMSIG实现,MMSCIG左 右两边都是MM4接口。
消息是否到接受 否 方消息中心 消息是否直接发 是 送到手机
相同点:基于存储转发机制;消息编辑、发送、接收等操作方式基本相同
MMS支持的媒体类型
文本:internet大量字符集
图像:JPEG, GIF87a, GIF89a, WBMP,JPEG2000
音频: AMR,MP3,MIDI,WAV
Externel Servers:外部消息系统,如Email、Fax、UM等。
VAS:增值服务系统,由第三方SP提供,供终端用户定制。 G-SCP:网关SCP。MMSC通过G-SCP跟移动智能网系统交互,完成对预付费 MMS用户的支持。
2.Android源代码编译命令m和mm和mmm以及make分析
老罗的新浪微博:/shengyangluo,欢迎关注!在前文中,我们分析了Android编译环境的初始化过程。
Android编译环境初始化完成后,我们就可以用m/mm/mmm/make命令编译源代码了。
当然,这要求每一个模块都有一个Android.mk文件。
Android.mk实际上是一个Makefile脚本,用来描述模块编译信息。
Android编译系统通过整合Android.mk文件完成编译过程。
本文就对Android源代码的编译过程进行详细分析。
从前面Android编译系统环境初始化过程分析这篇文章可以知道,lunch命令其实是定义在build/envsetup.sh文件中的函数lunch提供的。
与lunch命令一样,m、mm和mmm 命令也分别是由定义在build/envsetup.sh文件中的函数m、mm和mmm提供的,而这三个函数又都是通过make命令来对源代码进行编译的。
事实上,命令m就是对make命令的简单封装,并且是用来对整个Android源代码进行编译,而命令mm和mmm都是通过make命令来对Android源码中的指定模块进行编译。
接下来我们就先分别介绍一下函数m、mm和mmm的实现,然后进一步分析它们是如何通过make命令来编译代码的。
函数m的实现如下所示:函数m调用函数gettop得到的是Android源代码根目录T。
在执行make命令的时候,先通过-C选项指定工作目录为T,即Android源代码根目录,接着又将执行命令m指定的参数$@作为命令make的参数。
从这里就可以看出,命令m实际上就是对命令make的简单封装。
函数mm的实现如下所示:函数mm首先是判断当前目录是否就是Android源码根目录,即当前目录下是否存在一个build/core/envsetup.mk文件和一个Makefile文件。
如果是的话,就将命令mm当作是一个普通的make命令来执行。
否则的话,就调用函数findmakefile从当前目录开始一直往上寻找是否存在一个Android.mk文件。
android系统自带短信程序源码部分分析
系统自带短信程序源码部分分析文章分类:移动开发这里并不打算对整个短信源码进行分析,完全是看了某部分代码后的自我总结。
我从GIT上clone了Conversation(即短信程序)的所有源码,结果编译不过。
不过这对分析它的源码并不造成太大的阻碍。
这里主要对短信主界面的数据和UI的交互角度进行分析,因为我自己写的短信程序在加入获取联系人头像功能后,程序启动时花费的查询时间太长。
虽然我也觉得系统默认的短信程序,甚至HandcentSMS,启动时间都不是很快。
(大概是我的机器性能太差)一、代码结构Conversation中整体结构主要包括com.android.mms.data和com.android.mms.ui,如名字所示,大概就是数据处理部分和UI部分。
数据部分主要是获取/缓存联系人信息、获取/缓存会话信息等。
ConversationList类是程序的主activity,派生于ListActivity,就是一个大的列表。
此外:ConversationListAdapter是这个ListView的adapter,派生于CursorAdapter;ConversationListItem是一个自定义的ViewGroup,派生于RelativeLayout,用于表示会话列表的每一个item;Conversation表示一个会话数据;Contact表示一个联系人;ContactList维护一个联系人列表;RecipientIdCache用于开线程读取一个特殊的表,该表映射会话数据到联系人信息,也就是通过Recipient就可以获取联系人信息。
二、UI结构这里的UI主要就是ConversationList/ConversationListAdapter/ConversationListItem三者之间的交互。
在layout中,conversation_list_item.xml作为这个ListView (ConversationList)的item定义,直接使用了ConversationListItem这个view:Java代码1.<com.android.mms.ui.ConversationListItem xmlns:android="http:///apk/res/android"2.android:layout_width="match_parent"3.android:layout_height="?android:attr/listPreferredItemHeight"4.android:background="@drawable/conversation_item_background_unread"5.android:paddingRight="10dip" >这个自定义item最重要的工作,就是将会话数据绑定到UI控件上,例如QuickContactBadge。
mms协议格式
mms协议格式MMS(Multimedia Messaging Service)是一种通过移动通信网络传输多媒体消息的通信协议。
它允许用户通过手机或其他移动设备发送包含文本、图片、音频和视频等多媒体内容的消息。
MMS协议格式是指MMS消息的结构和组成方式,它决定了消息的各个部分如何组织和传输。
下面我将详细介绍MMS协议格式的相关内容。
1. MMS消息的头部:每条MMS消息都包含一个头部,用于描述消息的一些基本信息和参数设置。
头部通常包括以下几个重要字段:- 消息类型:指示消息的类型是发送或接收。
- 发送者和接收者:指明消息的发送方和接收方的信息。
- 主题:描述消息的主题或标题。
- 时间戳:记录消息的发送或接收时间。
- MMS版本:标识当前消息所采用的MMS协议版本。
2. MMS消息的主体:MMS消息的主体部分是实际的多媒体内容。
它可以包括文本、图片、音频和视频等多种形式的数据。
主体以一种特定的编码方式进行传输,常见的编码方式有二进制编码和Base64编码。
对于文本内容,可以直接以Unicode或ASCII编码形式进行传输。
而对于图片、音频和视频等媒体文件,需要将文件按特定的格式进行编码,并将编码后的数据按照固定的标识放入消息主体中。
3. MMS消息的附件:MMS消息还可以携带附件,用于包含一些额外的数据或者文件。
附件可以是任意的文件类型,如图片、音频、视频、文档等。
通常,附件的传输是通过将文件按照特定的格式进行编码,并将编码后的数据放入消息的附件部分。
在MMS协议格式中,附件的信息会被包含在消息的正文中,通过特定的标识和描述信息进行区分。
4. MMS消息的传输方式:MMS消息的传输方式可以通过多种技术来实现,如GPRS、3G、4G等移动通信网络。
不同的传输方式可能会影响到消息的传输速度和质量。
通常情况下,MMS消息会通过移动通信网络的消息网关进行中转和传递。
消息网关会负责将消息从发送方传输到接收方,并在传输过程中进行适当的转码和解码操作。
【安卓本卓】Android系统源码篇之(一)源码获取、源码目录结构及源码阅读工具简介
【安卓本卓】Android系统源码篇之(⼀)源码获取、源码⽬录结构及源码阅读⼯具简介前⾔转载请声明,转⾃【】,谢谢!古⼈常说,“熟读唐诗三百⾸,不会作诗也会吟”,说明了⼤量阅读诗歌名篇对学习作诗有⾮常⼤的帮助。
做开发也⼀样,Android源码是全世界最优秀的Android⼯程师编写的代码,也是Android开发中绝对的权威所在。
Android系统开源,且占据了当今⼿机系统世界的绝⼤部分江⼭,各⼤⼿机⼚商要做⼿机系统定制,就必须对Android系统源码⾮常熟悉,这就要求他们的⼯程师们去熟读源码。
即使是纯第三⽅App的开发者,要想成为Android开发真正的⾏家⾥⼿,也必须对系统源码有⼀定的研究。
本系列⽂章将记录笔者学习Android源码的理解和⼼得,以此来和⼴⼤的同⾏们进⾏交流和相互提升。
本篇⽂章是这⼀系列的第⼀篇,将主要记录或者介绍Android源码的获取,系统源码的宏观结构及内容,源码阅读⼯具推荐及使⽤⽅法等内容。
主要内容如下:⼀、Ubuntu下获取Android系统源码Android源码的获取⽅式有许多,既可以在Windows下去获取,也可以Linux下去下载,⽐较常见的⽅法是在Linux下⽤repo⼯具去下载。
笔者使⽤的⽅式是在Windows7系统下安装Ubuntu16.04双系统,然后采⽤repo⼯具去获取的源码。
其中每⼀个步骤都可以在⽹上找到很多资料,笔者不赘述,也不⾃⼰探索⽅法,这⾥仅记录下成功安装获取源码过程中参考的⽹页、主要步骤以及碰到的若⼲问题,以供读者和笔者⾃⼰以后参考使⽤。
基本操作步骤如下:1、在Win7中分区在Windows7中为Ubuntu系统分区,参考了【】中第⼀节分区步骤。
Android系统源码未编译前就有⼤约20-30G⼤⼩,编译后更⼤,所以⼀定要预留⾜够的空间。
2、制作Ubuntu U盘系统启动盘参看⽹页【】前5步。
Ubutu镜像⽂件从Ubutu官⽹下载即可,不过需要注意的是,要先弄清楚下载32位还是64位的系统:在主系统Win7桌⾯查看“计算机”图标属性,可以看到系统的位数,如下图所⽰:所以咱们在选择Ubuntu系统的时候也选择64位的。
MTK手机软件系统工程和目录结构简介
MTK手机软件系统工程和目录结构简介2008-03-26 21:40MTK使用了nucleus实时操作系统,在其上做了个内核抽象层的封装,以适应多种实时操作系统,如oscar、ThreadX、nucleus。
整个软件系统包括nucleus 操作系统、平台设备驱动、协议栈、文件系统、WGUI、MMI、J2ME等。
在这里MMI部分几乎包括了操作系统内核、协议栈、文件系统之上的所有部分,其中WGUI也在其中。
MTK的PC模拟版使用VC的编译器和链接器生成,ARM版使用ADS1.2的编译器和链接器生成。
因为MTK的整个软件系统是一个很庞大而且复杂的工程,并且要支持多个MTK的产品系列和多家客户的客户化支持,使用集成开发环境(IDE)已经无法胜任,而且很难做到整个工程的自动构建和资源、代码的生成。
所以MTK的软件系统使用了windows下的GNU开发工具链(MinGW)来进行工程的管理、配置和构建,MTK将MinGW放到了第三方工具中。
另外还使用了perl脚本来解析用户输入的命令行参数,因此第三方工具中还包含了ActivePerl(windows下的perl解释器)。
不过,整个软件系统并没有使用MinGW 的全部工具,好象只使用了make这个工具,由几个Makefile控制了构建的过程,在编译和链接时根据最终生成PC模拟版还是ARM版而分别调用VC的编译器和链接器或ADS1.2的编译器和链接器。
MTK手机软件系统的目录结构简介MTK手机软件系统的主要目录如下所示,因整个工程的目录树非常庞大,为简单起见和减小篇幅,去除了在工程结构中相对不重要的目录。
.|-- Fast_DL|-- ROM|-- adaptation|-- applib|-- bootloader|-- config|-- custom| |-- app| | `-- TOP_6227_BB| |-- common| |-- drv| | |-- LCD| | | `-- TOP_6227_LCM| | `-- image_sensor| | `-- MT9D011|-- drv|-- fs|-- inc|-- init|-- interface|-- j2me|-- kal|-- make| |-- applib| | |-- applib.def| | |-- applib.inc| | |-- applib.lis| | `-- applib.pth| |-- bootloader| |-- config| |-- custom|-- media|-- mmi|-- modis|-- mtk_lib| `-- MT6227| `-- S01| `-- gprs| |-- abm.lib| |-- adaptation.lib| |-- applib_inet.lib|-- nucleus|-- nvram|-- plutommi|-- toolsFast_DL是开发时下载二进制映像和资源等的相关文件的目录。
Android开发之Android应用程序目录结构解析
Android开发之Android应⽤程序⽬录结构解析建⽴的HelloWorld的应⽤项⽬,其代码是由ADT插件⾃动⽣成的,形成Android项⽬特有的结构框架。
接下来让我带领⼤家解析⼀个Android程序的各个组成部分,这次我们拿⼀个Hello,World做例⼦,虽然只是⼀个Hello,World,但也是⿇雀虽⼩五脏俱全,通过分析Hello,World的⽬录结构,让我们对Android程序有⼀个整体全⾯的认识。
⼀、创建⼀个Android 应⽤项⽬启动Eclipse;选择File->New->Project…;选择Android 下的Android Project,单击Next按钮。
根据上⾯的⽬录结构,我们来分析⼀下⼆、⽬录解析我们来⼤致了解⼀下安卓应⽤程序的⽬录的作⽤:1. src⽬录该⽬录下的⽂件存放Android应⽤程序中所有java源代码,⾃动地组织在⽤户定义声明的包内。
Activity是Android中的视图部分,负责界⾯显⽰。
2. gen⽬录该⽬录下的⽂件是由ADT⾃动⽣成的,即包内的R.java⽂件。
该⽂件为项⽬中的各个资源在该类中创建其唯⼀的ID。
从R⽂件中可以看到每⼀个资源都会有⼀个整数和它相对应。
3. Android4.4建⽴不同版本的可能会有不同的依赖。
Android4.4 ⽬录存放该项⽬⽀持的jar包。
作为⼀个Java项⽬,通常情况下都会引⼊要⽤到的⼯具类,也就是Jar包,在Android开发中,绝⼤部分开发⽤的⼯具包都被封装到⼀个名叫Android.jar的⽂件⾥了。
如果我们在Eclipse中展开来看,可以看到j2se中的包,apache项⽬中的包,还有Android⾃⾝的包⽂件。
在这⾥我们简单浏览⼀下Android的包⽂件:android.app :提供⾼层的程序模型、提供基本的运⾏环境android.content :包含各种的对设备上的数据进⾏访问和发布的类android.database :通过内容提供者浏览和操作数据库android.graphics :底层的图形库,包含画布,颜⾊过滤,点,矩形,可以将他们直接绘制到屏幕上.android.location :定位和相关服务的类android.media :提供⼀些类管理多种⾳频、视频的媒体接⼝ :提供帮助⽹络访问的类,超过通常的.* 接⼝android.os :提供了系统服务、消息传输、IPC 机制android.opengl :提供OpenGL 的⼯具android.provider :提供类访问Android 的内容提供者android.telephony :提供与拨打电话相关的API 交互android.view :提供基础的⽤户界⾯接⼝框架android.util :涉及⼯具性的⽅法,例如时间⽇期的操作android.webkit :默认浏览器操作接⼝android.widget :包含各种UI 元素(⼤部分是可见的)在应⽤程序的屏幕中使⽤4. assets存放项⽬相关的资源⽂件5. bin该⽬录⽤于存放⽣成的⽬标⽂件,例如Java的⼆进制⽂件、资源打包⽂件(.ap_后缀)、Dalvik虚拟机的可执⾏性⽂件(.dex后缀),打包好应⽤⽂件(.apk后缀)等。
Android操作系统详细目录结构教程(2)
Android操作系统相信大家已经非常熟悉了。
该系统没有内置文件管理器,经过安装第三方文件管理器后可以对主系统内存和SD卡上的文件管理。
主内存中的文件目录都是由主系统自动生成,那么又有多少人他们目录结构的具体分工呢?下面是本站整理的Android操作系统详细目录结构,供大家交流使用。
这次是\system\bin文件夹,这个目录下的文件都是系统的本地程序,从bin文件夹名称可以看出是binary二进制的程序,里面主要是Linux系统自带的组件,下面是文件结构详解:\system\bin\akmd\system\bin\am\system\bin\app_process 系统进程\system\bin\dalvikvm Dalvik虚拟机宿主\system\bin\dbus-daemon 系统BUS总线监控\system\bin\debuggerd 调试器\system\bin\debug_tool 调试工具\system\bin\dexopt DEX选项\system\bin\dhcpcd DHCP服务器\system\bin\dumpstate 状态抓取器\system\bin\dumpsys 系统抓取器\system\bin\dvz\system\bin\fillup\system\bin\flash_image 闪存映像\system\bin\hciattach\system\bin\hcid HCID内核\system\bin\hostapd\system\bin\hostapd_cli\system\bin\htclogkernel\system\bin\input\system\bin\installd\system\bin\itr\system\bin\linker\system\bin\logcat Logcat日志打印\system\bin\logwrapper\system\bin\mediaserver\system\bin\monkey\system\bin\mountd 存储挂载器\system\bin\netcfg 网络设置\system\bin\ping Ping程序\system\bin\playmp3 MP3播放器\system\bin\pm 包管理器\system\bin\qemud QEMU虚拟机\system\bin\radiooptions 无线选项\system\bin\rild RIL组件\system\bin\sdptool\system\bin\sdutil\system\bin\service\system\bin\servicemanager 服务管理器\system\bin\sh\system\bin\ssltest SSL测试\system\bin\surfaceflinger 触摸感应驱动\system\bin\svc 服务\system\bin\system_server\system\bin\telnetd Telnet组件\system\bin\toolbox\system\bin\wlan_loader\system\bin\wpa_cli\system\bin\wpa_supplicant接着是\system\etc文件夹,从这个文件夹名称来看保存的都是系统的配置文件,比如APN接入点设置等核心配置。
MMS发送流程(代码版)android
MMS发送流程(代码版)Android2.2packages/apps/Mms1. 点击发送按钮Src//android/mms/ui/poseMessageActivity.javapublic void onClick(View v) {if ((v == mSendButton) && isPreparedForSending()) {confirmSendMessageIfNeeded(); //确认是否需要发送短信—-》}}2.src//android/mms/ui/poseMessageActivity.javaprivate void confirmSendMessageIfNeeded() {if (!isRecipientsEditorVisible()) { //编辑联系人不可见时,也就是给已存在会话的联系人发送短信时sendMessage(true);return;}boolean isMms = mWorkingMessage.requiresMms(); //是否需要以彩信形式发送if (mRecipientsEditor.hasInvalidRecipient(isMms)) {//是否含有不合法的收件人if (mRecipientsEditor.hasValidRecipient(isMms)) {//有合法的和不合法的,弹出尝试发送对话框String title = getResourcesString(R.string.has_invalid_recipient,mRecipientsEditor.formatInvalidNumbers(isMms));new AlertDialog.Builder(this).setIcon(android.R.drawable.ic_dialog_alert).setTitle(title).setMessage(R.string.invalid_recipient_message).setPositiveButton(R.string.try_to_send,newSendIgnoreInvalidRecipientListener()).setNegativeButton(R.string.no, new CancelSendingListener()).show();} else {//如果全是不合法的联系人,提示不能发送信息new AlertDialog.Builder(this).setIcon(android.R.drawable.ic_dialog_alert).setTitle(R.string.cannot_send_message).setMessage(R.string.cannot_send_message_reason).setPositiveButton(R.string.yes, new CancelSendingListener()).show();}} else {//判断收件人没有问题,接着发送信息 --》sendMessage(true);}}3. src//android/mms/ui/poseMessageActivity.javaprivate void sendMessage(boolean bCheckEcmMode) {Log.v(TAG, "sendMessage");if (bCheckEcmMode) {// TODO: expose this in telephony layer for SDK buildString inEcm =SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE); //判断是否处于紧急拨号模式,得到的inEcm一般为空Log.v(TAG, "inEcm = " + inEcm);if (Boolean.parseBoolean(inEcm)) {try {startActivityForResult(newIntent(TelephonyIntents.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS,null),REQUEST_CODE_ECM_EXIT_DIALOG);return;} catch (ActivityNotFoundException e) {// continue to send messageLog.e(TAG, "Cannot find EmergencyCallbackModeExitDialog", e);}}}if (!mSendingMessage) {// send can change the recipients. Make sure we remove the listeners firstand then add// them back once the recipient list has settled.removeRecipientsListeners(); //取消对收件人的监听mWorkingMessage.send(); //发送信息—-》mSentMessage = true;mSendingMessage = true;addRecipientsListeners(); //重新添加收件人监听}// But bail out if we are supposed to exit after the message is sent.if (mExitOnSent) {//如果mExitOnSent为true,信息发送完成后退出Activityfinish();}}4. src//android/mms/data/WorkingMessage.java/*** Send this message over the network. Will call back with onMessageSent() once* it has been dispatched to the telephonystack. This WorkingMessage object is* no longer useful after this method hasbeen called.*/public void send() {if (Log.isLoggable(LogTag.TRANSACTION, Log.VERBOSE)) {LogTag.debug("send");}// Get ready to write to disk.prepareForSave(true /* notify */);//主要做一下同步收件人和WorkingMessage,彩信时在准备其他一些东西// We need the recipient list for both SMS and MMS.final Conversation conv = mConversation;String msgTxt = mText.toString();Log.v(TAG, "msgText = " + msgTxt);if (requiresMms()|| addressContainsEmailToMms(conv, msgTxt)) {// Make local copies of the bits we need for sending a message,// because we will be doing it off of the main thread, which will// immediately continue on to resetting some of this state.final Uri mmsUri = mMessageUri; //如果第一次发送,此时mmsUri为null,如果是重发,则是草稿箱的地址 mMessageUri =content://mms/drafts/1final PduPersister persister = PduPersister.getPduPersister(mContext);final SlideshowModel slideshow = mSlideshow;final SendReq sendReq = makeSendReq(conv,mSubject);// Do the dirty work of sending the message off of the main UI thread.new Thread(new Runnable() {public void run() {// Make sure the text in slide 0 is no longer holding onto a reference to// the text in the message text box.slideshow.prepareForSend();sendMmsWorker(conv, mmsUri, persister, slideshow, sendReq);}}).start();}else {// Same rules apply as above.final String msgText = mText.toString();//取出短消息Log.v(TAG, "msgText = " + msgText);new Thread(new Runnable() {public void run() {preSendSmsWorker(conv, msgText);//发送信息--》}}).start();}// update the Recipient cache with the new to address, if it's differentRecipientIdCache.updateNumbers(conv.getThreadId(),conv.getRecipients());// Mark the message as discarded because it is "off the market"after being sent.mDiscarded = true;}5. src//android/mms/data/WorkingMessage.javaprivate void sendMmsWorker(Conversation conv, Uri mmsUri, PduPersisterpersister, SlideshowModel slideshow, SendReq sendReq) {Log.v(TAG, "sendMmsWorker");// If user tries to send the message, it's a signal the inputtedtext is what they wanted.erAcceptedImeText(mContext);// First make sure we don't have too many outstanding unsent message.Cursor cursor = null;try {cursor = SqliteWrapper.query(mContext, mContentResolver,Mms.Outbox.CONTENT_URI,MMS_OUTBOX_PROJECTION, null, null, null);if (cursor != null) {//如果MMS_OUTBOX里有未发送的彩信,并且总的大小已经超过了彩信的最大限制,则取消此次发送,并存入草稿箱Log.v(TAG, "query Mms.Outbox.CONTENT_URI is not empty");long maxMessageSize = MmsConfig.getMaxSizeScaleForPendingMmsAllowed()*MmsConfig.getMaxMessageSize();Log.v(TAG, "MmsConfig.getMaxSizeScaleForPendingMmsAllowed() =" + MmsConfig.getMaxSizeScaleForPendingMmsAllowed());Log.v(TAG, "MmsConfig.getMaxMessageSize()() = " +MmsConfig.getMaxMessageSize());long totalPendingSize = 0;while (cursor.moveToNext()) {totalPendingSize +=cursor.getLong(MMS_MESSAGE_SIZE_INDEX);Log.v(TAG, "totalPendingSize = " + totalPendingSize);}if (totalPendingSize >= maxMessageSize) {unDiscard(); // itwasn't successfully sent. Allow it to be saved as a draft.mStatusListener.onMaxPendingMessagesReached();return;}}else{Log.v(TAG, "query Mms.Outbox.CONTENT_URI is empty");}} finally {if (cursor != null) {cursor.close();}}mStatusListener.onPreMessageSent();// Make sure we are still using the correct thread ID for our// recipient set.long threadId = conv.ensureThreadId();if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) {LogTag.debug("sendMmsWorker: update draft MMS message " + mmsUri); }if (mmsUri == null) {//如果是首次发送,先把彩信保存入草稿箱// Create a new MMS message if one hasn't been made yet.Log.v(TAG, "mmsUri == null and startcreateDraftMmsMessage");mmsUri = createDraftMmsMessage(persister,sendReq, slideshow);} else {// Otherwise, sync the MMS message in progress to disk.Log.v(TAG, "mmsUri = " + mmsUri);Log.v(TAG, "updateDraftMmsMessage");updateDraftMmsMessage(mmsUri,persister, slideshow, sendReq); }// Be paranoid and clean any draft SMS up. deleteDraftSmsMessage(threadId);// Resize all the resizeable attachments (e.g. pictures) to fit // in the remaining space in the slideshow.int error = 0;try {slideshow.finalResize(mmsUri);} catch (ExceedMessageSizeException e1) {error = MESSAGE_SIZE_EXCEEDED;} catch (MmsException e1) {error = UNKNOWN_ERROR;}if (error != 0) {markMmsMessageWithError(mmsUri);mStatusListener.onAttachmentError(error);return;}MessageSender sender = new MmsMessageSender(mContext, mmsUri, slideshow.getCurrentMessageSize());try {if (!sender.sendMessage(threadId)) {// The message was sent through SMS protocol, we should// delete the copy which was previously saved in MMS drafts.SqliteWrapper.delete(mContext, mContentResolver, mmsUri, null, null);}// Make sure this thread isn't over the limits in message countRecycler.getMmsRecycler().deleteOldMessagesByThreadId(mContext, threadId);} catch (Exception e) {Log.e(TAG, "Failed to send message: " + mmsUri + ",threadId=" + threadId, e);}mStatusListener.onMessageSent();}6.src//android/mms/transaction/MmsMessageSender.javapublic boolean sendMessage(long token) throws MmsException {// Load the MMS from the message uriPduPersister p = PduPersister.getPduPersister(mContext);GenericPdu pdu = p.load(mMessageUri);if (pdu.getMessageType() != PduHeaders.MESSAGE_TYPE_SEND_REQ){throw new MmsException("Invalid message: " +pdu.getMessageType());}SendReq sendReq = (SendReq)pdu;// Update headers.updatePreferencesHeaders(sendReq);// MessageClass.sendReq.setMessageClass(DEFAULT_MESSAGE_CLASS.getBytes());// Update the 'date' field of the message before sending it.sendReq.setDate(System.currentTimeMillis()/ 1000L);sendReq.setMessageSize(mMessageSize);p.updateHeaders(mMessageUri, sendReq);// Move the message into MMS Outboxp.move(mMessageUri, Mms.Outbox.CONTENT_URI);// Start MMS transaction serviceSendingProgressTokenManager.put(ContentUris.parseId(mMessageUri), token);mContext.startService(new Intent(mContext, TransactionService.class));return true;}7.src//android/mms/transaction/TransactionService.javaOverridepublic int onStartmand(Intent intent, int flags, int startId) {Log.v(TAG, "onStartmand");if (intent == null) {return Service.START_NOT_STICKY;}mConnMgr = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);boolean noNetwork =!isNetworkAvailable();if (Log.isLoggable(LogTag.TRANSACTION, Log.VERBOSE)) {Log.v(TAG, "onStart: #" + startId + ": " + intent.getExtras() + " intent=" + intent);Log.v(TAG, " networkAvailable=" + !noNetwork);}Log.v(TAG, "getAction is " + intent.getAction());if (ACTION_ONALARM.equals(intent.getAction())|| (intent.getExtras() == null)) {Log.v(TAG, "ACTION_ONALARM.equals(intent.getAction()) ||(intent.getExtras() == null)");// Scan database to find all pending operations.Cursor cursor = PduPersister.getPduPersister(this).getPendingMessages(System.currentTimeMillis());if (cursor != null) {try {int count = cursor.getCount();if (Log.isLoggable(LogTag.TRANSACTION, Log.VERBOSE)) {Log.v(TAG, "onStart: cursor.count=" + count);}if (count == 0) {if (Log.isLoggable(LogTag.TRANSACTION, Log.VERBOSE)) {Log.v(TAG, "onStart: no pending messages. Stoppingservice.");}RetryScheduler.setRetryAlarm(this);stopSelfIfIdle(startId);return Service.START_NOT_STICKY;}int columnIndexOfMsgId=cursor.getColumnIndexOrThrow(PendingMessages.MSG_ID);int columnIndexOfMsgType =cursor.getColumnIndexOrThrow(PendingMessages.MSG_TYPE);if (noNetwork) {// Make sure we register for connection state changes.if (Log.isLoggable(LogTag.TRANSACTION, Log.VERBOSE)) {Log.v(TAG, "onStart: registerForConnectionStateChanges");}MmsSystemEventReceiver.registerForConnectionStateChanges(getApplicationContext());}while (cursor.moveToNext()) {int msgType =cursor.getInt(columnIndexOfMsgType);int transactionType =getTransactionType(msgType);Log.v(TAG, "msgType = " + msgType);Log.v(TAG, "transactionType = " + transactionType);if (noNetwork) {onNetworkUnavailable(startId, transactionType);return Service.START_NOT_STICKY;}switch (transactionType){case -1:break;case Transaction.RETRIEVE_TRANSACTION:// If it's a transiently failed transaction,// we should retry it in spite of current// downloading mode.int failureType =cursor.getInt(cursor.getColumnIndexOrThrow(PendingMessages.ERROR_TYPE));if (!isTransientFailure(failureType)){break;}// fall-throughdefault:Uri uri =ContentUris.withAppendedId(Mms.CONTENT_URI,cursor.getLong(columnIndexOfMsgId));TransactionBundle args = new TransactionBundle(transactionType, uri.toString());// FIXME: We use the same startId for all MMs.launchTransaction(startId, args, false);break;}}} finally {cursor.close();}} else {if (Log.isLoggable(LogTag.TRANSACTION, Log.VERBOSE)) {Log.v(TAG, "onStart: no pending messages. Stoppingservice.");}RetryScheduler.setRetryAlarm(this);stopSelfIfIdle(startId);}} else {if (Log.isLoggable(LogTag.TRANSACTION, Log.VERBOSE)) {Log.v(TAG, "onStart: launch transaction...");}// For launching NotificationTransaction and test purpose.TransactionBundle args = newTransactionBundle(intent.getExtras());launchTransaction(startId, args,noNetwork);}return Service.START_NOT_STICKY;}8. src//android/mms/transaction/TransactionService.javaprivate void launchTransaction(int serviceId,TransactionBundle txnBundle, boolean noNetwork) {Log.v(TAG, "launchTransaction");if (noNetwork) {Log.w(TAG, "launchTransaction: no network error!");onNetworkUnavailable(serviceId,txnBundle.getTransactionType());return;}Message msg = mServiceHandler.obtainMessage(EVENT_TRANSACTION_REQUEST);msg.arg1 = serviceId;msg.obj = txnBundle;if (Log.isLoggable(LogTag.TRANSACTION, Log.VERBOSE)) {Log.v(TAG, "launchTransaction: sending message " + msg);}mServiceHandler.sendMessage(msg);}9. src//android/mms/transaction/TransactionService.javaprivate final class ServiceHandler extends Handler {public ServiceHandler(Looper looper) {super(looper);}/*** Handle ining transactionrequests.* The ining requests are initiatedby the MMSC Server or by the* MMS Client itself.*/Overridepublic void handleMessage(Messagemsg) {if (Log.isLoggable(LogTag.TRANSACTION, Log.VERBOSE)) {Log.v(TAG, "Handling ining message: " + msg);}Transaction transaction = null;switch (msg.what) {case EVENT_QUIT:getLooper().quit();return;case EVENT_CONTINUE_MMS_CONNECTIVITY:synchronized (mProcessing) {if (mProcessing.isEmpty()) {return;}}if (Log.isLoggable(LogTag.TRANSACTION, Log.VERBOSE)) {Log.v(TAG, "handle EVENT_CONTINUE_MMS_CONNECTIVITYevent...");}try {int result =beginMmsConnectivity();if (result != Phone.APN_ALREADY_ACTIVE){Log.v(TAG, "Extending MMS connectivity returned " + result +" instead of APN_ALREADY_ACTIVE");// Just wait for connectivity startup without// any newrequest of APN switch.return;}} catch (IOException e) {Log.w(TAG, "Attempt to extend use of MMS connectivityfailed");return;}// Restart timersendMessageDelayed(obtainMessage(EVENT_CONTINUE_MMS_CONNECTIVITY),APN_EXTENSION_WAIT);return;case EVENT_DATA_STATE_CHANGED:/** If we are being informedthat connectivity has been established * to allow MMS traffic,then proceed with processing the pending * transaction, if any.*/if (mConnectivityListener == null) {return;}NetworkInfo info = mConnectivityListener.getNetworkInfo();if (Log.isLoggable(LogTag.TRANSACTION, Log.VERBOSE)) {Log.v(TAG, "Handle DATA_STATE_CHANGED event: " + info);}// Check availability of the mobile network.if ((info == null) || (info.getType() !=ConnectivityManager.TYPE_MOBILE_MMS)) {if (Log.isLoggable(LogTag.TRANSACTION, Log.VERBOSE)) {Log.v(TAG, " type isnot TYPE_MOBILE_MMS, bail");}return;}if (!info.isConnected()) {if (Log.isLoggable(LogTag.TRANSACTION, Log.VERBOSE)) {Log.v(TAG, " TYPE_MOBILE_MMS not connected, bail");}return;}TransactionSettings settings = newTransactionSettings(TransactionService.this,info.getExtraInfo());// If this APN doesn't have an MMSC, wait for one that does.if (TextUtils.isEmpty(settings.getMmscUrl())){if (Log.isLoggable(LogTag.TRANSACTION, Log.VERBOSE)) {Log.v(TAG, " empty MMSCurl, bail");}return;}// Set a timer to keep renewing our "lease" on the MMSconnection sendMessageDelayed(obtainMessage(EVENT_CONTINUE_MMS_CONNECTIVITY),APN_EXTENSION_WAIT);processPendingTransaction(transaction, settings);return;case EVENT_TRANSACTION_REQUEST://响应请求Log.v(TAG, "EVENT_TRANSACTION_REQUEST");int serviceId = msg.arg1;try {TransactionBundle args= (TransactionBundle) msg.obj;TransactionSettingstransactionSettings;// Set the connection settings for this transaction.// If these have not been set in args, load thedefault settings.String mmsc =args.getMmscUrl();if (mmsc != null) {transactionSettings= new TransactionSettings(mmsc,args.getProxyAddress(), args.getProxyPort());} else {transactionSettings= new TransactionSettings(TransactionService.this, null);}int transactionType =args.getTransactionType();Log.v(TAG, "transactionType = " + transactionType);if (Log.isLoggable(LogTag.TRANSACTION, Log.VERBOSE)) {Log.v(TAG, "handleEVENT_TRANSACTION_REQUEST:transactionType=" +transactionType);}// Create appropriate transactionswitch (transactionType){case Transaction.NOTIFICATION_TRANSACTION:String uri =args.getUri();if (uri != null) {transaction= new NotificationTransaction(TransactionService.this, serviceId,transactionSettings, uri);} else {// Now it's only used for test purpose.byte[] pushData =args.getPushData();PduParserparser = new PduParser(pushData);GenericPdu ind= parser.parse();int type =PduHeaders.MESSAGE_TYPE_NOTIFICATION_IND;if ((ind != null) &&(ind.getMessageType() == type)) {transaction = newNotificationTransaction(TransactionService.this, serviceId,transactionSettings, (NotificationInd) ind);} else {Log.e(TAG, "Invalid PUSH data.");transaction = null;return;}}break;case Transaction.RETRIEVE_TRANSACTION:transaction = newRetrieveTransaction(TransactionService.this, serviceId,transactionSettings, args.getUri());break;case Transaction.SEND_TRANSACTION://根据transactiontype响应发送彩信Log.v(TAG, "Transaction.SEND_TRANSACTION");transaction = new SendTransaction(TransactionService.this, serviceId,transactionSettings, args.getUri());break;case Transaction.READREC_TRANSACTION:transaction = newReadRecTransaction(TransactionService.this, serviceId,transactionSettings, args.getUri());break;default:Log.w(TAG, "Invalidtransaction type: " + serviceId);transaction = null;return;}if (!processTransaction(transaction)) {transaction = null;return;}if (Log.isLoggable(LogTag.TRANSACTION, Log.VERBOSE)) {Log.v(TAG, "Started processing of ining message: " + msg);}} catch (Exception ex) {Log.w(TAG, "Exception occurred while handling message: " + msg, ex);if (transaction != null) {try {transaction.detach(TransactionService.this);if (mProcessing.contains(transaction)){synchronized (mProcessing) {mProcessing.remove(transaction);}}} catch (Throwable t) {Log.e(TAG, "Unexpected Throwable.", t);} finally {// Set transaction to null to allow stopping the// transaction service.transaction = null;}}} finally {if (transaction == null) {if (Log.isLoggable(LogTag.TRANSACTION, Log.VERBOSE)) {Log.v(TAG, "Transaction was null. Stopping self: " + serviceId);}endMmsConnectivity();stopSelf(serviceId);}}return;case EVENT_HANDLE_NEXT_PENDING_TRANSACTION:processPendingTransaction(transaction, (TransactionSettings) msg.obj);return;default:Log.w(TAG, "what=" + msg.what);return;}}10. src//android/mms/transaction/TransactionService.java/*** Internal method to begin processinga transaction.* param transaction the transaction. Must not be{code null}.* return {code true} if process hasbegun or will begin. {code false}* if the transaction should bediscarded.* throws IOException if connectivityfor MMS traffic could not be* established.*/private boolean processTransaction(Transaction transaction) throws IOException { // Check if transaction already processingLog.v(TAG, "processTransaction");synchronized (mProcessing) {for (Transaction t : mPending) {if (t.isEquivalent(transaction)) {if (Log.isLoggable(LogTag.TRANSACTION, Log.VERBOSE)) {Log.v(TAG, "Transaction already pending: " +transaction.getServiceId());}return true;}}for (Transaction t : mProcessing) {if (t.isEquivalent(transaction)) {if (Log.isLoggable(LogTag.TRANSACTION, Log.VERBOSE)) {Log.v(TAG, "Duplicated transaction: " +transaction.getServiceId());}return true;}}/** Make sure that the networkconnectivity necessary* for MMS traffic is enabled.If it is not, we need* to defer processing thetransaction until* connectivity is established.*/if (Log.isLoggable(LogTag.TRANSACTION, Log.VERBOSE)) {Log.v(TAG, "processTransaction: callbeginMmsConnectivity...");}int connectivityResult = beginMmsConnectivity();if (connectivityResult == Phone.APN_REQUEST_STARTED){mPending.add(transaction);if (Log.isLoggable(LogTag.TRANSACTION, Log.VERBOSE)) {Log.v(TAG, "processTransaction: connResult=APN_REQUEST_STARTED," +"defer transaction pending MMS connectivity");}return true;}if (Log.isLoggable(LogTag.TRANSACTION, Log.VERBOSE)) {Log.v(TAG, "Adding transaction to 'mProcessing' list: " + transaction);}mProcessing.add(transaction);}// Set a timer to keep renewing our "lease" on the MMSconnectionsendMessageDelayed(obtainMessage(EVENT_CONTINUE_MMS_CONNECTIVITY),APN_EXTENSION_WAIT);if (Log.isLoggable(LogTag.TRANSACTION, Log.VERBOSE)) {Log.v(TAG, "processTransaction: starting transaction " + transaction);}// Attach to transaction and process ittransaction.attach(TransactionService.this);transaction.process();return true;}11.src//android/mms/transaction/SendTransaction.javaOverridepublic void process() {Log.v(TAG, "process");mThread = new Thread(this);mThread.start();}12. src//android/mms/transaction/SendTransaction.javapublic void run() {Log.v(TAG, "run()");try {RateController rateCtlr =RateController.getInstance();if (rateCtlr.isLimitSurpassed() &&!rateCtlr.isAllowedByUser()) { Log.e(TAG, "Sending rate limit surpassed.");return;}// Load M-Send.req from outboxPduPersister persister = PduPersister.getPduPersister(mContext);SendReq sendReq = (SendReq)persister.load(mSendReqURI);// Update the 'date' field of the PDU right before sending it.long date = System.currentTimeMillis() /1000L;sendReq.setDate(date);// Persist the new date value into database.ContentValues values = new ContentValues(1);values.put(Mms.DATE, date);SqliteWrapper.update(mContext, mContext.getContentResolver(),mSendReqURI, values, null, null);// fix bug 2100169: insert the 'from' address per specString lineNumber = MessageUtils.getLocalNumber();if (!TextUtils.isEmpty(lineNumber)) {sendReq.setFrom(new EncodedStringValue(lineNumber));}// Pack M-Send.req, send it, retrieve confirmation data, and parse itlong tokenKey = ContentUris.parseId(mSendReqURI);byte[] response = sendPdu(SendingProgressTokenManager.get(tokenKey),new Pduposer(mContext,sendReq).make());//发送彩信SendingProgressTokenManager.remove(tokenKey);if (Log.isLoggable(LogTag.TRANSACTION, Log.VERBOSE)) {String respStr = new String(response);Log.d(TAG, "[SendTransaction] run: send mms msg (" + mId + "),resp=" + respStr);}SendConf conf = (SendConf)new PduParser(response).parse();if (conf == null) {Log.e(TAG, "No M-Send.conf received.");}// Check whether the responding Transaction-ID is consistent// with the sent one.byte[] reqId = sendReq.getTransactionId();byte[] confId = conf.getTransactionId();if (!Arrays.equals(reqId, confId)) {Log.e(TAG, "Inconsistent Transaction-ID: req="+ new String(reqId) + ", conf=" + new String(confId));return;}// From now on, we won't save the whole M-Send.conf into// our database. Instead, we just save some interesting fields// into the related M-Send.req.values = new ContentValues(2);int respStatus = conf.getResponseStatus();values.put(Mms.RESPONSE_STATUS,respStatus);if (respStatus != PduHeaders.RESPONSE_STATUS_OK){SqliteWrapper.update(mContext, mContext.getContentResolver(),mSendReqURI, values, null, null);Log.e(TAG, "Server returned an error code: " + respStatus);return;}String messageId = PduPersister.toIsoString(conf.getMessageId());values.put(Mms.MESSAGE_ID,messageId);SqliteWrapper.update(mContext, mContext.getContentResolver(),mSendReqURI, values, null, null);// Move M-Send.req from Outbox into Sent.Uri uri = persister.move(mSendReqURI, Sent.CONTENT_URI);mTransactionState.setState(TransactionState.SUCCESS);mTransactionState.setContentUri(uri);} catch (Throwable t) {Log.e(TAG, Log.getStackTraceString(t));} finally {if (mTransactionState.getState() != TransactionState.SUCCESS) {mTransactionState.setState(TransactionState.FAILED);mTransactionState.setContentUri(mSendReqURI);Log.e(TAG, "Delivery failed.");}notifyObservers();}}13.src//android/mms/transaction/Transaction.java/*** A mon method to send a PDU to MMSC.** param token The token to identify the sendingprogress.* param pdu A byte array which contains the dataof the PDU.* return A byte array which containsthe response data.* If an HTTP error code is returned, an IOException will be thrown.* throws IOException if any erroroccurred on network interface or* an HTTP error code(>=400) returned from the server.*/protected byte[] sendPdu(long token, byte[]pdu) throws IOException { return sendPdu(token, pdu, mTransactionSettings.getMmscUrl());}14. src//android/mms/transaction/Transaction.javaprotected byte[] sendPdu(long token, byte[] pdu, StringmmscUrl) throws IOException { ensureRouteToHost(mmscUrl, mTransactionSettings);return HttpUtils.httpConnection(mContext, token,mmscUrl,pdu, HttpUtils.HTTP_POST_METHOD,mTransactionSettings.isProxySet(),mTransactionSettings.getProxyAddress(),mTransactionSettings.getProxyPort());//通过网络发送彩信,AP层的最后实现}。
Android 源码目录结构
| |-- private (?一些私有的头文件)
| |-- stdio (stdio实现)
| |-- stdlib (stdlib实现) 7 P( a* S, c& L# r( C" C
| |-- man (数学函数,后缀名为.3,一些为freeBSD的库文件)
| |-- powerpc (powerpc架构)
| |-- sparc64 (sparc64架构) + a" j: U. u/ M( q+ p+ v! N- l
|-- tools (工具)
| `-- ota (OTA Over The Air Updates升级工具) & k) u, m1 [$ H0 W: B' c
`-- updater (升级器)
| |-- nandwrite (nandwirte函数实现)
| `-- usbloader (usbloader实现)
|-- diskinstaller (android镜像打包器,x86可生产iso) " g9 y; l8 N- r" p
| |-- board (开发平台) , y7 v) j- N3 G/ U5 m' j4 e: Y
| | |-- emulator (模拟器) 1 H! j: h) D1 T* V9 t* ?) V
| | |-- generic (通用) - D2 F/ o5 z9 v$ |/ b8 w
| `-- legacy (估计不能直接使用,可以参考)
| |-- arch_armv6 (V6架构,几个简单的汇编文件) ( n1 {* ^8 A7 L7 S3 v8 h e7 ]
Android操作系统详细目录结构教程(3)
Android操作系统相信大家已经非常熟悉了。
该系统没有内置文件管理器,经过安装第三方文件管理器后可以对主系统内存和SD卡上的文件管理。
主内存中的文件目录都是由主系统自动生成,那么又有多少人他们目录结构的具体分工呢?下面是本站整理的Android操作系统详细目录结构,供大家交流使用。
\system\lib目录中存放的主要是系统底层库,如平台运行时库。
\system\lib\libaes.so\system\lib\libagl.so\system\lib\libandroid_runtime.so Android运行时库\system\lib\libandroid_servers.so 系统服务组件\system\lib\libaudio.so 音频处理\system\lib\libaudioeq.so EQ均衡器\system\lib\libaudioflinger.so 音频过滤器\system\lib\libbluetooth.so 蓝牙组件\system\lib\libc.so\system\lib\libcamera.so 超相机组件\system\lib\libcameraservice.so\system\lib\libcorecg.so\system\lib\libcrypto.so 加密组件\system\lib\libctest.so\system\lib\libcutils.so\system\lib\libdbus.so\system\lib\libdl.so\system\lib\libdrm1.so DRM解析库\system\lib\libdrm1_jni.so\system\lib\libdvm.so\system\lib\libexif.so\system\lib\libexpat.so\system\lib\libFFTEm.so\system\lib\libGLES_CM.so\system\lib\libgps.so\system\lib\libhardware.so\system\lib\libhgl.so\system\lib\libhtc_ril.so\system\lib\libicudata.so\system\lib\libicui18n.so\system\lib\libicuuc.so\system\lib\liblog.so\system\lib\libm.so\system\lib\libmedia.so\system\lib\libmediaplayerservice.so \system\lib\libmedia_jni.so\system\lib\libnativehelper.so\system\lib\libnetutils.so\system\lib\libOmxCore.so\system\lib\libOmxH264Dec.so\system\lib\libpixelflinger.so\system\lib\libpvasf.so\system\lib\libpvasfreg.so\system\lib\libpvauthor.so\system\lib\libpvcommon.so\system\lib\libpvdownload.so\system\lib\libpvdownloadreg.so\system\lib\libpvmp4.so\system\lib\libpvmp4reg.so\system\lib\libpvnet_support.so\system\lib\libpvplayer.so\system\lib\libpvrtsp.so\system\lib\libpvrtspreg.so\system\lib\libqcamera.so\system\lib\libreference-ril.so\system\lib\libril.so\system\lib\librpc.so\system\lib\libsgl.so\system\lib\libsonivox.so\system\lib\libsoundpool.so\system\lib\libsqlite.so\system\lib\libssl.so\system\lib\libstdc++.so\system\lib\libsurfaceflinger.so\system\lib\libsystem_server.so\system\lib\libthread_db.so\system\lib\libUAPI_jni.so\system\lib\libui.so\system\lib\libutils.so\system\lib\libvorbisidec.so\system\lib\libwbxml.so\system\lib\libwbxml_jni.so\system\lib\libwebcore.so\system\lib\libwpa_client.so\system\lib\libxml2wbxml.so\system\lib\libz.so\system\lib\modules\system\lib\modules\wlan.ko\system\media目录中放置的都是系统铃声音乐文件夹,除了常规的铃声外还有一些系统提示事件音。
Android操作系统详细目录结构
下面是某站整理的Android操作系统详细目录结构:首先是\system\app文件夹,这里面主要存放的是常规下载的应用程序,可以看到都是以APK 格式结尾的文件。
在这个文件夹下的程序为系统默认的组件,自己安装的软件将不会出现在这里,而是\data\文件夹中。
\system\app\AlarmClock.apk 闹钟\system\app\AlarmClock.odex\system\app\Browser.apk 浏览器\system\app\Browser.odex\system\app\Bugreport.apk Bug报告\system\app\Bugreport.odex\system\app\Calculator.apk 计算器\system\app\Calculator.odex\system\app\Calendar.apk 日历\system\app\Calendar.odex\system\app\CalendarProvider.apk 日历提供\system\app\CalendarProvider.odex\system\app\Camera.apk 照相机\system\app\Camera.odex\system\app\com.amazon.mp3.apk 亚马逊音乐\system\app\Contacts.apk 联系人\system\app\Contacts.odex\system\app\DownloadProvider.apk 下载提供\system\app\DownloadProvider.odex\system\app\DrmProvider.apk DRM数字版权提供\system\app\DrmProvider.odex\system\app\Email.apk 电子邮件客户端\system\app\Email.odex\system\app\FieldTest.apk 测试程序\system\app\FieldTest.odex\system\app\GDataFeedsProvider.apk GoogleData提供\system\app\GDataFeedsProvider.odex\system\app\Gmail.apk Gmail电子邮件\system\app\Gmail.odex\system\app\GmailProvider.apk Gmail提供\system\app\GmailProvider.odex\system\app\GoogleApps.apk 谷歌程序包\system\app\GoogleApps.odex\system\app\GoogleSearch.apk 搜索工具\system\app\GoogleSearch.odex\system\app\gtalkservice.apk GTalk服务\system\app\HTMLViewer.apk HTML查看器\system\app\HTMLViewer.odex\system\app\IM.apk 即使通讯组件包含MSN、yahoo通\system\app\ImCredentialProvider.apk\system\app\ImProvider.apk\system\app\ImProvider.odex\system\app\Launcher.apk 启动加载器\system\app\Launcher.odex\system\app\Maps.apk 电子地图\system\app\Maps.odex\system\app\MediaProvider.apk 多媒体播放提供\system\app\MediaProvider.odex\system\app\Mms.apk 短信、彩信\system\app\Mms.odex\system\app\Music.apk 音乐播放器\system\app\Music.odex\system\app\MyFaves.apk T-Mobile MyFaves程序\system\app\MyFaves.odex\system\app\PackageInstaller.apk apk安装程序\system\app\PackageInstaller.odex\system\app\Phone.apk 电话拨号器\system\app\Phone.odex\system\app\Settings.apk 系统设置\system\app\Settings.odex\system\app\SettingsProvider.apk 设置提供\system\app\SettingsProvider.odex\system\app\SetupWizard.apk 设置向导\system\app\SetupWizard.odex\system\app\SoundRecorder.apk 录音工具\system\app\SoundRecorder.odex\system\app\Street.apk 街景地图\system\app\Street.odex\system\app\Sync.apk 同步程序\system\app\Sync.odex\system\app\Talk.apk 语音程序\system\app\Talk.odex\system\app\TelephonyProvider.apk 电话提供\system\app\TelephonyProvider.odex\system\app\Updater.apk 更新程序\system\app\Updater.odex\system\app\V ending.apk 制造商信息\system\app\V ending.odex\system\app\V oiceDialer.apk 语音拨号器\system\app\**.apk **视频\system\app\**.odex☆:S5660有哪些查看按键方式在按键中*#06#查看串号输入*#0228# 查电池输入*#1111# 行货:001输入*#2222# 行货:REVO.1输入*#0*#可查看屏墓坏点功能*#*#4636#*#*显示手机信息、电池信息、电池记录、使用统计数据、WiFi信息*#*#7780#*#*重设为原厂设定,不会删除预设程序,及SD 卡档案。
Android开发程序的目录结构详解_Android开发
Android开发程序的目录结构详解本文以一个简单的Android HelloWorld程序来说明Android开发程序的目录结构。
它具有一定的代表意义,展示出了一般Android程序的目录结构组成。
HelloWorld程序的目录结构概述我们可以在文件夹中看到,HelloWorld程序的目录主要包括:src文件夹、gen文件夹、Android文件夹、assets、res文件夹、AndroidManifest.xml、default.properties。
在Eclipse的左侧展开HelloWorld项目,可以看到如下图的目录结构:→【安卓学习是一个系统的流程,如果你是一个刚刚开始学习的初学者,或者你是一名想要从事安卓开发的程序猿,你可以加Q是444_513____089___免费获取最新的学习资料(视频,源码)每天晚上和安卓大牛一起学习项目开发技术】←下面将分节介绍上面的各级目录结构。
1.src文件夹顾名思义(src, source code)该文件夹是放项目的源代码的。
打开HelloWorld.java 文件会看到如下代码:可以知道:我们新建一个简单的HelloWorld项目,系统为我们生成了一个HelloWorld.java文件。
他导入了两个类android.app.Activity和android.os.Bundle,HelloWorld类继承自Activity且重写了onCreate方法。
android.app.Activity类:因为几乎所有的活动(activities)都是与用户交互的,所以Activity 类关注创建窗口,你可以用方法setContentView(View)将自己的UI放到里面。
然而活动通常以全屏的方式展示给用户,也可以以浮动窗口或嵌入在另外一个活动中。
有两个方法是几乎所有的Activity子类都实现的:(1)onCreate(Bundle):初始化你的活动(Activity),比如完成一些图形的绘制。
Android系统文件夹结构解析
Android系统文件夹结构解析\\system\\app这个里面主要存放的是常规下载的应用程序,可以看到都是以APK格式结尾的文件。
在这个文件夹下的程序为系统默认的组件,自己安装的软件将不会出现在这里,而是\\data\\文件夹中。
下面是详细的介绍:\\system\\app\\AlarmClock.apk 闹钟\\system\\app\\AlarmClock.odex\\system\\app\\Browser.apk 浏览器\\system\\app\\Browser.odex\\system\\app\\Bugreport.apk Bug报告\\system\\app\\Bugreport.odex\\system\\app\\Calculator.apk 计算器\\system\\app\\Calculator.odex\\system\\app\\Calendar.apk 日历\\system\\app\\Calendar.odex\\system\\app\\CalendarProvider.apk 日历提供\\system\\app\\CalendarProvider.odex\\system\\app\\Camera.apk 照相机\\system\\app\\Camera.odex\\system\\app\\com.amazon.mp3.apk 亚马逊音乐\\system\\app\\Contacts.apk 联系人\\system\\app\\Contacts.odex\\system\\app\\DownloadProvider.apk 下载提供\\system\\app\\DownloadProvider.odex\\system\\app\\DrmProvider.apk DRM数字版权提供\\system\\app\\DrmProvider.odex\\system\\app\\Email.apk 电子邮件客户端\\system\\app\\Email.odex\\system\\app\\FieldTest.apk 测试程序\\system\\app\\FieldTest.odex\\system\\app\\GDataFeedsProvider.apk GoogleData提供\\system\\app\\GDataFeedsProvider.odex\\system\\app\\Gmail.apk Gmail电子邮件\\system\\app\\Gmail.odex\\system\\app\\GmailProvider.apk Gmail提供\\system\\app\\GmailProvider.odex\\system\\app\\GoogleApps.apk 谷歌程序包\\system\\app\\GoogleApps.odex\\system\\app\\GoogleSearch.apk 搜索工具\\system\\app\\GoogleSearch.odex\\system\\app\\gtalkservice.apk GTalk服务\\system\\app\\gtalkservice.odex\\system\\app\\HTMLViewer.apk HTML查看器\\system\\app\\HTMLViewer.odex\\system\\app\\IM.apk 即使通讯组件包含MSN、yahoo通\\system\\app\\ImCredentialProvider.apk\\system\\app\\ImProvider.apk\\system\\app\\ImProvider.odex\\system\\app\\Launcher.apk 启动加载器\\system\\app\\Launcher.odex\\system\\app\\Maps.apk 电子地图\\system\\app\\Maps.odex\\system\\app\\MediaProvider.apk 多媒体播放提供\\system\\app\\MediaProvider.odex\\system\\app\\Mms.apk 短信、彩信\\system\\app\\Mms.odex\\system\\app\\Music.apk 音乐播放器\\system\\app\\Music.odex\\system\\app\\MyFaves.apk T-Mobile MyFaves程序\\system\\app\\MyFaves.odex\\system\\app\\PackageInstaller.apk apk安装程序\\system\\app\\PackageInstaller.odex\\system\\app\\Phone.apk 电话拨号器\\system\\app\\Phone.odex\\system\\app\\Settings.apk 系统设置\\system\\app\\Settings.odex\\system\\app\\SettingsProvider.apk 设置提供\\system\\app\\SettingsProvider.odex\\system\\app\\SetupWizard.apk 设置向导\\system\\app\\SetupWizard.odex\\system\\app\\SoundRecorder.apk 录音工具\\system\\app\\SoundRecorder.odex\\system\\app\\Street.apk 街景地图\\system\\app\\Street.odex\\system\\app\\Sync.apk 同步程序\\system\\app\\Sync.odex\\system\\app\\Talk.apk 语音程序\\system\\app\\Talk.odex\\system\\app\\TelephonyProvider.apk 电话提供\\system\\app\\TelephonyProvider.odex\\system\\app\\Updater.apk 更新程序\\system\\app\\Updater.odex\\system\\app\\Vending.apk 制造商信息\\system\\app\\Vending.odex\\system\\app\\VoiceDialer.apk 语音拨号器\\system\\app\\VoiceDialer.odex\\system\\app\\YouTube.apk Youtube视频\\system\\app\\YouTube.odex\\system\\bin这个目录下的文件都是系统的本地程序,从bin文件夹名称可以看出是binary二进制的程序,里面主要是Linux系统自带的组件,Android手机网就主要文件做下简单的分析介绍:\\system\\bin\\akmd\\system\\bin\\am\\system\\bin\\app_process 系统进程\\system\\bin\\dalvikvm Dalvik虚拟机宿主\\system\\bin\\dbus-daemon 系统BUS总线监控\\system\\bin\\debuggerd 调试器\\system\\bin\\debug_tool 调试工具\\system\\bin\\dexopt DEX选项\\system\\bin\\dhcpcd DHCP服务器\\system\\bin\\dumpstate 状态抓取器\\system\\bin\\dumpsys 系统抓取器\\system\\bin\\dvz\\system\\bin\\fillup\\system\\bin\\flash_image 闪存映像\\system\\bin\\hciattach\\system\\bin\\hcid HCID内核\\system\\bin\\hostapd\\system\\bin\\hostapd_cli\\system\\bin\\htclogkernel\\system\\bin\\input\\system\\bin\\installd\\system\\bin\\itr\\system\\bin\\linker\\system\\bin\\logcat Logcat日志打印\\system\\bin\\logwrapper\\system\\bin\\mediaserver\\system\\bin\\monkey\\system\\bin\\mountd 存储挂载器\\system\\bin\\netcfg 网络设置\\system\\bin\\ping Ping程序\\system\\bin\\playmp3 MP3播放器\\system\\bin\\pm 包管理器\\system\\bin\\qemud QEMU虚拟机\\system\\bin\\radiooptions 无线选项\\system\\bin\\rild RIL组件\\system\\bin\\sdptool\\system\\bin\\sdutil\\system\\bin\\service\\system\\bin\\servicemanager 服务管理器\\system\\bin\\sh\\system\\bin\\ssltest SSL测试\\system\\bin\\surfaceflinger 触摸感应驱动\\system\\bin\\svc 服务\\system\\bin\\system_server \\system\\bin\\telnetd Telnet组件\\system\\bin\\toolbox\\system\\bin\\wlan_loader\\system\\bin\\wpa_cli\\system\\bin\\wpa_supplicant\\system\\etc从文件夹名称来看保存的都是系统的配置文件,比如APN接入点设置等核心配置。
MMS网络基本结构及工作原理
MMS网络基本结构及工作原理1. MMS 网络基本结构移动多媒体信息业务系统涵盖了多种类型的网络,并可以集成这些网络中现有的信息业务系统。
移动终端在多媒体信息业务环境(MMSE)中进行操作。
此环境既包括2.5G和3G网络,也有网络间的相互漫游等情况。
MMSE提供了所有相关的业务成份,如:信息的发送、存储、通知。
它们既可位于同一网络中或分布于不同的网络中。
在MMS服务投放市场以前,很多关于网络的实际准备工作必须预先完成。
在软、硬件的准备上除了可以接收MMS的终端外,还需要MMS中心、WAP网关、数据库服务器、增值服务(VAS)等。
◆多媒体信息中心(MMSC)在整个在多媒体信息业务环境(MMSE)中,多媒体信息中心(MMSC)是系统的核心。
由MMS服务器、MMS中继、信息存储器和数据库组成。
MMSC是MMS网络结构的核心,它提供存储和操作支持,允许终端到终端和终端到电子邮件的即时多媒体信息传送,同时支持灵活的寻址能力。
MMSC是将MMS信息从发送者传递到接收者的存储和转发网络元素。
MMSC的概念与SMSC相似,即服务器只在查找接收者电话的期间存储信息。
在找到接收电话以后,MMSC立即将多媒体消息转发给接收者,并且从MMSC删除此消息。
由于MMSC在能够发送的情况下不存储消息,因此它不是一个邮箱服务器。
MMSC是提供MMS服务所需的一个新的网络元素。
由于传输容量和界面需求都不同,SMSC的软件不能直接升级到MMSC。
另外,MMSC需要运行很多连接其它网络(如Internet)接口,以及提供增值服务所需的外部应用接口,MMSC 还应具备到Email的接口。
◆ WAP网关尽管用户对MMS的使用与SMS类似,但是MMS不能在SMS的传输信道进行传送,SMS的传输信道对于传送多媒体内容来说太窄了。
在协议层,MMS使用WAP无线会话协议(WSP)作为传输协议。
为了在MMS信息传输中使用WAP协议,需要一个WAP网关连接MMSC和无线WAP网络。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MMS 源码目录结构首先应该从AndroidManifest.xml 文件开始,该文件是Android应用(APK)的打包清单,其中提供了关于这个应用程序的基本信息,如名称(application/@label),图标( application/@icon ),等常量信息,但该文件最重要的功能仍然是:向Android系统声明应用程序所包含的组件,包括Activity、Service、Receiver和ContentProvider,另外还会请求系统授予相关权限。
<application>是重要的标记,通常我们都是在此设置应用程序的名称和图标,而在Messaging这个应用中,它扩展了默认的android.app.Application类,在com.android.mms.MmsApp类中覆写了onCreate()方法进行系统初始化、覆写onTerminate() 方法做相关清理工作。
最重要的是<application>标记设置了(任务吸引力) taskAffinity =“android.task.mms”、allowTaskReparenting ="true" 这是两个与Task有关的属性,那么何为任务(Task)呢?A pplication就是一个.apk文件,由若干个组件(可能会包括Activity、Service、Receiver 或者ContentProvider )构成,它是一个物理上的独立存在。
而Task则是指用户借助Application提供的功能完成某件事情,例如:发送一条信息给老朋友。
通常一个Task操作所涉及的内容不会超过A pplication 边界,但在Android中却不是这样,Android允许一个T ask操作横跨多个Apllication。
还以向老朋友发送信息为例,在该任务中,至少需要一个用来输入目标电话号码和消息内容的用户界面——即Android中的Activity组件(这是Messaging应用中的内容),如果进一步要求目标号码是从联系人列表(或通话列表)中选择,而非手工输入,那么就涉及到跨Apllication调用‘联系人应用’中的列表组件了(也是一个Activity )。
因此以上两个属性前者设置了Activity的吸引力(Affinity)值,后者使得Activity可以在不同的Task中自有切换。
Messaging中的ReceiverR eceiver广播接收器用于响应系统中的各种广播事件并执行相关业务代码的组件,常用于完成如:启动service、显示Activity等任务。
在Messagin应用中一共有7个R eceiver:1、.transaction.SmsReceiver :短消息广播接收器,它负责处理与收到短消息相关的广播事件。
触发该接收器运行的intent有两个:A.android.intent.action.BOOT_COMPLETED--->Android系统启动完成时会发出该广播,即SmsReceiver会在系统启动完成时接收到调用;.android.mms.transaction.MESSAGE_SENT --->定义在SmsReceiverService.java中的常量,被用在SmsMessageSender.sendMessage方法中——即短消息发送后触发的广播事件;完全和预想的一样,在SmsReceiver中会启动SmsReceiverService,启动代码在beginStartingService 方法里。
值得注意的是它同时还做了“屏幕唤醒锁定(WakeLock)” 操作,最终在service启动完成后,通过回调用finishStartingService方法,解除了屏幕唤醒锁定。
SmsReceiver.java中有编译错误,因为无法访问android.provider.Telephony.Sms.Intents。
其实Intents@hide。
2、. transaction.PrivilegedSmsReceiver :该接收器是SmsReceiver的子类,唯一的区别在于该Receiver被申明有permission为android.permission.BROADCAST_SMS。
3、.transaction.MmsSystemEventReceiver :Mms系统事件接收器,它负责在收到新消息时向通知区域(即标题栏)显示小图标,和重新发送在发件箱中的MM。
触发该接收器运行的两个Intent是:A. android.intent.action.BOOT_COMPLETED ---> :与SmsReceiver中的情况相同;B.android.intent.action.CONTENT_CHANGED ---> :连接方式改变时系统会发出该广播,即在连接方式变化,例如从gprs-->wifi时该接收器将被调用;在MmsSystemEventReceiver类中,程序一旦获得数据连接时就会启动TransactionService服务;当连接方式改变时还会调用PduCache.purge()方法清理缓存;还有当系统刚刚启动时会同步通知区域的图标、未读消息个数等信息。
MmsSystemEventReceiver.java中有编译错误,因为它无法访问以下类:1、com.google.android.mms.util.PduCache:位置-myeclair\frameworks\base\core\java\com\google\android\mms\util\PduCache.java,该类未包含在默认的android.jar文件中,需要重新编译;2、android.provider.Telephony.Mms:位置-myeclair\frameworks\base\core\java\android\provider\Telephony.java,该类被标记为@hide 。
3、com.android.internal.telephony.TelephonyIntents:位置-myeclair\frameworks\base\telephony\java\com\android\internal\telephony\TelephonyIntents.java,该类是一个常量类是未被开放的API。
4、com.android.internal.telephony.Phone:位置-myeclair\frameworks\base\telephony\java\com\android\internal\telephony\Phone.java,该类被标记为@hide 。
4、.transaction.PushReceiver :WAP_PUSH 事件的广播接收器,该事件发生时代表手机收到了一条新的WAP PUSH message。
该接收器被调用后,首先唤醒手机屏幕5秒钟,然后在一个后台线程中处理push-data,将消息数据插入到数据库中,必要时启动TransactionService服务以更新通知信息。
触发该接收器运行的Intent是:(intent.action=android.provider.Telephony.WAP_PUSH_RECEIVED, data=application/vnd.wap.mms-message),其中定义在android.provider.Telephony类中。
值得注意的是该Receiver有申明权限:android.permission.BROADCAST_WAP_PUSH,这意味着发出该广播时必须携带该授权,否则本Receiver将不会被触发执行。
PushReceiver.java中有编译错误,因为它无法访问以下类:1、android.provider.Telephony :位置-2、com.google.android.mms.*:位置-myeclair\frameworks\base\core\java\com\google\android\mms\*,这些类未包括在公开的API中。
5、. transaction.MessageStatusReceiver :消息状态改变时的广播接收器,消息状态改变是指消息的投递状态(即:是否成功送达、是否被目标用户阅读等)的变化,触发该接收器的Intent是:com.android.mms.transaction.MessageStatusReceiver. MESSAGE_STATUS_RECEIVED,该值是申明在MessageStatusReceiver.java文件中的常量。
该广播事件是在SmsMessageSender.sendMessage()方法中被发出的,收到广播事件后,Receiver的会做两件事情:a-取得pdu数据包更新消息状态(在updateMessageStatus方法中);b-更新通知区域的新消息指示信息(在MessagingNotification.updateNewMessageIndicator()方法中)。
MessageStatusReceiver.java中有编译错误,因为它无法访问以下类:1、android.provider.Telephony :位置-myeclair\frameworks\base\core\java\android\provider\Telephony.java,该类被标记为@hide 。
2、com.google.android.mms.util.SqliteWrapper:位置-myeclair\frameworks\base\core\java\com\google\android\mms\ util\SqliteWrapper.java ,该类未包括在公开的API中。
6、.transaction.SimFullReceiver :Sim卡短信存储空间满的事件通知,当系统发现Sim卡中存储短信的空间耗尽时会发出该广播事件。
该接收器完成的工作是在通知区域显示相关信息,点击通知信息后,可以进入管理Sim卡中短消息的Activity界面。
SimFullReceiver.java中有编译错误,因为它无法访问android.provider.T elephony 类,所在位置- myeclair\frameworks\base\core\java\android\provider\Telephony.java,该类被标记为@hide 。
7、.transaction.SmsRejectedReceiver :短消息被拒绝时的事件接收器,当手机的存储空间不足时会拒绝接收新的短消息,当该事件发生时SmsRejectedReceiver被调用,它会检查确认是否是存储空间不足,然后在通知区域显示相关通知信息。