原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://vincenttung.blog.51cto.com/6249439/1318716


为了让APP能够顺利升级,分为有内存卡状态和无内存卡状态(内置内存卡状态下的路径难以确定,通过反射获取必须是3.0以上,暂时不予以考虑)。


 


无内存卡的情况下,那些空间可以使用 ?


 


data/data/pkgname/files/


 


data/data/pkgname/cache/


 


 


 


于是将新版本的app(文件名为update-1.1.0.apk)下载到files下,然后进行install,结果提示解析错误


 


190322748  


Why?将这个apk文件copysdcard上,点击,能够安装,排除apk文件不完整的问题。


 


进到shell,执行ls命令查看权限情况


190344738

 


 


 


 


可以看到update-1.1.0.apk只有自己读写权限。安装apk都是通过调用的系统的打包安装程序(PackageInstaller.apk)进行安装,很显然PackageInstalller打包安装程序没有相关的执行权限。


 


执行chmod命令将其权限改为606


190419633   


 


  


然后再进行安装,成功。


 


 


 


所以无内存卡升级(没有root权限的情况下)的步骤如下:


 


1.下载到升级文件到Data/data/pkgname/files/


 


2.代码执行shell命令,修改升级文件的执行权限:chmod 607 filepath/filename


 


3.进行安装


 


上代码:









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

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

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118



package com.example.insatllapkfrominternalstorage;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import android.app.Activity;

import android.content.Intent;

import android.net.Uri;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.widget.Button;

public class MainActivity extends Activity {

    private Button btn_cpy,btn_install,btn_chmod;

    private InputStream in=null;

    private OutputStream out= null;

    String path = null;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        btn_cpy=(Button)findViewById(R.id.cpy);

        btn_install= (Button)findViewById(R.id.install);

        btn_chmod = (Button)findViewById(R.id.chmod);

        path = MainActivity.this.getFilesDir().toString()+File.separator+"update-1.1.0.apk";

        btn_cpy.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {new Thread(){public void run() {

                new File(path).deleteOnExit();

                try {

                    in = MainActivity.this.getAssets().open("update-1.1.0.apk");

                    out = new FileOutputStream(new File(path));

                    byte[] buffer = new byte[1024];

                    int offset =0;

創作者介紹
創作者 shadow 的頭像
shadow

資訊園

shadow 發表在 痞客邦 留言(0) 人氣()


留言列表

發表留言