- 浏览: 21546142 次
- 性别:
- 来自: 杭州
最新评论
-
ZY199266:
配置文件还需要额外的配置ma
Android 客户端通过内置API(HttpClient) 访问 服务器(用Spring MVC 架构) 返回的json数据全过程 -
ZY199266:
我的一访问为什么是 /mavenwebdemo/WEB-I ...
Android 客户端通过内置API(HttpClient) 访问 服务器(用Spring MVC 架构) 返回的json数据全过程 -
lvgaga:
我又一个问题就是 如果像你的这种形式写。配置文件还需要额外的 ...
Android 客户端通过内置API(HttpClient) 访问 服务器(用Spring MVC 架构) 返回的json数据全过程 -
lvgaga:
我的一访问为什么是 /mavenwebdemo/WEB-I ...
Android 客户端通过内置API(HttpClient) 访问 服务器(用Spring MVC 架构) 返回的json数据全过程 -
y1210251848:
你的那个错误应该是项目所使用的目标框架不支持吧
log4net配置(web中使用log4net,把web.config放在单独的文件中)
Android应用程序安装过程源代码分析
应用程序管理服务PackageManagerService安装应用程序的过程,其实就是解析析应用程序配置文件AndroidManifest.xml的过程,并从里面得到得到应用程序的相关信息,例如得到应用程序的组件Activity、Service、Broadcast Receiver和Content Provider等信息,有了这些信息后,通过ActivityManagerService这个服务,我们就可以在系统中正常地使用这些应用程序了。
应用程序管理服务PackageManagerService是系统启动的时候由SystemServer组件启动的,启后它就会执行应用程序安装的过程,因此,本文将从SystemServer启动PackageManagerService服务的过程开始分析系统中的应用程序安装的过程。
应用程序管理服务PackageManagerService从启动到安装应用程序的过程如下图所示:
下面我们具体分析每一个步骤。
Step 1. SystemServer.main
这个函数定义在frameworks/base/services/java/com/android/server/SystemServer.java文件中:
- publicclassSystemServer
- {
- ......
- nativepublicstaticvoidinit1(String[]args);
- ......
- publicstaticvoidmain(String[]args){
- ......
- init1(args);
- ......
- }
- ......
- }
Step 2. SystemServer.init1
这个函数是一个JNI方法,实现在frameworks/base/services/jni/com_android_server_SystemServer.cpp文件中:
- namespaceandroid{
- extern"C"intsystem_init();
- staticvoidandroid_server_SystemServer_init1(JNIEnv*env,jobjectclazz)
- {
- system_init();
- }
- /*
- *JNIregistration.
- */
- staticJNINativeMethodgMethods[]={
- /*name,signature,funcPtr*/
- {"init1","([Ljava/lang/String;)V",(void*)android_server_SystemServer_init1},
- };
- intregister_android_server_SystemServer(JNIEnv*env)
- {
- returnjniRegisterNativeMethods(env,"com/android/server/SystemServer",
- gMethods,NELEM(gMethods));
- }
- };//namespaceandroid
Step 3.libsystem_server.system_init
函数system_init实现在libsystem_server库中,源代码位于frameworks/base/cmds/system_server/library/system_init.cpp文件中:
- extern"C"status_tsystem_init()
- {
- LOGI("Enteredsystem_init()");
- sp<ProcessState>proc(ProcessState::self());
- sp<IServiceManager>sm=defaultServiceManager();
- LOGI("ServiceManager:%p\n",sm.get());
- sp<GrimReaper>grim=newGrimReaper();
- sm->asBinder()->linkToDeath(grim,grim.get(),0);
- charpropBuf[PROPERTY_VALUE_MAX];
- property_get("system_init.startsurfaceflinger",propBuf,"1");
- if(strcmp(propBuf,"1")==0){
- //StarttheSurfaceFlinger
- SurfaceFlinger::instantiate();
- }
- //Startthesensorservice
- SensorService::instantiate();
- //Onthesimulator,audioflingeretaldon'tgetstartedthe
- //samewayasonthedevice,andweneedtostartthemhere
- if(!proc->supportsProcesses()){
- //StarttheAudioFlinger
- AudioFlinger::instantiate();
- //Startthemediaplaybackservice
- MediaPlayerService::instantiate();
- //Startthecameraservice
- CameraService::instantiate();
- //Starttheaudiopolicyservice
- AudioPolicyService::instantiate();
- }
- //AndnowstarttheAndroidruntime.Wehavetodothisbit
- //ofnastinessbecausetheAndroidruntimeinitializationrequires
- //someofthecoresystemservicestoalreadybestarted.
- //AllotherserversshouldjuststarttheAndroidruntimeat
- //thebeginningoftheirprocesses'smain(),beforecalling
- //theinitfunction.
- LOGI("Systemserver:startingAndroidruntime.\n");
- AndroidRuntime*runtime=AndroidRuntime::getRuntime();
- LOGI("Systemserver:startingAndroidservices.\n");
- runtime->callStatic("com/android/server/SystemServer","init2");
- //Ifrunninginourownprocess,justgointothethread
- //pool.Otherwise,calltheinitializationfinished
- //functoletthisprocesscontinueitsinitilization.
- if(proc->supportsProcesses()){
- LOGI("Systemserver:enteringthreadpool.\n");
- ProcessState::self()->startThreadPool();
- IPCThreadState::self()->joinThreadPool();
- LOGI("Systemserver:exitingthreadpool.\n");
- }
- returnNO_ERROR;
- }
Step 4. AndroidRuntime.callStatic
这个函数定义在frameworks/base/core/jni/AndroidRuntime.cpp文件中:
- /*
- *CallastaticJavaProgrammingLanguagefunctionthattakesnoargumentsandreturnsvoid.
- */
- status_tAndroidRuntime::callStatic(constchar*className,constchar*methodName)
- {
- JNIEnv*env;
- jclassclazz;
- jmethodIDmethodId;
- env=getJNIEnv();
- if(env==NULL)
- returnUNKNOWN_ERROR;
- clazz=findClass(env,className);
- if(clazz==NULL){
- LOGE("ERROR:couldnotfindclass'%s'\n",className);
- returnUNKNOWN_ERROR;
- }
- methodId=env->GetStaticMethodID(clazz,methodName,"()V");
- if(methodId==NULL){
- LOGE("ERROR:couldnotfindmethod%s.%s\n",className,methodName);
- returnUNKNOWN_ERROR;
- }
- env->CallStaticVoidMethod(clazz,methodId);
- returnNO_ERROR;
- }
Step 5.SystemServer.init2
这个函数定义在frameworks/base/services/java/com/android/server/SystemServer.java文件中:
- publicclassSystemServer
- {
- ......
- publicstaticfinalvoidinit2(){
- Slog.i(TAG,"EnteredtheAndroidsystemserver!");
- Threadthr=newServerThread();
- thr.setName("android.server.ServerThread");
- thr.start();
- }
- }
Step 6.ServerThread.run
这个函数定义在frameworks/base/services/java/com/android/server/SystemServer.java文件中:
- classServerThreadextendsThread{
- ......
- @Override
- publicvoidrun(){
- ......
- IPackageManagerpm=null;
- ......
- //Criticalservices...
- try{
- ......
- Slog.i(TAG,"PackageManager");
- pm=PackageManagerService.main(context,
- factoryTest!=SystemServer.FACTORY_TEST_OFF);
- ......
- }catch(RuntimeExceptione){
- Slog.e("System","Failurestartingcoreservice",e);
- }
- ......
- }
- ......
- }
Step 7.PackageManagerService.main
这个函数定义在frameworks/base/services/java/com/android/server/PackageManagerService.java文件中:
- classPackageManagerServiceextendsIPackageManager.Stub{
- ......
- publicstaticfinalIPackageManagermain(Contextcontext,booleanfactoryTest){
- PackageManagerServicem=newPackageManagerService(context,factoryTest);
- ServiceManager.addService("package",m);
- returnm;
- }
- ......
- }
在创建这个PackageManagerService服务实例时,会在PackageManagerService类的构造函数中开始执行安装应用程序的过程:
- classPackageManagerServiceextendsIPackageManager.Stub{
- ......
- publicPackageManagerService(Contextcontext,booleanfactoryTest){
- ......
- synchronized(mInstallLock){
- synchronized(mPackages){
- ......
- FiledataDir=Environment.getDataDirectory();
- mAppDataDir=newFile(dataDir,"data");
- mSecureAppDataDir=newFile(dataDir,"secure/data");
- mDrmAppPrivateInstallDir=newFile(dataDir,"app-private");
- ......
- mFrameworkDir=newFile(Environment.getRootDirectory(),"framework");
- mDalvikCacheDir=newFile(dataDir,"dalvik-cache");
- ......
- //Findbaseframeworks(resourcepackageswithoutcode).
- mFrameworkInstallObserver=newAppDirObserver(
- mFrameworkDir.getPath(),OBSERVER_EVENTS,true);
- mFrameworkInstallObserver.startWatching();
- scanDirLI(mFrameworkDir,PackageParser.PARSE_IS_SYSTEM
- |PackageParser.PARSE_IS_SYSTEM_DIR,
- scanMode|SCAN_NO_DEX,0);
- //Collectallsystempackages.
- mSystemAppDir=newFile(Environment.getRootDirectory(),"app");
- mSystemInstallObserver=newAppDirObserver(
- mSystemAppDir.getPath(),OBSERVER_EVENTS,true);
- mSystemInstallObserver.startWatching();
- scanDirLI(mSystemAppDir,PackageParser.PARSE_IS_SYSTEM
- |PackageParser.PARSE_IS_SYSTEM_DIR,scanMode,0);
- //Collectallvendorpackages.
- mVendorAppDir=newFile("/vendor/app");
- mVendorInstallObserver=newAppDirObserver(
- mVendorAppDir.getPath(),OBSERVER_EVENTS,true);
- mVendorInstallObserver.startWatching();
- scanDirLI(mVendorAppDir,PackageParser.PARSE_IS_SYSTEM
- |PackageParser.PARSE_IS_SYSTEM_DIR,scanMode,0);
- mAppInstallObserver=newAppDirObserver(
- mAppInstallDir.getPath(),OBSERVER_EVENTS,false);
- mAppInstallObserver.startWatching();
- scanDirLI(mAppInstallDir,0,scanMode,0);
- mDrmAppInstallObserver=newAppDirObserver(
- mDrmAppPrivateInstallDir.getPath(),OBSERVER_EVENTS,false);
- mDrmAppInstallObserver.startWatching();
- scanDirLI(mDrmAppPrivateInstallDir,PackageParser.PARSE_FORWARD_LOCK,
- scanMode,0);
- ......
- }
- }
- }
- ......
- }
/system/framework
/system/app
/vendor/app
/data/app
/data/app-private
Step 8.PackageManagerService.scanDirLI
这个函数定义在frameworks/base/services/java/com/android/server/PackageManagerService.java文件中:
- classPackageManagerServiceextendsIPackageManager.Stub{
- ......
- privatevoidscanDirLI(Filedir,intflags,intscanMode,longcurrentTime){
- String[]files=dir.list();
- ......
- inti;
- for(i=0;i<files.length;i++){
- Filefile=newFile(dir,files[i]);
- if(!isPackageFilename(files[i])){
- //Ignoreentrieswhicharenotapk's
- continue;
- }
- PackageParser.Packagepkg=scanPackageLI(file,
- flags|PackageParser.PARSE_MUST_BE_APK,scanMode,currentTime);
- //Don'tmessaroundwithappsinsystempartition.
- if(pkg==null&&(flags&PackageParser.PARSE_IS_SYSTEM)==0&&
- mLastScanError==PackageManager.INSTALL_FAILED_INVALID_APK){
- //Deletetheapk
- Slog.w(TAG,"Cleaningupfailedinstallof"+file);
- file.delete();
- }
- }
- }
- ......
- }
Step 9.PackageManagerService.scanPackageLI
这个函数定义在frameworks/base/services/java/com/android/server/PackageManagerService.java文件中:
- classPackageManagerServiceextendsIPackageManager.Stub{
- ......
- privatePackageParser.PackagescanPackageLI(FilescanFile,
- intparseFlags,intscanMode,longcurrentTime){
- ......
- StringscanPath=scanFile.getPath();
- parseFlags|=mDefParseFlags;
- PackageParserpp=newPackageParser(scanPath);
- ......
- finalPackageParser.Packagepkg=pp.parsePackage(scanFile,
- scanPath,mMetrics,parseFlags);
- ......
- returnscanPackageLI(pkg,parseFlags,scanMode|SCAN_UPDATE_SIGNATURE,currentTime);
- }
- ......
- }
Step 10.PackageParser.parsePackage
这个函数定义在frameworks/base/core/java/android/content/pm/PackageParser.java文件中:
- publicclassPackageParser{
- ......
- publicPackageparsePackage(FilesourceFile,StringdestCodePath,
- DisplayMetricsmetrics,intflags){
- ......
- mArchiveSourcePath=sourceFile.getPath();
- ......
- XmlResourceParserparser=null;
- AssetManagerassmgr=null;
- booleanassetError=true;
- try{
- assmgr=newAssetManager();
- intcookie=assmgr.addAssetPath(mArchiveSourcePath);
- if(cookie!=0){
- parser=assmgr.openXmlResourceParser(cookie,"AndroidManifest.xml");
- assetError=false;
- }else{
- ......
- }
- }catch(Exceptione){
- ......
- }
- ......
- String[]errorText=newString[1];
- Packagepkg=null;
- ExceptionerrorException=null;
- try{
- //XXXXtodo:needtofigureoutcorrectconfiguration.
- Resourcesres=newResources(assmgr,metrics,null);
- pkg=parsePackage(res,parser,flags,errorText);
- }catch(Exceptione){
- ......
- }
- ......
- parser.close();
- assmgr.close();
- //Setcodeandresourcepaths
- pkg.mPath=destCodePath;
- pkg.mScanPath=mArchiveSourcePath;
- //pkg.applicationInfo.sourceDir=destCodePath;
- //pkg.applicationInfo.publicSourceDir=destRes;
- pkg.mSignatures=null;
- returnpkg;
- }
- ......
- }
- publicclassPackageParser{
- ......
- privatePackageparsePackage(
- Resourcesres,XmlResourceParserparser,intflags,String[]outError)
- throwsXmlPullParserException,IOException{
- ......
- StringpkgName=parsePackageName(parser,attrs,flags,outError);
- ......
- finalPackagepkg=newPackage(pkgName);
- ......
- inttype;
- ......
- TypedArraysa=res.obtainAttributes(attrs,
- com.android.internal.R.styleable.AndroidManifest);
- ......
- while((type=parser.next())!=parser.END_DOCUMENT
- &&(type!=parser.END_TAG||parser.getDepth()>outerDepth)){
- if(type==parser.END_TAG||type==parser.TEXT){
- continue;
- }
- StringtagName=parser.getName();
- if(tagName.equals("application")){
- ......
- if(!parseApplication(pkg,res,parser,attrs,flags,outError)){
- returnnull;
- }
- }elseif(tagName.equals("permission-group")){
- ......
- }elseif(tagName.equals("permission")){
- ......
- }elseif(tagName.equals("permission-tree")){
- ......
- }elseif(tagName.equals("uses-permission")){
- ......
- }elseif(tagName.equals("uses-configuration")){
- ......
- }elseif(tagName.equals("uses-feature")){
- ......
- }elseif(tagName.equals("uses-sdk")){
- ......
- }elseif(tagName.equals("supports-screens")){
- ......
- }elseif(tagName.equals("protected-broadcast")){
- ......
- }elseif(tagName.equals("instrumentation")){
- ......
- }elseif(tagName.equals("original-package")){
- ......
- }elseif(tagName.equals("adopt-permissions")){
- ......
- }elseif(tagName.equals("uses-gl-texture")){
- ......
- }elseif(tagName.equals("compatible-screens")){
- ......
- }elseif(tagName.equals("eat-comment")){
- ......
- }elseif(RIGID_PARSER){
- ......
- }else{
- ......
- }
- }
- ......
- returnpkg;
- }
- ......
- }
Step 11.PackageParser.parseApplication
这个函数定义在frameworks/base/core/java/android/content/pm/PackageParser.java文件中:
- publicclassPackageParser{
- ......
- privatebooleanparseApplication(Packageowner,Resourcesres,
- XmlPullParserparser,AttributeSetattrs,intflags,String[]outError)
- throwsXmlPullParserException,IOException{
- finalApplicationInfoai=owner.applicationInfo;
- finalStringpkgName=owner.applicationInfo.packageName;
- TypedArraysa=res.obtainAttributes(attrs,
- com.android.internal.R.styleable.AndroidManifestApplication);
- ......
- inttype;
- while((type=parser.next())!=parser.END_DOCUMENT
- &&(type!=parser.END_TAG||parser.getDepth()>innerDepth)){
- if(type==parser.END_TAG||type==parser.TEXT){
- continue;
- }
- StringtagName=parser.getName();
- if(tagName.equals("activity")){
- Activitya=parseActivity(owner,res,parser,attrs,flags,outError,false);
- ......
- owner.activities.add(a);
- }elseif(tagName.equals("receiver")){
- Activitya=parseActivity(owner,res,parser,attrs,flags,outError,true);
- ......
- owner.receivers.add(a);
- }elseif(tagName.equals("service")){
- Services=parseService(owner,res,parser,attrs,flags,outError);
- ......
- owner.services.add(s);
- }elseif(tagName.equals("provider")){
- Providerp=parseProvider(owner,res,parser,attrs,flags,outError);
- ......
- owner.providers.add(p);
- }elseif(tagName.equals("activity-alias")){
- Activitya=parseActivityAlias(owner,res,parser,attrs,flags,outError);
- ......
- owner.activities.add(a);
- }elseif(parser.getName().equals("meta-data")){
- ......
- }elseif(tagName.equals("uses-library")){
- ......
- }elseif(tagName.equals("uses-package")){
- ......
- }else{
- ......
- }
- }
- returntrue;
- }
- ......
- }
这里解析完成后,一层层返回到Step 9中,调用另一个版本的scanPackageLI函数把来解析后得到的应用程序信息保存下来。
Step 12.PackageManagerService.scanPackageLI
这个函数定义在frameworks/base/services/java/com/android/server/PackageManagerService.java文件中:
- classPackageManagerServiceextendsIPackageManager.Stub{
- ......
- //KeysareString(packagename),valuesarePackage.Thisalsoserves
- //asthelockfortheglobalstate.Methodsthatmustbecalledwith
- //thislockheldhavetheprefix"LP".
- finalHashMap<String,PackageParser.Package>mPackages=
- newHashMap<String,PackageParser.Package>();
- ......
- //Allavailableactivities,foryourresolvingpleasure.
- finalActivityIntentResolvermActivities=
- newActivityIntentResolver();
- //Allavailablereceivers,foryourresolvingpleasure.
- finalActivityIntentResolvermReceivers=
- newActivityIntentResolver();
- //Allavailableservices,foryourresolvingpleasure.
- finalServiceIntentResolvermServices=newServiceIntentResolver();
- //KeysareString(providerclassname),valuesareProvider.
- finalHashMap<ComponentName,PackageParser.Provider>mProvidersByComponent=
- newHashMap<ComponentName,PackageParser.Provider>();
- ......
- privatePackageParser.PackagescanPackageLI(PackageParser.Packagepkg,
- intparseFlags,intscanMode,longcurrentTime){
- ......
- synchronized(mPackages){
- ......
- //AddthenewsettingtomPackages
- mPackages.put(pkg.applicationInfo.packageName,pkg);
- ......
- intN=pkg.providers.size();
- inti;
- for(i=0;i<N;i++){
- PackageParser.Providerp=pkg.providers.get(i);
- p.info.processName=fixProcessName(pkg.applicationInfo.processName,
- p.info.processName,pkg.applicationInfo.uid);
- mProvidersByComponent.put(newComponentName(p.info.packageName,
- p.info.name),p);
- ......
- }
- N=pkg.services.size();
- for(i=0;i<N;i++){
- PackageParser.Services=pkg.services.get(i);
- s.info.processName=fixProcessName(pkg.applicationInfo.processName,
- s.info.processName,pkg.applicationInfo.uid);
- mServices.addService(s);
- ......
- }
- N=pkg.receivers.size();
- r=null;
- for(i=0;i<N;i++){
- PackageParser.Activitya=pkg.receivers.get(i);
- a.info.processName=fixProcessName(pkg.applicationInfo.processName,
- a.info.processName,pkg.applicationInfo.uid);
- mReceivers.addActivity(a,"receiver");
- ......
- }
- N=pkg.activities.size();
- for(i=0;i<N;i++){
- PackageParser.Activitya=pkg.activities.get(i);
- a.info.processName=fixProcessName(pkg.applicationInfo.processName,
- a.info.processName,pkg.applicationInfo.uid);
- mActivities.addActivity(a,"activity");
- ......
- }
- ......
- }
- ......
- returnpkg;
- }
- ......
- }
这个函数主要就是把前面解析应用程序得到的package、provider、service、receiver和activity等信息保存在PackageManagerService服务中了。
这样,在Android系统启动的时候安装应用程序的过程就介绍完了,但是,这些应用程序只是相当于在PackageManagerService服务注册好了,如果我们想要在Android桌面上看到这些应用程序,还需要有一个Home应用程序,负责从PackageManagerService服务中把这些安装好的应用程序取出来,并以友好的方式在桌面上展现出来,例如以快捷图标的形式。在Android系统中,负责把系统中已经安装的应用程序在桌面中展现出来的Home应用程序就是Launcher了,在下一篇文章中,我们将介绍Launcher是如何启动的以及它是如何从PackageManagerService服务中把系统中已经安装好的应用程序展现出来的,敬请期待。
相关推荐
Android系统默认Home应用程序(Launcher)的启动过程源代码分析uml,Android系统在新进程中启动自定义服务过程(startService)的原理分析UML,Android应用程序安装过程源代码分析UML.jpg,Android应用程序绑定服务...
《21世纪高等学校计算机基础实用规划教材:Android应用程序设计》是面向Android系统的初学者的入门教程,内容几乎涵盖了Android相关的所有技术。本书大致可以分成两个部分,第一部分(第1~4章)主要介绍Android SDK...
在组织上,《Android系统源代码情景分析(含CD光盘1张)》将上述内容划分为初识Android系统、Android专用驱动系统和Android应用程序框架三大篇。初识Android系统篇介绍了参考书籍、基础知识以及实验环境搭建;...
《Android系统源代码情景分析》随书光盘内容(源代码) 目录如下: 第1篇 初识Android系统 ...第16章 Android应用程序的安装和显示过程 16.1 应用程序的安装过程 16.2 应用程序的显示过程
88个经典Android应用程序打包下载 学习Android必备代码
《Android系统源代码情景分析》随书光盘内容(源代码) 目录如下: 第1篇 初识Android系统 第1章 准备知识 ...第16章 Android应用程序的安装和显示过程 16.1 应用程序的安装过程 16.2 应用程序的显示过程
Android应用程序框架篇从组件、进程、消息以及安装四个维度来对Android应用程序的框架进行了深入的剖析。, 通过上述内容及其组织,本书能使读者既能从整体上把握Android系统的层次结构,又能从细节上去掌握每一个...
Android应用程序框架篇从组件、进程、消息以及安装四个维度来对Android应用程序的框架进行了深入的剖析。 通过上述内容及其组织,本书能使读者既能从整体上把握Android系统的层次结构,又能从细节上去掌握每一个层次...
3.1 Android应用程序的组成部分 43 3.2 程序清单简介 44 3.3 使用清单编辑器 47 3.4 Android应用程序生命周期 48 3.5 理解应用程序的优先级和进程状态 49 3.6 分离资源 50 3.6.1 创建资源 50 3.6.2 使用资源...
Android应用程序框架篇从组件、进程、消息以及安装四个维度对Android应用程序的框架进行了深入的剖析。 通过上述内容及其组织,本书能使读者既能从整体上把握Android系统的层次结构,又能从细节上掌握每一个层次的...
在内容上,本书结合使用情景,全面、深入、细致地分析Android系统的源代码,涉及到Linux内核层、硬件抽象层(HAL)、运行时库层(Runtime)、应用程序框架层(Application Framework)以及应用程序层(Application)。...
罗升阳,2007年毕业于浙江大学计算机系,2010年毕业于上海交通大学计算机系,在国内知名IT技术社区CSDN上发表...Android应用程序框架篇从组件、进程、消息以及安装四个维度来对Android应用程序的框架进行了深入的剖析。
Android应用源码之程序的安装、卸载和更新
Android应用程序框架篇从组件、进程、消息以及安装四个维度对Android应用程序的框架进行了深入的剖析。 通过上述内容及其组织,本书能使读者既能从整体上把握Android系统的层次结构,又能从细节上掌握每一个层次的...
Android系统源代码情景分析光盘资料 目录 第1篇初识Android系统 第1章 准备知识................................................................ 2 1.1 Linux内核参考书籍......................................
1.1.4 android应用程序框架 1.1.5 android的竞争优势 1.1.6 android模拟器 1.2 搭建android开发环境 1.2.1 准备工作 1.2.2 windows系统下的搭建过程 1.2.3 linux系统下的搭建过程 1.3 常见问题汇总 1.4 使用本书的...
Android应用程序框架篇从组件、进程、消息以及安装四个维度对Android应用程序的框架进行了深入的剖析。 通过上述内容及其组织,本书能使读者既能从整体上把握Android系统的层次结构,又能从细节上掌握每一个层次的...
在内容上,本书结合使用情景,全面、深入、细致地分析了Android系统的源代码,涉及到Linux内核层、硬件抽象层(HAL)、运行时库层(Runtime)、应用程序框架层(Application Framework)以及应用程序层(Application...
Android应用程序框架篇从组件、进程、消息以及安装四个维度对Android应用程序的框架进行了深入的剖析。 通过上述内容及其组织,本书能使读者既能从整体上把握Android系统的层次结构,又能从细节上掌握每一个层次的...
本人想学习android1.5中系统应用程序如:联系人,发邮件,googlesearch,摄像,闹钟,日历,Mms,Music,Settings,Phone,Browser,HTMLViewer,IM等等android系统自带的应用程序.发现网上没有这些源码下载,于是自己用了...