admin管理员组

文章数量:1531657

2024年7月14日发(作者:)

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

分类:

一:安装过程

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

应用安装有如下四种方式

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

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

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

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

程的界面。

应用安装的流程及路径

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

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

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

1 / 27

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

存放应用程序的数据

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

一)

安装过程:复制安装包到目录下,解压并扫描安装包,把文件(字节码)保存到目录,

并目录下创建对应的应用数据目录。

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

一、系统应用安装:

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

(源文件路径:)

服务启动的流程:

1. 首先扫描安装“”目录下的包

2 / 27

1. (,

| );

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

(, );

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

(, 0, );

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

(,0, | );

安装应用的过程

1(, , ) 遍历安装指定目录下的文件

3 / 27

2(,

, , ,

) 安装文件

3(

, , ,

, , )

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

4(,

); 实现文件复制的安装过程

(源文件路径:)

二、从上下载应用:

4 / 27

应用需要使用账户登录才可以使用,选择某一应用后,开始下载安装包,此过程中,在手

机的信号区有进度条提示,下载完成后,会自动调用的接口安装,调用接口如下:

( , )

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

:处理返回的安装结果

:安装的参数,从上下载的应用,安装参数为 ()

接口函数的安装过程:

1 (

, , ,

)

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

2 = (, );

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

5 / 27

3 ( ,

, ,

, )

解析临时文件,获取应用包名 = (

(), 0);

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

,

, ,

, , ,

)

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

6 / 27

,

, ,

, , ,

);

6 (

, , ,

, , )

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

三、从工具安装

() 是自带的管理设备的工具,通过命令行的方式也可以为手机或模拟器安装应用,其入

口函数源文件为

(源文件路径:)

命令行的形式为 <> ,还可以带安装参数如:"""" "" ""

7 / 27

函数()中判断参数

""――

""——

"" ——

""——

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

入这个参数安装的。

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

( , )

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

把安装包保存在卡中,从手机里访问卡中的安装包,点击就可以启动安装界面,系统应用处

理这种方式下的安装及卸载界面流程,如下图:

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

8 / 27

创建临时安装文件

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

需要用户确认是否要替换安装。

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

(, );

其它:

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

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

的等信息。

二:更改默认安装路径

如果你是一个应用开发者,没用系统全套代码,你只想更改你的的默认安装路径的话,可以

按下面方法来更改:

在文件标签中添加属性

这个属性设置的是默认安装位置, 共有三个有效值,、、

对应表

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

内在不够,则会安装在T卡内

安装在手机内存

安装在外部存储中

0

1

2

, .

< ""

""

9 / 27

""

"1"

"1.0">

如果你是一个手机方案开发者,能改层的代码,你希望下载到手机里的都默认优先安装到T

卡的话,可以按下面方法更改:

在文件里,将 这个值,改为,就可以了.默认下载就会下到T卡里卡不存在或者满了时,

才会下到手机内部. 或者如果在应用的里,指定了属性为手机内部存储的话,是会存在手机

内部的.没指这定的话这个值指定什么,就下到哪里

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

1:因为装载T卡是在系统启动完成后,才开始装载的.所以如果应用装在T卡里的话,那么它

是收不到开机启动完成的这个广播的

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

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

系统在启动的过程中,会启动一个应用程序管理服务,这个服务负责扫描系统中特定的目录,找

到里面的应用程序文件,即以为后缀的文件,然后对这些文件进解析,得到应用程序的相关信息,

完成应用程序的安装过程,本文将详细分析这个过程。

应用程序管理服务安装应用程序的过程,其实就是解析析应用程序配置文件的过程,并从

里面得到得到应用程序的相关信息,例如得到应用程序的组件、、 和 等信息,有了这些信息后,

通过这个服务,我们就可以在系统中正常地使用这些应用程序了。

应用程序管理服务是系统启动的时候由组件启动的,启后它就会执行应用程序安装的过

程,因此,本文将从启动服务的过程开始分析系统中的应用程序安装的过程。

应用程序管理服务从启动到安装应用程序的过程如下图所示:

10 / 27

下面我们具体分析每一个步骤。

1.

这个函数定义在文件中:

[]

1.

2. {

11 / 27

3. ......

4.

5. 1([] );

6.

7. ......

8.

9. ([] ) {

10. ......

11.

12. 1();

13.

14. ......

15. }

16.

17. ......

18. }

组件是由进程负责启动的,启动的时候就会调用它的函数,这个函数主要调用了方法1

来做一些系统初始化的工作。

2. 1

这个函数是一个方法,实现在 文件中:

[]

1. {

2.

3. "C" ();

4.

5. 1(* , )

6. {

7. ();

8. }

9.

10. /*

11. * .

12. */

13. [] = {

14. /* , , */

15. { "1", "([;)V", (*) 1 },

16. };

17.

18. (* )

19. {

20. (, "",

21. , ());

12 / 27

22. }

23.

24. };

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

3.

函数实现在库中,源代码位于文件中:

[]

1. "C" ()

2. {

3. (" ()");

4.

5. <> (());

6.

7. <> = ();

8. (": n", ());

9.

10. <> = ();

11. >()->(, (), 0);

12.

13. [];

14. ("", , "1");

15. ((, "1") 0) {

16.

17. ();

18. }

19.

20.

21. ();

22.

23. , 't

24. ,

25. (>()) {

26.

27.

28. ();

29.

30.

31. ();

32.

33.

34. ();

35.

13 / 27

36.

37. ();

38. }

39.

40. .

41.

42. .

43.

44. 's (),

45. .

46. (" : .n");

47.

48. * = ();

49.

50. (" : .n");

51. >("", "2");

52.

53. ,

54. . ,

55. .

56. (>()) {

57. (" : .n");

58. ()->();

59. ()->();

60. (" : .n");

61. }

62.

63. ;

64. }

这个函数首先会初始化、、、、和这几个服务,然后就通过系统全局唯一的实例变量的来

调用的2函数了。关于这个实例变量的相关资料,可能参考前面一篇文章应用程序进程启动过

程的源代码分析一文。

4.

这个函数定义在文件中:

[]

1. /*

2. * a .

3. */

4. ( * , * )

5. {

6. * ;

14 / 27

7. ;

8. ;

9.

10. = ();

11. ( )

12. ;

13.

14. = (, );

15. ( ) {

16. (": ''n", );

17. ;

18. }

19. = >(, , "()V");

20. ( ) {

21. (": n", , );

22. ;

23. }

24.

25. >(, );

26.

27. ;

28. }

这个函数调用由参数指定的类的静态成员函数,这个静态成员函数是由参数指定的。上面

传进来的参数的值为"",而参数的值为"2",因此,接下来就会调用类的2函数了。

5. 2

这个函数定义在文件中:

[]

1.

2. {

3. ......

4.

5. 2() {

6. (, " !");

7. = ();

8. ("");

9. ();

10. }

11. }

15 / 27

这个函数创建了一个线程,服务就是这个线程中启动的了。这里调用了实例的函数之后,

下面就会执行这个实例的函数了。

6.

这个函数定义在文件中:

[]

1. {

2. ......

3.

4.

5. () {

6. ......

7.

8. = ;

9.

10. ......

11.

12. ...

13. {

14. ......

15.

16. (, " ");

17. = (,

18. );

19.

20. ......

21. } ( e) {

22. ("", " ", e);

23. }

24.

25. ......

26. }

27.

28. ......

29. }

这个函数除了启动服务之外,还启动了其它很多的服务,例如在前面学习和的几篇文章中

经常看到的服务,有兴趣的读者可以自己研究一下。

7.

这个函数定义在文件中:

[]

1. {

16 / 27

2. ......

3.

4. ( , ) {

5. m = (, );

6. ("", m);

7. m;

8. }

9.

10. ......

11. }

这个函数创建了一个服务实例,然后把这个服务添加到中去,是系统进程间通信机制的守

护进程,负责管理系统中的对象,具体可以参考浅谈 成为进程间通信()机制守护进程之路一

文。

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

[]

1. {

2. ......

3.

4. ( , ) {

5. ......

6.

7. () {

8. () {

9. ......

10.

11. = ();

12. = (, "");

13. = (, "");

14. = (, "");

15.

16. ......

17.

18. = ((), "");

19. = (, "");

20.

21. ......

22.

23. ( ).

24. = (

25. (), , );

26. ();

27. (,

17 / 27

28. | ,

29. | , 0);

30.

31. .

32. = ((), "");

33. = (

34. (), , );

35. ();

36. (,

37. | , , 0);

38.

39. .

40. = ("");

41. = (

42. (), , );

43. ();

44. (,

45. | , , 0);

46.

47.

48. = (

49. (), , );

50. ();

51. (, 0, , 0);

52.

53. = (

54. (), , );

55. ();

56. (, ,

57. , 0);

58.

59. ......

60. }

61. }

62. }

63.

64. ......

65. }

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

18 / 27

8.

这个函数定义在文件中:

[]

1. {

2. ......

3.

4. ( , , , ) {

5. [] = ();

6. ......

7.

8. i;

9. (0; i<; ) {

10. = (, [i]);

11. (([i])) {

12. 's

13. ;

14. }

15. = (,

16. , , );

17. 't .

18. ( ( & ) 0

19. ) {

20.

21. (, " " + );

22. ();

23. }

24. }

25. }

26.

27.

28. ......

29. }

对于目录中的每一个文件,如果是以后作为后缀名,那么就调用函数来对它进行解析和

安装。

9.

这个函数定义在文件中:

[]

1. {

19 / 27

2. ......

3.

4. ( ,

5. , , ) {

6. ......

7.

8. = ();

9. ;

10. = ();

11.

12. ......

13.

14. = (,

15. , , );

16.

17. ......

18.

19. (, , | , );

20. }

21.

22. ......

23. }

这个函数首先会为这个文件创建一个实例,接着调用这个实例的函数来对这个文件进行解

析。这个函数最后还会调用另外一个版本的函数把来解析后得到的应用程序信息保存在中。

10.

这个函数定义在文件中:

[]

1. {

2. ......

3.

4. ( , ,

5. , ) {

6. ......

7.

8. = ();

9.

10. ......

11.

12. = ;

13. = ;

14. = ;

15. {

20 / 27

16. = ();

17. = ();

18. ( 0) {

19. = (, "");

20. = ;

21. } {

22. ......

23. }

24. } ( e) {

25. ......

26. }

27.

28. ......

29.

30. [] = [1];

31. = ;

32. = ;

33. {

34. : .

35. = (, , );

36. = (, , , );

37. } ( e) {

38. ......

39. }

40.

41. ......

42.

43. ();

44. ();

45.

46.

47. = ;

48. = ;

49. = ;

50. = ;

51. = ;

52.

53. ;

54. }

55.

56. ......

57. }

21 / 27

每一个文件都是一个归档文件,它里面包含了应用程序的配置文件,这里主要就是要对这

个配置文件就行解析了,从归档文件中得到这个配置文件后,就调用另一外版本的函数对这个应

用程序进行解析了:

[]

1. {

2. ......

3.

4. (

5. , , , [] )

6. , {

7. ......

8.

9. = (, , , );

10.

11. ......

12.

13. = ();

14.

15. ......

16.

17. ;

18.

19. ......

20.

21. = (,

22. );

23.

24. ......

25.

26. ((())

27. ( () > )) {

28. ( ) {

29. ;

30. }

31.

32. = ();

33. (("")) {

34. ......

35.

36. ((, , , , , )) {

37. ;

38. }

39. } (("")) {

22 / 27

40. ......

41. } (("")) {

42. ......

43. } (("")) {

44. ......

45. } (("")) {

46. ......

47. } (("")) {

48. ......

49. } (("")) {

50. ......

51. } (("")) {

52. ......

53. } (("")) {

54. ......

55. } (("")) {

56. ......

57. } (("")) {

58. ......

59. } (("")) {

60. ......

61. } (("")) {

62. ......

63. } (("")) {

64. ......

65. } (("")) {

66. ......

67. } (("")) {

68. ......

69. } () {

70. ......

71. } {

72. ......

73. }

74. }

75.

76. ......

77.

78. ;

79. }

80.

81. ......

82. }

23 / 27

这里就是对文件中的各个标签进行解析了,各个标签的含义可以参考官方文档,这里我们

只简单看一下标签的解析,这是通过调用函数来进行的。

11.

这个函数定义在文件中:

[]

1. {

2. ......

3.

4. ( , ,

5. , , , [] )

6. , {

7. = ;

8. = ;

9.

10. = (,

11. );

12.

13. ......

14.

15. ;

16. ((())

17. ( () > )) {

18. ( ) {

19. ;

20. }

21.

22. = ();

23. (("")) {

24. a = (, , , , , , );

25. ......

26.

27. (a);

28.

29. } (("")) {

30. a = (, , , , , , );

31. ......

32.

33. (a);

34. } (("")) {

35. s = (, , , , , );

36. ......

37.

38. (s);

24 / 27

39. } (("")) {

40. p = (, , , , , );

41. ......

42.

43. (p);

44. } (("")) {

45. a = (, , , , , );

46. ......

47.

48. (a);

49. } (()("")) {

50. ......

51. } (("")) {

52. ......

53. } (("")) {

54. ......

55. } {

56. ......

57. }

58. }

59.

60. ;

61. }

62.

63. ......

64. }

这里就是对文件中的标签进行解析了,我们常用到的标签就有、、和,各个标签的含义可

以参考官方文档。

这里解析完成后,一层层返回到 9中,调用另一个版本的函数把来解析后得到的应用程

序信息保存下来。

12.

这个函数定义在文件中:

[]

1. {

2. ......

3.

4. ( ), .

5. .

6. "".

7. <, > =

8. <, >();

25 / 27

9.

10. ......

11.

12. , .

13. =

14. ();

15.

16. , .

17. =

18. ();

19.

20. , .

21. = ();

22.

23. ( ), .

24. <, > =

25. <, >();

26.

27. ......

28.

29. ( ,

30. , , ) {

31. ......

32.

33. () {

34. ......

35.

36.

37. (, );

38.

39. ......

40.

41. N = ();

42. i;

43. (0; i

44. p = (i);

45. = (,

46. , );

47. ( (,

48. ), p);

49.

50. ......

51. }

52.

26 / 27

53. N = ();

54. (0; i

55. s = (i);

56. = (,

57. , );

58. (s);

59.

60. ......

61. }

62.

63. N = ();

64. r = ;

65. (0; i

66. a = (i);

67. = (,

68. , );

69. (a, "");

70.

71. ......

72. }

73.

74. N = ();

75. (0; i

76. a = (i);

77. = (,

78. , );

79. (a, "");

80.

81. ......

82. }

83.

84. ......

85. }

86.

87. ......

88.

89. ;

90. }

91.

92. ......

93. }

这个函数主要就是把前面解析应用程序得到的、、、和等信息保存在服务中了

27 / 27

本文标签: 安装应用文件