android (19)

Use the following steps to play music:

Insert a SD card with music files (such as mp3) on FAT partition
Connect headset/headphone to your board
Launch the main menu
on the BBG3, use UP/DOWN/LEFT/RIGHT key to highlight the MENU icon at the right side of home screen, press ENTER (or F9)
Launch the Music application by selecting the Music icon

直接声音播放

Use the following steps to play video:

Insert a SD card with video stream files (.3gp, .mp4) on FAT partition
Launch the main menu
Launch the Gallery application by selecting Gallery icon
During play, touching the screen will cause a semi-transient pop-up menu to be displayed. You can select backward/forward/pause/play.

视频播发

.1.3 Streaming Play
Use the following steps to stream from http:

Launch the main menu
Launch the Browser application by selecting the Browser icon
Open a webpage http link with a rtsp streaming link or a multimedia file http link embedded.
Click the rtsp streaming link or multimedia http link.
During play, touch the screen displays a semi-transient pop-up menu. You can select backward/forward/pause/play if the streaming server supports those features
支持RTSP流


包管理脚本 /system/bin/pm 解析:
pm的使用方法可以参考
Pm.java (frameworks/base/cmds/pm/src/com/android/commands/pm)文件中的

命令行

static void showUsage()函数:
private static void showUsage() {
System.err.println("usage: pm [list|path|install|uninstall]");
System.err.println(" pm list packages [-f]");
System.err.println(" pm list permission-groups");
System.err.println(" pm list permissions [-g] [-f] [-d] [-u] [GROUP]");
System.err.println(" pm list instrumentation [-f] [TARGET-PACKAGE]");
System.err.println(" pm path PACKAGE");
System.err.println(" pm install [-l] [-r] PATH");
System.err.println(" pm uninstall [-k] PACKAGE");
System.err.println(" pm enable PACKAGE_OR_COMPONENT");
System.err.println(" pm disable PACKAGE_OR_COMPONENT");
...
}


脚本 /system/bin/pm 内容:
----------------------------------------------------------
base=/system
export CLASSPATH=$base/framework/pm.jar
exec app_process $base/bin com.android.commands.pm.Pm "$@"
----------------------------------------------------------

pm脚步执行过程分析:
由命令行参数可以知道调用过程如下:
首先进入 App_main.cpp (frameworks/base/cmds/app_process)文件中
AppRuntime 类的 main 函数。
main()
set_process_name(argv0);
runtime.mClassName = arg;
runtime.mArgC = argc-i;
runtime.mArgV = argv+i;
runtime.start();
runtime.start 调用的是 AndroidRuntime.cpp (frameworks/base/core/jni)文件中的:
void AndroidRuntime::start()
start("com.android.internal.os.RuntimeInit",false /* Don't start the system server */);
然后进入 RuntimeInit 类的main函数
RuntimeInit.java (frameworks/base/core/java/com/android/internal/os)
main()
commonInit();
finishInit();
finishInit 实际上本地调用:AndroidRuntime.cpp (frameworks/base/core/jni)中的:

static void com_android_internal_os_RuntimeInit_finishInit(JNIEnv* env, jobject clazz)
gCurRuntime->onStarted();
因为有:

App_main.cpp (frameworks/base/cmds/app_process):
virtual void onStarted()
Main_runtime.cpp (frameworks/base/cmds/runtime):

virtual void onStarted()
而 class AppRuntime : public AndroidRuntime 并且是由 AppRuntime 类进入 RuntimeInit
所以可以确定 gCurRuntime->onStarted() 调用的是App_main.cpp (frameworks/base/cmds/app_process)中的:
virtual void onStarted() 函数。
app_init(mClassName, mArgC, mArgV);
接着,
status_t app_init(const char* className, int argc, const char* const argv[])
jr->callMain(className, argc, argv);
jr->callMain 调用了 Pm.java (frameworks/base/cmds/pm/src/com/android/commands/pm) 文件中
类 Pm 的main函数
static void main(String[] args)
new Pm().run(args)
在run函数中对参数进行解析。
此处的args 实际上为执行pm脚本时 传入的参数。
pm 脚本常见的格式有:
---------------------------------------------------
pm list packages [-f]
显示系统中所有已安装的软件包,-f选项列出他们的相关信息
pm list permission-groups");
pm list permissions [-g] [-f] [-d] [-u] [GROUP]
pm list instrumentation [-f] [TARGET-PACKAGE]
pm path PACKAGE
pm install [-l] [-r] PATH
安装软件包 PATH 为apk文件的路径 , -l 表示采用 FORWARD_LOCK 的方式安装,-r 如果一个包存在那么
重新安装,但是保留原来的数据。
pm uninstall [-k] PACKAGE
卸载一个软件包,PACKAGE 为软件包的名称,-k选项表明卸载的时候保留数据和相应的cache目录。
pm enable PACKAGE_OR_COMPONENT
pm disable PACKAGE_OR_COMPONENT
enable 和 disable 修改一个包或者组件(class)的使能状态.
----------------------------------------------------
例如:
我们输入命令 pm install /patch/to/mygps.apk
那么执行的是:runInstall();

void runInstall()
while ((opt=nextOption()) != null) {
if (opt.equals("-l"))
{
installFlags |= PackageManager.FORWARD_LOCK_PACKAGE;
}
else if (opt.equals("-r"))
{
installFlags |= PackageManager.REPLACE_EXISTING_PACKAGE;
}


String apkFilePath = nextArg();
//创建Observer用于包安装过程的监测。

PackageInstallObserver obs = new PackageInstallObserver();
mPm.installPackage(Uri.fromFile(new File(apkFilePath)), obs, installFlags);
如果安装成功:
obs.result == PackageManager.INSTALL_SUCCEEDED
因为有:
IPackageManager mPm;

mPm = IPackageManager.Stub.asInterface(ServiceManager.getService("package"));
class PackageManagerService extends IPackageManager.Stub
所以 mPm.installPackage 调用的是:

PackageManagerService.java (frameworks/base/services/java/com/android/server)文件中的
/* Called when a downloaded package installation has been confirmed by the user */
void installPackage(final Uri packageURI, final IPackageInstallObserver observer, final int flags)
res = installPackageLI(packageURI, flags);
...
Bundle extras = new Bundle(1);
extras.putInt(Intent.EXTRA_UID, res.uid);
...
sendPackageBroadcast(Intent.ACTION_PACKAGE_ADDED,res.pkg.applicationInfo.packageName,extras);
如果包安装成功了,那么将广播一个 ACTION_PACKAGE_ADDED 的消息。
下面的服务和应用程序会监测 ACTION_PACKAGE_ADDED 消息。
AppWidgetService.java (frameworks/base/services/java/com/android/server): filter.addAction(Intent.ACTION_PACKAGE_ADDED);
Home.java (development/samples/home/src/com/example/android/home): filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);
InputMethodManagerService.java (frameworks/base/services/java/com/android/server): packageFilt.addAction(Intent.ACTION_PACKAGE_ADDED);
Launcher.java (packages/apps/launcher/src/com/android/launcher): IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);
ManageApplications.java (packages/apps/settings/src/com/android/settings): IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);
PackageBrowser.java (development/apps/development/src/com/android/development):IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);
SearchDialog.java (frameworks/base/core/java/android/app): mPackageFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
SearchManagerService.java (frameworks/base/core/java/android/server/search): filter.addAction(Intent.ACTION_PACKAGE_ADDED);

下面将分析 SearchManagerService 服务对 ACTION_PACKAGE_ADDED 消息的监测过程:
由pm的脚本分析,我们可以知道,安装一个包后会广播 ACTION_PACKAGE_ADDED 消息。
而在 SearchManagerService 的构造函数SearchManagerService(Context context)中
通过:
// Setup the infrastructure for updating and maintaining the list
// of searchable activities.
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_PACKAGE_ADDED);
filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
filter.addDataScheme("package");
mContext.registerReceiver(mIntentReceiver, filter, null, mHandler);
添加了对 ACTION_PACKAGE_ADDED 消息的监测。
当收到 ACTION_PACKAGE_ADDED 消息后,会执行
void onReceive(Context context, Intent intent)
mHandler.post(mRunUpdateSearchable);
接着,
private Runnable mRunUpdateSearchable = new Runnable()
执行 run
run 调用 updateSearchables();
SearchManagerService.java (frameworks/base/core/java/android/server/search)
private void updateSearchables()
SearchableInfo.buildSearchableList(mContext);
ComponentName defaultSearch = new ComponentName(
"com.android.googlesearch",
"com.android.googlesearch.GoogleSearch" );
SearchableInfo.setDefaultSearchable(mContext, defaultSearch);
由:
ComponentName.java (frameworks/base/core/java/android/content)
public ComponentName(String pkg, String cls)
public ComponentName(Context pkg, String cls)
public ComponentName(Context pkg, Class<?> cls)
new ComponentName 调用的是 public ComponentName(String pkg, String cls)

void buildSearchableList(Context context)
//use intent resolver to generate list of ACTION_SEARCH receivers
final PackageManager pm = context.getPackageManager();
List<ResolveInfo> infoList;
final Intent intent = new Intent(Intent.ACTION_SEARCH);
infoList = pm.queryIntentActivities(intent, PackageManager.GET_META_DATA);

static void setDefaultSearchable(Context context,ComponentName activity)
si = getSearchableInfo(context, activity);
if (si != null) {
// move to front of list
sSearchablesList.remove(si);
sSearchablesList.add(0, si);
}
接着,
static SearchableInfo getSearchableInfo(Context context, ComponentName activity)

补充信息:
getLaunchIntentForPackage
getInstalledPackages
getInstalledApplications
getDefaultActivityIcon
getApplicationLabel
addPackageToPreferred

安装完将会有广播的消息


一个应用 一个进程 一个虚拟机实例

线程调度 内存分配 和mutex 都依赖底层操作系统

基于寄存器的访问

通用性要差一点 减少内存访问 减少冗余指令分发

dex文件的优化

dexopt

对于预置应用 可以在系统编译后 生存相应的优化文件 odex

非预置应用 在运行时候对dex文件进行优化

存放在 /data/dalvik-cache 中

权限分离


所谓Android的核心服务主要包括熵服务(Entropy Service)、电源管理器(Power Manager)、Activity管理器(Activity Manager)

、通话寄存器(Telephony Registry)、包管理器(Package Manager)、账户管理器(Account Manager)

、内容管理器(Content Manager)、内容提供器(System Content Providers)

、电池服务(Battery Service)、光线服务(Lights Service)

、振动服务(Vibrator Service)、闹钟管理器(Alarm Manager)、

看门狗(Init Watchdog)、窗口管理器(Window Manager)、蓝牙服务(Bluetooth Service)等。这些服务和应用程序密切相关,

但通常应用程序不能直接接入核心服务。早期版本中的硬件服务(Hardware Service)和传感器服务(Sensor Service)已经被移除,

光线服务和振动服务在核心服务通过系统服务器来启动。系统服务器的实现位于SystemServer.java中。

1.熵服务


熵服务主要负责在开关机时加载和保持Linux内核的熵池数据。附加的熵池数据包括:

序列号(serial no)

、启动模式(boot mode)、基带(base band)、运营商(carrier)、引导加载器(bootloader)、硬件(hardware)、版本(revision)、当前时间(微妙)、当前时间戳(纳秒),

熵服务的实现位于EntropyService.java文件中。


在应用层,熵池数据可以通过Build对象获取,方法如下:

Build. MODEL //产品名
Build. MANUFACTURER //设备制造商
android.os.Build.VERSION.SDK // SDK版本如“9”

更详细的信息可以参考build.java和DeviceInfoSettings.java等。


通过build 对象来获取熵 平均信息量


2.电源管理器

电源管理器主要负责系统的电源管理策略,

如键盘灯、LCD背光、按钮等,相关的实现位于PowerManagerService.java文件中。具体的策略分为SCREEN_OFF、SCREEN_DIM、SCREEN_BRIGHT、SCREEN_BUTTON_BRIGHT、ALL_BRIGHT、LIGHTS_MASK等几个等级。

3.Activity管理器

基于栈来管理应用程序的生命周期,方便用户在不同的Activity间切换。Activity管理器的实现位于ActivityManagerService.java文件中。在启动Activity管理器后,还应为其安装系统内容提供器(System Content Providers)、添加看门狗等。

4.通话寄存器

管理与通话相关的内容。通话寄存器的实现位于TelephonyRegistry.java文件中。

5.包管理器

对安装包进行管理,可以执行安装、卸载、激活、去活、查看包权限等操作。包管理器的用法为pm [list|path|install|uninstall]。

执行的脚本为:/system/bin/pm。脚本内容如下:

base=/system
export CLASSPATH=$base/work/pm.jar
exec app_process $base/bin com.android.commands.pm.Pm "$@"


包管理器的实现位于PackageManagerService.java文件中。

6.账户管理器

所谓的账户管理器(Account Manager)即对设备上应用账户的账户名、密码、鉴权等进行管理,账户管理器的实现位于AccountManagerService.java文件中。

7.内容管理器

内容管理器主要在应用程序间访问、分享数据。如其他应用程序可以去存取电话簿中的联系人资料等。内容管理器的实现位于ContentService.java文件中。

8.电池服务

电池服务主要负责管理电池的充电状况、电池的电力水平等。相关的实现位于BatteryService.java文件中。

9.光线服务


所谓的光线服务主要包括LCD背光、按钮背光、键盘灯等。相关的实现位于LightsService.java文件中。

10.振动服务

所谓振动服务即对马达的控制,相关的实现位于VibratorService.java文件中。

11.闹钟管理器

闹钟管理器主要负责闹钟的唤醒、取消,以及闹钟列表的管理等,相关的实现位于AlarmManagerService.java文件中。

12.窗口管理器

管理窗口系统。窗口管理器的实现位于WindowManagerService.java文件中。这是Android的UI框架最重要的部分。窗口类型包括Activity、Dialog、PopupWindow等。实际的控制通过WindowToken进行。

13.蓝牙服务

Android对蓝牙协议提供了支持,相关的上层代码实现在android.bluetooth包中,主要的类包括android.bluetooth. BluetoothAdapter、android.bluetooth. BluetoothDevice、android.
bluetooth. BluetoothSocket、android.bluetooth. BluetoothServerSocket、android.bluetooth. BluetoothClass等。为扫描、连接蓝牙设备,基于蓝牙设备的文件传输等提供了便利。蓝牙的上层代码主要位于works\base\core\java\android\bluetooth目录下。目前Android支持的蓝牙标准为BT 2.1,采用的蓝牙协议栈为著名的开源蓝牙协议栈BlueZ。如果是在模拟器上运行,蓝牙服务不启动。

在核心服务之外,
Android还为用户提供了如设备策略管理服务(Device Policy Manager Service)、

状态栏服务(Status Bar Service)、
剪贴板服务(Clipboard Service)、
输入法服务(InputMethod Service)、
网络状态服务(NetStat Service)、
网络管理服务(NetworkManagement Service)、
连接服务(Connectivity Service)、
喉服务(Throttle Service)、接入管理器(Accessibility Manager)、挂载服务(Mount Service)、通知管理器(Notification Manager)、挂载服务(Mount Service)、
存储监控器(Device Storage Monitor)、位置管理器(Location Manager)、搜索管理器(Search Manager)、DropBox服务(DropBox Service)、
桌面服务(Wallpaper Service)、音频服务(Audio Service)、耳机观察器(Headset Observer)、Dock观察器(Dock Observer)、USB观察器(USB Observer)、
UI模式管理服务(UI Mode Manager Service)、备份服务(Backup Service)、AppWidget服务(AppWidget Service)、识别服务(Recognition Service)、
DiskStats服务(DiskStats Service)等。(

更多相关文章

  1. android manifest文件结构
  2. android attr.xml文件
  3. Android 蓝牙4.0代码解析
  4. 【Android 系统开发】 编译 Android文件系统 u-boot 内核 并烧写
  5. android的布局文件简介
  6. Android 数据存储之文件存储小记
  7. Android软件安装文件夹

随机推荐

  1. Microsoft的XMLHTTP对象详解
  2. 不是Web开发者所关注的XML基础具体分析
  3. 关于XML文档的基本操作的实例代码分享
  4. Parse XML Tree 解析XML文件的代码实例
  5. 浅谈WEB页面工具语言XML(六)展望
  6. XML解析之DOM4J解析的示例代码
  7. 浅谈WEB页面工具语言XML(五)好处
  8. XML模式-详细介绍DocBook XML
  9. xml解析java基础的详细介绍
  10. 使用XML将机器内码转换为人们能够理解的