当前位置:文档之家› android APK应用安装过程以及默认安装路径

android APK应用安装过程以及默认安装路径

android APK应用安装过程以及默认安装路径
android APK应用安装过程以及默认安装路径

android APK应用安装过程以及默认安装路径

分类:

Android

一:安装过程

APK是类似Symbian Sis或Sisx的文件格式。通过将APK文件直接传到Android模拟器或Android手机中执行即可安装。

Android应用安装有如下四种方式

1. 系统应用安装――开机时完成,没有安装界面

2. 网络下载应用安装――通过market应用完成,没有安装界面

3. ADB工具安装――没有安装界面。

4. 第三方应用安装――通过SD卡里的APK文件安装,有安装界面,由packageinstaller.apk应用处理安装及卸载过程的界面。

应用安装的流程及路径

应用安装涉及到如下几个目录:

system/app

系统自带的应用程序,无法删除

data/app

用户程序安装的目录,有删除权限。

安装时把apk文件复制到此目录

data/data

存放应用程序的数据

Data/dalvik-cache

将apk中的dex文件安装到dalvik-cache目录下(dex文件是dalvik虚拟机的可执行文件,其大小约为原始apk文件大小的四分之一)

安装过程:复制APK安装包到data/app目录下,解压并扫描安装包,把dex文件(Dalvik 字节码)保存到dalvik-cache目录,并data/data目录下创建对应的应用数据目录。

卸载过程:删除安装过程中在上述三个目录下创建的文件及目录。

一、系统应用安装:

PackageManagerService处理各种应用的安装,卸载,管理等工作,开机时由systemServer 启动此服务

(源文件路径:

android\frameworks\base\services\java\com\android\server\PackageManagerService.jav a)

PackageManagerService服务启动的流程:

1. 首先扫描安装“system\framework”目录下的jar包

1. scanDirLI(mFrameworkDir,PackageParser.PARSE_IS_SYSTEM,

scanMode | SCAN_NO_DEX);

2.第二步扫描安装“system\app”目录下的各个系统应用

scanDirLI(mSystemAppDir,PackageParser.PARSE_IS_SYSTEM, scanMode);

3.第三步扫描“data\app”目录,即用户安装的第三方应用

scanDirLI(mAppInstallDir, 0, scanMode);

4.第四步扫描" data\app-private"目录,即安装DRM保护的APK文件(目前没有遇到过此类的应用)。

scanDirLI(mDrmAppPrivateInstallDir,0, scanMode | SCAN_FORWARD_LOCKED);

安装应用的过程

1.scanDirLI(Filedir, int flags, int scanMode) 遍历安装指定目录下的文件

2.scanPackageLI(FilescanFile,

File destCodeFile, FiledestResourceFile, int parseFlags,

int scanMode) 安装package文件

3.scanPackageLI(

File scanFile, File destCodeFile, FiledestResourceFile,

PackageParser.Package pkg, intparseFlags, int scanMode)

通过解析安装包parsePackage获取到安装包的信息结构

4.mInstaller.install(pkgName,pkg.applicationInfo.uid,

pkg.applicationInfo.uid); 实现文件复制的安装过程

(源文件路径:frameworks\base\cmds\installd\installd.install)

二、从market上下载应用:

Google Market应用需要使用gmail账户登录才可以使用,选择某一应用后,开始下载安装包,此过程中,在手机的信号区有进度条提示,下载完成后,会自动调用Packagemanager 的接口安装,调用接口如下:

public voidinstallPackage(final Uri packageURI, final IPackageInstallObserver observer,final int flags)

final Uri packageURI:文件下载完成后保存的路径

final IPackageInstallObserver observer:处理返回的安装结果

final int flags:安装的参数,从market上下载的应用,安装参数为-r (replace)

installPackage接口函数的安装过程:

1.public voidinstallPackage(

final Uri packageURI, final IPackageInstallObserverobserver, final int flags,

final String installerPackageName)

final StringinstallerPackageName:安装完成后此名称保存在settings里,一般为null,不是关键参数

2.FiletmpPackageFile = copyTempInstallFile(packageURI, res);

把apk文件复制到临时目录下的临时文件

3.private voidinstallPackageLI(Uri pPackageURI,

int pFlags, boolean newInstall,String installerPackageName,

File tmpPackageFile, PackageInstalledInfo res)

解析临时文件,获取应用包名pkgName = PackageParser.parsePackageName(

tmpPackageFile.getAbsolutePath(), 0);

4.判断如果带有参数INSTALL_REPLACE_EXISTING,则调用

replacePackageLI(pkgName,

tmpPackageFile,

destFilePath,destPackageFile, destResourceFile,

pkg, forwardLocked,newInstall, installerPackageName,

res)

5.如果没有,则调用installNewPackageLI(pkgName,

tmpPackageFile,

destFilePath,destPackageFile, destResourceFile,

pkg,forwardLocked, newInstall, installerPackageName,

res);

6.privatePackageParser.Package scanPackageLI(

File scanFile, File destCodeFile, FiledestResourceFile,

PackageParser.Package pkg, intparseFlags, int scanMode)

scanPackageLI以后的流程,与开机时的应用安装流程相同。

三、从ADB工具安装

Android Debug Bridge (adb) 是SDK自带的管理设备的工具,通过ADB命令行的方式也

可以为手机或模拟器安装应用,其入口函数源文件为pm.java

(源文件路径:android\frameworks\base\cmds\pm\src\com\android\commands\pm\pm.java)

ADB命令行的形式为adb install ,还可以带安装参数如:"-l""-r" "-i" "-t"

函数runInstall()中判断参数

"-l"――INSTALL_FORWARD_LOCK

"-r"——INSTALL_REPLACE_EXISTING

"-i" ——installerPackageName

"-t"——INSTALL_ALLOW_TEST

我们常用的参数为-r,表示覆盖安装手机上已安装的同名应用。从market上下载的应用,也是直接传入这个参数安装的。

runInstall与market调用同样的接口完成应用安装。

public voidinstallPackage(https://www.doczj.com/doc/289886799.html,.Uri

packageURI,android.content.pm.IPackageInstallObserver observer, int

flags,https://www.doczj.com/doc/289886799.html,ng.String installerPackageName)

四、第三方应用安装――通过SD卡里的APK文件安装

把APK安装包保存在SD卡中,从手机里访问SD卡中的APK安装包,点击就可以启动安装界面,系统应用Packageinstaller.apk处理这种方式下的安装及卸载界面流程,如下图:

PackageInstallerActivity负责解析包,判断是否是可用的Apk文件

创建临时安装文件/data/data/com.android.packageinstaller/files/ApiDemos.apk

并启动安装确认界面startInstallConfirm,列出解析得到的该应用基本信息。如果手机上已安装有同名应用,则需要用户确认是否要替换安装。

确认安装后,启动InstallAppProgress,调用安装接口完成安装。

pm.installPackage(mPackageURI,observer, installFlags);

其它:

1. PackageManagerService.java的内部类AppDirObserver实现了监听app目录的功能:当把某个APK拖到app目录下时,可以直接调用scanPackageLI完成安装。

2.手机数据区目录“data/system/packages.xml”文件中,包含了手机上所有已安装应用的基本信息,如安装路径,申请的permission等信息。

二:更改默认安装路径

如果你是一个apk应用开发者,没用android系统全套代码,你只想更改你的APK的默认

安装路径的话,可以按下面方法来更改:

在AndroidManifest.xml文件Manifest标签中添加android:installLocation属性

android:installLocation

这个属性设置的是默认安装位置,共有三个有效值,auto、internalOnly、preferExternal 对应表

auto 表示自动,由系统决定安装位置,如果系统手机内存足够,默认安装在手机内存里,如果手机内在不够,则会安装在T卡内

internalOnly 安装在手机内存

xmlns:android="https://www.doczj.com/doc/289886799.html,/apk/res/android "

package="com.ray"

android:installLocation="auto"

android:versionCode="1"

android:versionName="1.0">

如果你是一个手机方案开发者,能改framework层的代码,你希望下载到手机里的APK都默认优先安装到T卡的话,可以按下面方法更改:

在PackageParser.java文件里,将private static final int

PARSE_DEFAULT_INSTALL_LOCATION 这个

PARSE_DEFAULT_INSTALL_LOCATION值,改为

PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL,就可以了.默认下载就会下到T卡里,T卡不存在或者满了时,才会下到手机内部. 或者如果在应用的AndroidManifest.xml里,指定了installLocation属性为手机内部存储的话,是会存在手机内部的.没指这定的话,PARSE_DEFAULT_INSTALL_LOCATION这个值指定什么,就下到哪里

安装在T卡里的应用,有几个缺点:

1:因为android装载T卡是在系统启动完成后,才开始装载的.所以如果应用装在T卡里的话,那么它是收不到开机启动完成的BOOT_COMPLETED这个广播的

2:如果T卡损坏或者T卡拨出来了,那么装在T卡里的应用是启动不了的.

系统应用安装的详细过程,老罗有篇文章写得很透彻,这里引用下:

Android系统在启动的过程中,会启动一个应用程序管理服务PackageManagerService,这个服务负责扫描系统中特定的目录,找到里面的应用程序文件,即以Apk为后缀的文件,然后对这些文件进解析,得到应用程序的相关信息,完成应用程序的安装过程,本文将详细分析这个过程。

应用程序管理服务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 文件中:

[java]view plaincopy

1.public class SystemServer

3. ......

4.

5.native public static void init1(String[] args);

6.

7. ......

8.

9.public static void main(String[] args) {

10. ......

11.

12. init1(args);

13.

14. ......

15. }

16.

17. ......

18.}

SystemServer组件是由Zygote进程负责启动的,启动的时候就会调用它的main函数,这个函数主要调用了JNI方法init1来做一些系统初始化的工作。

Step 2. SystemServer.init1

这个函数是一个JNI方法,实现

在 frameworks/base/services/jni/com_android_server_SystemServer.cpp文件中:

[cpp]view plaincopy

https://www.doczj.com/doc/289886799.html,space android {

2.

3.extern"C"int system_init();

4.

5.static void android_server_SystemServer_init1(JNIEnv* env, jobject clazz)

6.{

7. system_init();

8.}

9.

10./*

11. * JNI registration.

12. */

13.static JNINativeMethod gMethods[] = {

14./* name, signature, funcPtr */

15. { "init1", "([Ljava/lang/String;)V", (void*) android_server_SystemSer

ver_init1 },

16.};

18.int register_android_server_SystemServer(JNIEnv* env)

19.{

20.return jniRegisterNativeMethods(env, "com/android/server/SystemServer

",

21. gMethods, NELEM(gMethods));

22.}

23.

24.}; // namespace android

这个函数很简单,只是调用了system_init函数来进一步执行操作。

Step 3. libsystem_server.system_init

函数system_init实现在libsystem_server库中,源代码位于

frameworks/base/cmds/system_server/library/system_init.cpp文件中:

[cpp]view plaincopy

1.extern"C" status_t system_init()

2.{

3. LOGI("Entered system_init()");

4.

5. sp proc(ProcessState::self());

6.

7. sp sm = defaultServiceManager();

8. LOGI("ServiceManager: %p\n", sm.get());

9.

10. sp grim = new GrimReaper();

11. sm->asBinder()->linkToDeath(grim, grim.get(), 0);

12.

13.char propBuf[PROPERTY_VALUE_MAX];

14. property_get("system_init.startsurfaceflinger", propBuf, "1");

15.if (strcmp(propBuf, "1") == 0) {

16.// Start the SurfaceFlinger

17. SurfaceFlinger::instantiate();

18. }

19.

20.// Start the sensor service

21. SensorService::instantiate();

22.

23.// On the simulator, audioflinger et al don't get started the

24.// same way as on the device, and we need to start them here

25.if (!proc->supportsProcesses()) {

26.

27.// Start the AudioFlinger

28. AudioFlinger::instantiate();

30.// Start the media playback service

31. MediaPlayerService::instantiate();

32.

33.// Start the camera service

34. CameraService::instantiate();

35.

36.// Start the audio policy service

37. AudioPolicyService::instantiate();

38. }

39.

40.// And now start the Android runtime. We have to do this bit

41.// of nastiness because the Android runtime initialization requires

42.// some of the core system services to already be started.

43.// All other servers should just start the Android runtime at

44.// the beginning of their processes's main(), before calling

45.// the init function.

46. LOGI("System server: starting Android runtime.\n");

47.

48. AndroidRuntime* runtime = AndroidRuntime::getRuntime();

49.

50. LOGI("System server: starting Android services.\n");

51. runtime->callStatic("com/android/server/SystemServer", "init2");

52.

53.// If running in our own process, just go into the thread

54.// pool. Otherwise, call the initialization finished

55.// func to let this process continue its initilization.

56.if (proc->supportsProcesses()) {

57. LOGI("System server: entering thread pool.\n");

58. ProcessState::self()->startThreadPool();

59. IPCThreadState::self()->joinThreadPool();

60. LOGI("System server: exiting thread pool.\n");

61. }

62.

63.return NO_ERROR;

64.}

这个函数首先会初始化SurfaceFlinger、SensorService、AudioFlinger、MediaPlayerService、CameraService和AudioPolicyService这几个服务,然后就通过系统全局唯一的AndroidRuntime实例变量runtime的callStatic来调用SystemServer的init2函数了。关于这个AndroidRuntime实例变量runtime的相关资料,可能参考前面一篇文章Android应用程序进程启动过程的源代码分析一文。

Step 4. AndroidRuntime.callStatic

这个函数定义在frameworks/base/core/jni/AndroidRuntime.cpp文件中:

[cpp]view plaincopy

1./*

2.* Call a static Java Programming Language function that takes no argument

s and returns void.

3.*/

4.status_t AndroidRuntime::callStatic(const char* className, const char* me

thodName)

5.{

6. JNIEnv* env;

7. jclass clazz;

8. jmethodID methodId;

9.

10. env = getJNIEnv();

11.if (env == NULL)

12.return UNKNOWN_ERROR;

13.

14. clazz = findClass(env, className);

15.if (clazz == NULL) {

16. LOGE("ERROR: could not find class '%s'\n", className);

17.return UNKNOWN_ERROR;

18. }

19. methodId = env->GetStaticMethodID(clazz, methodName, "()V");

20.if (methodId == NULL) {

21. LOGE("ERROR: could not find method %s.%s\n", className, methodNam

e);

22.return UNKNOWN_ERROR;

23. }

24.

25. env->CallStaticVoidMethod(clazz, methodId);

26.

27.return NO_ERROR;

28.}

这个函数调用由参数className指定的java类的静态成员函数,这个静态成员函数是由参数methodName指定的。上面传进来的参数className的值为

"com/android/server/SystemServer",而参数methodName的值为"init2",因此,接下来就会调用SystemServer类的init2函数了。

Step 5. SystemServer.init2

这个函数定义在frameworks/base/services/java/com/android/server/SystemServer.java 文件中:

[java]view plaincopy

1.public class SystemServer

2.{

3. ......

4.

5.public static final void init2() {

6. Slog.i(TAG, "Entered the Android system server!");

7. Thread thr = new ServerThread();

8. thr.setName("android.server.ServerThread");

9. thr.start();

10. }

11.}

这个函数创建了一个ServerThread线程,PackageManagerService服务就是这个线程中启动的了。这里调用了ServerThread实例thr的start函数之后,下面就会执行这个实例的run 函数了。

Step 6. ServerThread.run

这个函数定义在frameworks/base/services/java/com/android/server/SystemServer.java 文件中:

[java]view plaincopy

1.class ServerThread extends Thread {

2. ......

3.

4.@Override

5.public void run() {

6. ......

7.

8. IPackageManager pm = null;

9.

10. ......

11.

12.// Critical services...

13.try {

14. ......

15.

16. Slog.i(TAG, "Package Manager");

17. pm = PackageManagerService.main(context,

18. factoryTest != SystemServer.FACTORY_TEST_OFF);

19.

20. ......

21. } catch (RuntimeException e) {

22. Slog.e("System", "Failure starting core service", e);

23. }

24.

25. ......

26. }

27.

28. ......

29.}

这个函数除了启动PackageManagerService服务之外,还启动了其它很多的服务,例如在前面学习Activity和Service的几篇文章中经常看到的ActivityManagerService服务,有兴趣的读者可以自己研究一下。

Step 7. PackageManagerService.main

这个函数定义在

frameworks/base/services/java/com/android/server/PackageManagerService.java文件中:[cpp]view plaincopy

1.class PackageManagerService extends IPackageManager.Stub {

2. ......

3.

4.public static final IPackageManager main(Context context, boolean fac

toryTest) {

5. PackageManagerService m = new PackageManagerService(context, fact

oryTest);

6. ServiceManager.addService("package", m);

7.return m;

8. }

9.

10. ......

11.}

这个函数创建了一个PackageManagerService服务实例,然后把这个服务添加到ServiceManager中去,ServiceManager是Android系统Binder进程间通信机制的守护进程,负责管理系统中的Binder对象,具体可以参考浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路一文。

在创建这个PackageManagerService服务实例时,会在PackageManagerService类的构造函数中开始执行安装应用程序的过程:

[java]view plaincopy

1.class PackageManagerService extends IPackageManager.Stub {

2. ......

3.

4.public PackageManagerService(Context context, boolean factoryTest) {

5. ......

6.

7.synchronized (mInstallLock) {

8.synchronized (mPackages) {

9. ......

10.

11. File dataDir = Environment.getDataDirectory();

12. mAppDataDir = new File(dataDir, "data");

13. mSecureAppDataDir = new File(dataDir, "secure/data");

14. mDrmAppPrivateInstallDir = new File(dataDir, "app-private

");

15.

16. ......

17.

18. mFrameworkDir = new File(Environment.getRootDirectory(),

"framework");

19. mDalvikCacheDir = new File(dataDir, "dalvik-cache");

20.

21. ......

22.

23.// Find base frameworks (resource packages without code).

24. mFrameworkInstallObserver = new AppDirObserver(

25. mFrameworkDir.getPath(), OBSERVER_EVENTS, true);

26. mFrameworkInstallObserver.startWatching();

27. scanDirLI(mFrameworkDir, PackageParser.PARSE_IS_SYSTEM

28. | PackageParser.PARSE_IS_SYSTEM_DIR,

29. scanMode | SCAN_NO_DEX, 0);

30.

31.// Collect all system packages.

32. mSystemAppDir = new File(Environment.getRootDirectory(),

"app");

33. mSystemInstallObserver = new AppDirObserver(

34. mSystemAppDir.getPath(), OBSERVER_EVENTS, true);

35. mSystemInstallObserver.startWatching();

36. scanDirLI(mSystemAppDir, PackageParser.PARSE_IS_SYSTEM

37. | PackageParser.PARSE_IS_SYSTEM_DIR, scanMode, 0);

38.

39.// Collect all vendor packages.

40. mVendorAppDir = new File("/vendor/app");

41. mVendorInstallObserver = new AppDirObserver(

42. mVendorAppDir.getPath(), OBSERVER_EVENTS, true);

43. mVendorInstallObserver.startWatching();

44. scanDirLI(mVendorAppDir, PackageParser.PARSE_IS_SYSTEM

45. | PackageParser.PARSE_IS_SYSTEM_DIR, scanMode, 0);

46.

47.

48. mAppInstallObserver = new AppDirObserver(

49. mAppInstallDir.getPath(), OBSERVER_EVENTS, false);

50. mAppInstallObserver.startWatching();

51. scanDirLI(mAppInstallDir, 0, scanMode, 0);

52.

53. mDrmAppInstallObserver = new AppDirObserver(

54. mDrmAppPrivateInstallDir.getPath(), OBSERVER_EVENTS,

false);

55. mDrmAppInstallObserver.startWatching();

56. scanDirLI(mDrmAppPrivateInstallDir, PackageParser.PARSE_F

ORWARD_LOCK,

57. scanMode, 0);

58.

59. ......

60. }

61. }

62. }

63.

64. ......

65.}

这里会调用scanDirLI函数来扫描移动设备上的下面这五个目录中的Apk文件:

/system/framework

/system/app

/vendor/app

/data/app

/data/app-private

Step 8. PackageManagerService.scanDirLI

这个函数定义在

frameworks/base/services/java/com/android/server/PackageManagerService.java文件中:[java]view plaincopy

1.class PackageManagerService extends IPackageManager.Stub {

2. ......

3.

4.private void scanDirLI(File dir, int flags, int scanMode, long curren

tTime) {

什么是APK文件,如何在Android手机安装APK文件

什么是APK文件,如何在Android手机安装APK文件 虽然Android手机用户可以在电子市场(Android Market)找到几乎所有你需要的应用程序下载并安装。不过你还是有时候会在论坛和Android应用程序下载网站接触到一种后缀名为APK 的安装文件,APK是Android Package的英文缩写,和诺基亚S60系统的sis文件类似,APK 文件是Android平台移动设备的专用安装文件格式。APK文件本质上是JAR(Java ARchive)文件的一个变种。 我们之所以要使用到APK文件在Android手机上安装应用程序有以下几种可能: Android开发者想要把自己的应用程序上传到Android电子市场必须交纳25美元的注册费并且进行开通Google Checkout以及绑定信用卡等非常复杂的操作,对国内开发者非常不友好,所以部分开发者只以APK文件方式分发自己的Android程序。 中国大陆Android用户不支持在电子市场购买付费程序,但是很多国外的用户自己购买Android付费程序后通过技术手段导出该程序的APK安装文件,并且在论坛或者相关网站分享给其他用户下载,让我们也可以在Android手机上体验功能更强大的付费应用程序。 Android智能手机和PC一样有时候也需要重新安装系统(刷机),那么在重装系统之前可以通过软件把自己安装的所有程序备份为APK文件,等到系统安装完成后再安装这些APK文件恢复之前的应用程序。采用这种方式既方便又可以节省网络流量费用。 通过电子市场安装APK文件到Android手机 使用下面的办法就可以安装下载的APK文件到手机 1.打开Android手机设置菜单,进入应用程序设置,勾选“未知来源”选项,然后进入开发设置,再勾选“USB调试”选项 2.拷贝APK安装文件到Android手机内存卡,不一定是内存卡根目录 3.从Android电子市场下载一款APK安装软件,电子市场有很多这种类型的软件,比如这款Apk Manager。 4.打开Apk Manager软件(其他APK安装软件操作类似),程序会自动扫描并显示手机内存卡里的APK文件。 5.点击APK文件就可以安装程序。 如果你觉得每次使用USB连接线APK文件拷贝到内存卡安装太麻烦,或者是你碰巧身边没有USB连接线,你还可以把APK文件作为附件发送到Gmail邮箱,然后在手机打开Gmail 程序并点击附件下载,下载完成后会就可以通过tAttachApkInstaller(电子市场有下载,需要提前安装)程序安装。

android系统开机启动流程分析

一,系统引导bootloader 加电,cpu执行bootloader程序,正常启动系统,加载boot.img【其中包含内核。还有ramdisk】 二,内核kernel bootloader加载kernel,kernel自解压,初始化,载入built-in驱动程序,完成启动。 内核启动后会创建若干内核线程,在后装入并执行程序/sbin/init/,载入init process,切换至用户空间(user-space) 内核zImage解压缩 head.S【这是ARM-Linux运行的第一个文件,这些代码是一个比较独立的代码包裹器。其作用就是解压Linux内核,并将PC指针跳到内核(vmlinux)的第一条指令】首先初始化自解压相关环境(内存等),调用decompress_kernel进行解压,解压后调用start_kernel启动内核【start_kernel是任何版本linux内核的通用初始化函数,它会初始化很多东西,输出linux版本信息,设置体系结构相关的环境,页表结构初始化,设置系 统自陷入口,初始化系统IRQ,初始化核心调度器等等】,最后调用rest_init【rest_init 会调用kernel_init启动init进程(缺省是/init)。然后执行schedule开始任务调度。这个init是由android的./system/core/init下的代码编译出来的,由此进入了android的代码】。 三,Init进程启动 【init是kernel启动的第一个进程,init启动以后,整个android系统就起来了】 init进程启动后,根据init.rc 和init. .rc脚本文件建立几个基本 服务(servicemanager zygote),然后担当property service 的功能 打开.rc文件,解析文件内容。【system/core/init/init.c】将service信息放置到service.list中【system/core/init/init_parser.c】。 建立service进程。【service_start(…) execve(…)】 在init.c中,完成以下工作 1、初始化log系统【解析/init.rc和init.%hardware%.rc文件,在两个 文件解析步骤2时执行“early-init”行动】 2、初始化设备【在/dev下创建所有设备节点,下载firmwares】 3、初始化属性服务器【在两个文件解析步骤2时执行“init”行动】

Android源码下载方法详解

Android: Android源码下载方法详解 分类:Android平台 安卓源码下载地址:https://www.doczj.com/doc/289886799.html,/source/downloading.html 相信很多下载过内核的人都对这个很熟悉 git clone git://https://www.doczj.com/doc/289886799.html,/kernel/common.git kernel 但是这是在以前,现在如果这么执行的话,会显示如下内容 Initialized empty Git repository in /home/star/working/kernel/.git/ https://www.doczj.com/doc/289886799.html,[0: 149.20.4.77]: errno=Connection refused fatal: unable to connect a socket (Connection refused) 通过浏览器输入https://www.doczj.com/doc/289886799.html,/,发现该网站已经被重定向为 https://www.doczj.com/doc/289886799.html,/source/downloading.html 可以在该页面的最后发现内核的下载方法。 下面我们介绍一下Android源码下载的步骤。 工作环境: 操作系统:Ubuntu 10.04 或Ubuntu10.10 git程序:1.7.0.4 或1.7.1 转载请注明出处:https://www.doczj.com/doc/289886799.html,/pku_android 方法一: 1.1 初始化安装环境 参考网页https://www.doczj.com/doc/289886799.html,/source/initializing.html 主要要做的就是安装jdk和安装一些软件包 $ sudo apt-get install git-core gnupg flex bison gperf build-essential \ zip curl zlib1g-dev libc6-dev libncurses5-dev x11proto-core-dev \ libx11-dev libreadline6-dev libgl1-mesa-dev tofrodos python-markdown \ libxml2-utils 如果已经安装了,就不许要这步了 1.2 无论下载内核和源码,都需要进行如下操作 参考网页https://www.doczj.com/doc/289886799.html,/source/downloading.html $ mkdir ~/bin $ PATH=~/bin:$PATH $ curl https://https://www.doczj.com/doc/289886799.html,/dl/googlesource/git-repo/repo > ~/bin/repo 如果出现: repo init error: could not verify the tag 'v1.12.7',

Android 开机启动流程

Android的开机流程 1. 系统引导bootloader 1) 源码:bootable/bootloader/* 2) 说明:加电后,CPU将先执行bootloader程序,此处有三种选择 a) 开机按Camera+Power启动到fastboot,即命令或SD卡烧写模式,不加载内核及文件系统,此处可以进行工厂模式的烧写 b) 开机按Home+Power启动到recovery模式,加载recovery.img,recovery.i mg包含内核,基本的文件系统,用于工程模式的烧写 c) 开机按Power,正常启动系统,加载boot.img,boot.img包含内核,基本文件系统,用于正常启动手机(以下只分析正常启动的情况) 2. 内核kernel 1) 源码:kernel/* 2) 说明:kernel由bootloader加载 3. 文件系统及应用init 1) 源码:system/core/init/* 2) 配置文件:system/rootdir/init.rc, 3) 说明:init是一个由内核启动的用户级进程,它按照init.rc中的设置执行:启动服务(这里的服务指linux底层服务,如adbd提供adb支持,vold提供SD卡挂载等),执行命令和按其中的配置语句执行相应功能 4. 重要的后台程序zygote 1)源码:frameworks/base/cmds/app_main.cpp等 2) 说明:zygote是一个在init.rc中被指定启动的服务,该服务对应的命令是/system/bin/app_process a)建立Java Runtime,建立虚拟机 b) 建立Socket接收ActivityManangerService的请求,用于Fork应用程序 c) 启动System Server 5. 系统服务system server 1)源码:frameworks/base/services/java/com/android/server/SystemServer.jav a 2) 说明:被zygote启动,通过SystemManager管理android的服务(这里的服务指frameworks/base/services下的服务,如卫星定位服务,剪切板服务等) 6. 桌面launcher 1)源码:ActivityManagerService.java为入口,packages/apps/launcher*实现 2) 说明:系统启动成功后SystemServer使用xxx.systemReady()通知各个服务,系统已经就绪,桌面程序Home就是在ActivityManagerService.systemReady()通知的过程中建立的,最终调用()启launcher 7. 解锁 1) 源码: frameworks/policies/base/phone/com/android/internal/policy/impl/*lock* 2) 说明:系统启动成功后SystemServer调用wm.systemReady()通知WindowManagerService,进而调用PhoneWindowManager,最终通过LockPatternKeyguardView显示解锁界面,跟踪代码可以看到解锁界面并不是一个Activity,这是只是向特定层上绘图,其代码了存放在特殊的位置

linux内核启动 Android系统启动过程详解

linux内核启动+Android系统启动过程详解 第一部分:汇编部分 Linux启动之 linux-rk3288-tchip/kernel/arch/arm/boot/compressed/ head.S分析这段代码是linux boot后执行的第一个程序,完成的主要工作是解压内核,然后跳转到相关执行地址。这部分代码在做驱动开发时不需要改动,但分析其执行流程对是理解android的第一步 开头有一段宏定义这是gnu arm汇编的宏定义。关于GUN 的汇编和其他编译器,在指令语法上有很大差别,具体可查询相关GUN汇编语法了解 另外此段代码必须不能包括重定位部分。因为这时一开始必须要立即运行的。所谓重定位,比如当编译时某个文件用到外部符号是用动态链接库的方式,那么该文件生成的目标文件将包含重定位信息,在加载时需要重定位该符号,否则执行时将因找不到地址而出错 #ifdef DEBUG//开始是调试用,主要是一些打印输出函数,不用关心 #if defined(CONFIG_DEBUG_ICEDCC)

……具体代码略 #endif 宏定义结束之后定义了一个段, .section ".start", #alloc, #execinstr 这个段的段名是 .start,#alloc表示Section contains allocated data, #execinstr表示Section contains executable instructions. 生成最终映像时,这段代码会放在最开头 .align start: .type start,#function /*.type指定start这个符号是函数类型*/ .rept 8 mov r0, r0 //将此命令重复8次,相当于nop,这里是为中断向量保存空间 .endr b 1f .word 0x016f2818 @ Magic numbers to help the loader

androidAPK应用安装过程以及默认安装路径

应用安装过程以及默认安装路径 分类: 一:安装过程 是类似或的文件格式。通过将文件直接传到模拟器或手机中执行即可安装。 应用安装有如下四种方式 1. 系统应用安装――开机时完成,没有安装界面 2. 网络下载应用安装――通过应用完成,没有安装界面 3. 工具安装――没有安装界面。 4. 第三方应用安装――通过卡里的文件安装,有安装界面,由应用处理安装及卸载过程的界面。 应用安装的流程及路径 应用安装涉及到如下几个目录: 系统自带的应用程序,无法删除 用户程序安装的目录,有删除权限。

安装时把文件复制到此目录 存放应用程序的数据 将中的文件安装到目录下(文件是虚拟机的可执行文件,其大小约为原始文件大小的四分之一) 安装过程:复制安装包到目录下,解压并扫描安装包,把文件(字节码)保存到目录,并目录下创建对应的应用数据目录。 卸载过程:删除安装过程中在上述三个目录下创建的文件及目录。 一、系统应用安装: 处理各种应用的安装,卸载,管理等工作,开机时由启动此服务 (源文件路径:\\\\\\\\) 服务启动的流程: 1. 首先扫描安装“\”目录下的包

1. (, | ); 2.第二步扫描安装“\”目录下的各个系统应用 (, ); 3.第三步扫描“\”目录,即用户安装的第三方应用 (, 0, ); 4.第四步扫描" \"目录,即安装保护的文件(目前没有遇到过此类的应用)。(,0, | ); 安装应用的过程 1(, , ) 遍历安装指定目录下的文件

2(, , , , ) 安装文件 3( , , , , , ) 通过解析安装包获取到安装包的信息结构4(, ); 实现文件复制的安装过程(源文件路径:\\\\) 二、从上下载应用:

Android开机启动流程样本

Android的开机流程 1. 系统引导bootloader 1) 源码: bootable/bootloader/* 2) 说明: 加电后, CPU将先执行bootloader程序, 此处有三种选择 a) 开机按Camera+Power启动到fastboot, 即命令或SD卡烧写模式, 不加载内核及文件系统, 此处能够进行工厂模式的烧写 b) 开机按Home+Power启动到recovery模式, 加载recovery.img, recovery.img包含内核, 基本的文件系统, 用于工程模式的烧写 c) 开机按Power, 正常启动系统, 加载boot.img, boot.img包含内核, 基本文件系统, 用于正常启动手机( 以下只分析正常启动的情况) 2. 内核kernel 1) 源码: kernel/* 2) 说明: kernel由bootloader加载 3. 文件系统及应用init 1) 源码: system/core/init/* 2) 配置文件: system/rootdir/init.rc, 3) 说明: init是一个由内核启动的用户级进程, 它按照init.rc中的设置执行: 启动服务( 这里的服务指linux底层服务, 如adbd提供adb支持, vold提供SD卡挂载等) , 执行命令和按其中的配置语句执行相应功能 4. 重要的后台程序zygote 1) 源码: frameworks/base/cmds/app_main.cpp等 2) 说明: zygote是一个在init.rc中被指定启动的服务, 该服务对应的命令是/system/bin/app_process

Android系统启动过程详解

Android系统启动过程详解 Android系统启动过程 首先Android框架架构图:(来自网上,我觉得这张图看起来很清晰) Linux内核启动之后就到Android Init进程,进而启动Android相关的服务和应用。 启动的过程如下图所示:(图片来自网上,后面有地址)

下面将从Android4.0源码中,和网络达人对此的总结中,对此过程加以学习了解和总结, 以下学习过程中代码片段中均有省略不完整,请参照源码。

一Init进程的启动 init进程,它是一个由内核启动的用户级进程。内核自行启动(已经被载入内存,开始运行, 并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。init始终是第一个进程。 启动过程就是代码init.c中main函数执行过程:system\core\init\init. c 在函数中执行了:文件夹建立,挂载,rc文件解析,属性设置,启动服务,执行动作,socket监听…… 下面看两个重要的过程:rc文件解析和服务启动。 1 rc文件解析 .rc文件是Android使用的初始化脚本文件(System/Core/Init/readm e.txt中有描述: four broad classes of statements which are Actions, Commands, Services, and Options.) 其中Command 就是系统支持的一系列命令,如:export,hostname,mkdir,mount,等等,其中一部分是linux 命令, 还有一些是android 添加的,如:class_start :启动服务,class_stop :关闭服务,等等。 其中Options是针对Service 的选项的。 系统初始化要触发的动作和要启动的服务及其各自属性都在rc脚本文件中定义。具体看一下启动脚本:\system\core\rootdir\init.rc 在解析rc脚本文件时,将相应的类型放入各自的List中: \system\core\init\Init_parser.c :init_parse_config_file( )存入到 action_queue、action_list、service_list中,解析过程可以看一下parse_config函数,类似状态机形式挺有意思。 这其中包含了服务:adbd、servicemanager、vold、ril-daemon、deb uggerd、surfaceflinger、zygote、media…… 2 服务启动 文件解析完成之后将service放入到service_list中。 文件解析完成之后将service放入到service_list中。 \system\core\init\builtins.c

android apk安装包的制作过程图解

Android程序安装包APK的制作 完成Android项目后,需要将程序打包成APK文件(Android Package),其后缀名为".apk"。打包的APK 文件可以在Android模拟器或者Android手机上安装运行。 Android系统要求具有开发者签名的私人密钥的应用程序才可以被安装。 Android项目打包和生成数字签名可以使用命令行的方式,但Eclipse中的向导可以方便快捷的完成整个流程。 以HelloWorld为例,介绍如何生成APK。 Android项目编译运行后,右键单击项目名称,选择"Android Tools",再选择"Export Signed Application Package..."(输出签名的应用程序包)。 直接点击Next按钮,进入Keystore设置窗口。其中,Location为证书的目录地址,Password/Comfirm 为证书的密码。

打包程序时系统要求使用数字证书。如果没有数字证书,选择"Create new keystore",设置目录地址和密码,创建新的数字证书。 点击Next按钮,设置证书的信息。Alias:数字证书的名称;Password/Comfirm:证书的密码;Validity(years):证书的有效期;其他信息按需要填写。

完成证书信息设置后点击Next按钮,完成APK打包,如下图所示,生成的APK文件为:E:\Android\keystore\HelloWorld.apk。

如果已有数字证书,可以选择"Use existing keystore",然后点击Browser按钮进行选择,输入密码后点击Next按钮进行下一步。如果没有数字证书,选择"Create new keystore",设置目录地址和密码,创建新的数字证书。

AndroidL系统启动及加载流程分析

Android L系统启动及加载流程分析 1、概述 Android L的启动可以分为几个步骤:Linux内核启动、init进程启动、native系统服务及java系统服务启动、Home启动,主要过程如下图: 图1 整个启动流程跟4.4及之前的版本相差不多,只是有个别不同之处,本文我们主要分析Linux内核启动之后的过程。

2、启动过程分析 2.1 init进程启动 当系统内核加载完成之后,会启动init守护进程,它是内核启动的第一个用户级进程,是Android的一个进程,进程号为1,init进程启动后执行入口函数main(),主要操作为: 图2 AndroidL上将selinux的安全等级提高了,设为了enforcing模式,4.4上是permissive模式。 解析rc脚本文件,即init.rc脚本,该文件是Android初始化脚本,定义了一系列的动作和执行这些动作的时间阶段e aryl-init、init、early-boot、boot、post-fs等阶段。init进程main 函数中会根据这些阶段进行解析执行。AndroidL上为了流程更清晰,增加了charger(充电开机)、ffbm(工厂模式)、以及late-init阶段,实际上这些阶段是对其他阶段的组合执行,比如late-init:

2.2 ServiceManager的启动 servicemanager的启动就是init进程通过init.rc脚本启动的: 源码在frameworks/native/cmds/servicemanager/service_manager.c中,servicemanager是服务管理器,它本身也是一个服务(handle=0),通过binder调用,为native和Java系统服务提供注册和查询服务的,即某个服务启动后,需要将自己注册到servicemanager中,供其他服务或者应用查询使用。AndroidL上servicemanger中在处理注册和查询动作之前添加了selinux安全检测相关的处理。 2.3 SurfaceFinger、MediaServer进程启动 Android4.4以前,surfacefinger的启动根据属性system_init.startsurfaceflinger,决定是通过init.rc启动还是systemserver进程启动,之后的版本包括AndoridL都是通过init.rc启动的: 启动后会向servicemanager进程注册服务中,该服务启动时主要功能是初始化整个显

android APK应用安装过程以及默认安装路径

android APK应用安装过程以及默认安装路径 分类: Android 一:安装过程 APK是类似Symbian Sis或Sisx的文件格式。通过将APK文件直接传到Android模拟器或Android手机中执行即可安装。 Android应用安装有如下四种方式 1. 系统应用安装――开机时完成,没有安装界面 2. 网络下载应用安装――通过market应用完成,没有安装界面 3. ADB工具安装――没有安装界面。 4. 第三方应用安装――通过SD卡里的APK文件安装,有安装界面,由packageinstaller.apk应用处理安装及卸载过程的界面。 应用安装的流程及路径 应用安装涉及到如下几个目录: system/app 系统自带的应用程序,无法删除 data/app 用户程序安装的目录,有删除权限。

安装时把apk文件复制到此目录 data/data 存放应用程序的数据 Data/dalvik-cache 将apk中的dex文件安装到dalvik-cache目录下(dex文件是dalvik虚拟机的可执行文件,其大小约为原始apk文件大小的四分之一) 安装过程:复制APK安装包到data/app目录下,解压并扫描安装包,把dex文件(Dalvik 字节码)保存到dalvik-cache目录,并data/data目录下创建对应的应用数据目录。 卸载过程:删除安装过程中在上述三个目录下创建的文件及目录。 一、系统应用安装: PackageManagerService处理各种应用的安装,卸载,管理等工作,开机时由systemServer 启动此服务 (源文件路径: android\frameworks\base\services\java\com\android\server\PackageManagerService.jav a) PackageManagerService服务启动的流程:

Android APK反编译得到Java源代码和资源文件

Android APK反编译得到Java源代码和资源文件 2011年3月9日iStar发表评论阅读评论 这段时间在学Android应用开发,在想既然是用Java开发的应该很好反编译从而得到源代码吧,google了一下,确实很简单,以下是我的实践过程。在此郑重声明,贴出来的目的不是为了去破解人家的软件,完全是一种学习的态度,不过好像通过这种方式也可以去汉化一些外国软件。 一.反编译Apk得到Java源代码 首先要下载两个工具:dex2jar和JD-GUI,前者是将apk中的classes.dex转化成Jar文件,而JD-GUI是一个反编译工具,可以直接查看Jar包的源代码。以下是下载地址:dex2jar: https://www.doczj.com/doc/289886799.html,/files/dex2jar-0.0.7-SNAPSHOT.zip JD-GUI:https://www.doczj.com/doc/289886799.html,/files/jdgui.zip 具体步骤: 1.首先将apk文件,将后缀改为zip,解压,得到其中的classes.dex,它就是java 文件编译再通过dx工具打包而成的; 2.解压下载的dex2jar,将classes.dex复制到dex2jar.bat所在目录。在命令行 下定位到dex2jar.bat所在目录,运行 dex2jar.bat classes.dex 生成classes.dex.dex2jar.jar 3.运行JD-GUI,打开上面生成的jar包,即可看到源代码了。 二.反编译apk生成程序的源代码和图片、XML配置、语言资源等文件 如果是只是汉化软件,这将特别有用。首先还是下载工具,这次用到的是apktool,下载地址: https://www.doczj.com/doc/289886799.html,/p/android-apktool/,apktool-1.0.0.tar.bz2和 apktool-install-windows-2.1_r01-1.zip两个包都要下。 具体步骤: 1.将下载的两个包解压到同一个文件夹下,应该会有三个文件:aapt.exe, apktool.bat,apktool.jar; 2.在命令行下定位到apktool.bat文件夹,输入以下命令: apktool d C:\***.apk C:\***文件夹 命令行解释:apktool d [要反编译的apk文件 ] [输出文件夹],特别注意:你要反编译的文件一定要放在C盘的根目录里;

android开机启动流程简单分析

android开机启动流程简单分析 android启动 当引导程序启动Linux内核后,会加载各种驱动和数据结构,当有了驱动以后,开始启动Android系统同时会加载用户级别的第一个进程init(system\core\init\init.cpp)代码如下: int main(int argc, char** argv) { ..... //创建文件夹,挂载 // Get the basic filesystem setup we need put together in the initramdisk // on / and then we'll let the rc file figure out the rest. if (is_first_stage) { mount("tmpfs", "/dev", "tmpfs", MS_NOSUID, "mode=0755"); mkdir("/dev/pts", 0755); mkdir("/dev/socket", 0755); mount("devpts", "/dev/pts", "devpts", 0, NULL); #define MAKE_STR(x) __STRING(x) mount("proc", "/proc", "proc", 0, "hidepid=2,gid=" MAKE_STR(AID_READPROC)); mount("sysfs", "/sys", "sysfs", 0, NULL); } ..... //打印日志,设置log的级别 klog_init(); klog_set_level(KLOG_NOTICE_LEVEL); ..... Parser& parser = Parser::GetInstance(); parser.AddSectionParser("service",std::make_unique()); parser.AddSectionParser("on", std::make_unique()); parser.AddSectionParser("import", std::make_unique()); // 加载init.rc配置文件 parser.ParseConfig("/init.rc"); } 加载init.rc文件,会启动一个Zygote进程,此进程是Android系统的一个母进程,用来启动Android的其他服务进程,代码: 从Android L开始,在/system/core/rootdir 目录中有4 个zygote 相关的启动脚本如下图:

Android程序开发实验报告

山西大学 物理电子工程学院 论文题目:基于Android系统的GPS 程序开发 学号:* 姓名:* * * 指导老师:* *

摘要 在日常生活中,我们经常需要知道自己的具体位置,尤其是在 旅游或陌生城市中。而手机作为目前最常见、最方便的电子信息载体,无疑是我们最好的选择。为了让智能手机用户能够随时随地查询GPS 所提供的服务,一种高效的办法就是将应用系统的功能拓展到手机终端上。本文选择的是最常见的Android系统的程序开发。对于软件从业人员来说,该平台具有无限的吸引力。 因此,本文首先介绍安卓系统在个人计算机上开发平台的搭建,并尝试在安卓系统上开发一款基于手机自带GPS组件的GPS应用。 关键字:Android,GPS,SDK,JDK,ADT,Eclipse 一引言 (一)开发背景 随着网络世界的深入生活,地球网络化已经是一条必然之路。而今后的网络也将逐渐的走向移动互联网的轨道。像手机,平板计算机,笔记本计算机等可以搭乘移动互联网的产品中使用人数最多的数码产品便是智能手机了。它已经在逐步的取代其他的电子产品的市场份额。据《2013-2017年中国智能手机行业市场需求预测与投资战略规划分析报告》估算,2012前三季度,全球智能手机用户总数已经突破了10亿大关。而2011前三季度的用户量只有约7亿户。可以看出,智能手机市场的潜力不可估量。

(二)Android 与GPS 简介 1.Android 是一种基于Linux 的自由及开放源代码的操作系统,主要使用于移动设 备,如智能手机和平板计算机,由Google 公 司和开放手机联盟领导及开发。 2011年第一季度,Android 在全球的市场份额首次超过塞班系统,跃居全球第一。 2012年11月数据显示,Android 占据全球智能手机操作系统市场76%的份额,中国市场占有率为90%。 Android 的系统架构和其操作系统一 样,采用了分层的架构。从架构图看, Android 分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运 行库层和Linux 内核层。 Android 系统所具有的特点有:开放性、丰富的硬件、方便开发。 2.GPS 是英文Global Positioning System (全球定位系统) 的简称。GPS 起始于1958年美国军方的一个项目, 1964年投入使用。GPS 定位的基本原理是根据高速运动的卫星瞬间位置作为已知的起算数据,采用空间距离后方交会的方法,确定待测点的位置。GPS 由空间部分、地面控制系统、用户设备部分三部分组成。作为先进的测量手段和新的生产力,GPS 已经融入了国民经济建设、国防建设和社会发展的各个应用领域。GPS 技术与我们的日常生活日益相关。

Android应用程序开发(第二版)课后习题答案

第一章Android简介 1.简述各种手机操作系统的特点. 答案: 目前,手机上的操作系统主要包括以下几种,分别是Android、iOS、Windows Mobile、Windows Phone 7、Symbian、黑莓、PalmOS和Linux。 (1)Android是谷歌发布的基于Linux的开源手机平台,该平台由操作系统、中间件、用户界面和应用软件组成,是第一个可以完全定制、免费、开放的手机平台。Android底层使用开源的Linux操作系统,同时开放了应用程序开发工具,使所有程序开发人员都在统一、开放的开发平台上进行开发,保证了Android应用程序的可移植性。 (2)iOS是由苹果公司为iPhone、iPod touch、iPad以及Apple TV开发的操作系统,以开放源代码的操作系统Darwin为基础,提供了SDK,iOS操作系统具有多点触摸操作的特点,支持的控制方法包括滑动、轻按、挤压和旋转, 允许系统界面根据屏幕的方向而改变方向,自带大量的应用程序。 (3)Windows Mobile是微软推出的移动设备操作系统,对硬件配置要求较高,一般需要使用高主频的嵌入式处理器,从而产生了耗电量大、电池续航时间短和硬件成本高等缺点,Windows Mobile系列操作系统包括Smartphone、Pocket PC和Portable Media Center。随着Windows Phone 7的出现,Windows Mobile 正逐渐走出历史舞台。 (4)Windows Phone 7具有独特的“方格子”用户界面,非常简洁,黑色背景下的亮蓝色方形图标,显得十分清晰醒目,集成了Xbox Live游戏和Zune音乐功能,可见Windows Phone 7对游戏功能和社交功能的重视。 (5)Symbian是为手机而设计的实时多任务32位操作系统,它的功效低,内存占用少,提供了开发使用的函数库、用户界面、通用工具和参考示例。操作系统不是完全开放的,核心代码不开放,但是API文档是公开的。 (6)黑莓系统主要在黑莓手机上使用,其特色是支持电子邮件推送功能,邮件服务器主动将收到的邮件推送到用户的手持设备上,而不需要用户频繁地连接网络查看是否有新邮件。同时,黑莓系统提供手提电话、文字短信、互联网传真、网页浏览及其它无线信息服务功能。黑莓系统主要针对商务应用,具有很高的安全性和可靠性。 (7)PalmOS由拥有较多的第三方软件,是32位的嵌入式操作系统,主要在移动终端上使用,操作系统本身所占的内存极小,不具备录音和MP3播放功能。 (8)Linux手机操作系统具有开放源代码的特性,但是也包含入门难度高,集成开发环境差,Linux的产品与个人计算机的连接性较差,具有较强的开发实力的公司很少等不足。 2.简述Android平台的特征 答案: Android广泛支持GSM、3G和4G的语音与数据业务,支持接收语言呼叫和SMS

Android ninja 编译启动过程分析

Android ninja编译启动过程分析 ---make是如何转换到到ninja编译的 1.首先你的得对make的工作机制有个大概的了解: 运行的命令在要编译的目录下运行make,或者make target_name a.分析处理保存阶段(没有实际编译动作):它首先对当前目录下的Makefile文件的做一次扫描,语法分析,还有处理,主要是变量的保存,目标依赖列表生成,目标下的action列表的生成,然后记住 b.然后按记住的目标执行action列表动作(有实际编译动作). 编译启动的入口方式还是运行make: 2开始make-jxxx方式进入.....(xxx是本机cpu的数量) make开始做进行第一次扫描.... 目前USE_NINJA还是没有定义,估计以后很久很久才能启用的了! BUILDING_WITH_NINJA开始也是没定义的 看make扫描入口文件: Makefile: include build/core/main.mk 在build/core/main.mk: 在ninia之前都有include help.mk和config.mk 97include$(BUILD_SYSTEM)/help.mk 98 99#Set up various standard variables based on configuration 100#and host information. 101include$(BUILD_SYSTEM)/config.mk 说明make help//显示make帮助make config//当前显示配置 103relaunch_with_ninja:= 104ifneq($(USE_NINJA),false) 105ifndef BUILDING_WITH_NINJA<==第二次扫描不会到这里了 106relaunch_with_ninja:=true 107endif 108endif 116ifeq($(relaunch_with_ninja),true)<===第一次扫描入这里了 117#Mark this is a ninja build. 118$(shell mkdir-p$(OUT_DIR)&&touch$(OUT_DIR)/ninja_build) 119include build/core/ninja.mk//---进入ninja.mk 第一次扫描到此为止就结束掉了,因为在当前ifeq else endif后面没有代码了 120else#///!relaunch_with_ninja<===第二次扫描入这里了

Android开发流程

Android开发流程 1.创建Android project(HelloWorld项目) 打开Eclipse,点击菜单【File】-à【New】,过程如下图所示. 进入如下对话框

选择【Android Projet】,点击【Next】,进入如下界面。 创建项目选项卡的相关属性 【New Android Project】选项卡属性介绍

Project name 项目名称,本例指定为“HelloWorld”. Contents 设定项目存放的位置,默认放于Workspace中。 Build Target 设定项目运行的目标版本,我们选择最新版本Android 2.2,这就意味着这个项目是基于Android 2.2 版本开发的。 Application name 本项目的应用名称为“Android,你好”。应用名称会在手机程序列表中该应用的图标下方显示,并且在该项目运行时应用名称会在标题栏显示。 Package name 本项目的包名为“com.simcomandroid.hello”. 包结构是java语言的一种规范。 Create Activity ADT会根据此名称自动为项目创建同名的Activity类,建议以“Activity”作为后缀,方便阅读和理解,该项可选,如果不需要ADT自动生成Activity,则可以不选。本例指定为“HelloActivity”. Min SDK V ersion 8这个数字代表了该项目运行的Andriod平台的最低版本是Android 2.2 .比2.2低的版本都不能运行该项目。

最终【New Android Project】选项卡如下图,

Android开发环境搭建图解教程(完整过程详细步骤)

Android开发环境搭建图解教程 一、开发环境搭建 在搭建Android开发环境之前,首先要了解Android对操作系统的要求:Android可以运行在Windows XP及以上的版本上,也可以运行在Mac OS和Linux 等操作系统上,本文以Windows XP为依托进行Android开发环境搭建的讲解。1.安装JDK和配置Java开发环境 Android应用程序开发使用Java语言,因此首先需要搭建Java程序开发运行环境,Java的开发环境称为JDK(Java Development Kit),是Sun Microsystems 针对java程序员开发的产品,自从Java推出以来,JDK已经成为最广泛的Java SDK。JDK是整个Java的核心,包括了Java运行环境JRE(Java Runtime Environment)、Java工具和Java基础类库。 1.1 下载JDK 当前最新版JDK的下载地址为: .oracle./technetwork/java/javase/downloads/jdk-7u2-download-1377129.html 图 1 - 1 1.2 配置JDK

右键点击“我的电脑”,选择“属性”→“高级”→“环境变量”→“系统变量”,找到“Path”变量名(如果没有就新建一个名为“Path”的变量),点击“编辑”按钮,添加JDK安装目录中的“bin”文件夹路径,以分号隔开,如图1-2所示,然后点击“确定”按钮完成设定。 图 1 - 2 再找到“CLASSPATH”变量(如果没有,以同样方法新建一个),输入JDK 安装目录中的“lib”及“demo”的路径,如图1-3所示,点击“确定”按钮完成设定。 1.3 验证JDK是否安装配置成功 安装配置完成之后,需要测试JDK是否安装配置成功。在Windows XP系统中点击“开始”→“运行”,输入“CMD”回车进入命令行模式,键入命令“java -version”,运行结果如图 1-4所示,表示安装JDK安装成功(显示的版本号根据具体情况可能有所不同)。 然后键入命令“javac”,运行结果如图1-5所示,表示JDK环境配置正确。

相关主题
文本预览
相关文档 最新文档