android中从代码上看安装程序之普通安装和静默安装

   在 Android开发中,我们经常需要对自己的APP进行自动升级安装,今天我们就来讲一讲安装程序的代码怎么写,android中,安装程序的方式分为普通安装和静默安装,普通安装是通过调用Intent来发送一个 "application/vnd.android.package-archive"给系统,然后系统调用自身的安装程序来帮助你来完成程序的安装工作。静默安装时通过调用系统命令 pm来完成的。

        首先来看一下普通安装的代码,这个代码是一般情况下是这样子的:

    public static boolean installNormal(Context context, String filePath) {  
            Intent i = new Intent(Intent.ACTION_VIEW);  
            File file = new File(filePath);  
            if (file == null || !file.exists() || !file.isFile()  
                    || file.length() <= 0) {  
                return false;  
            }  
      
            i.setDataAndType(Uri.parse("file://" + filePath),  
                    "application/vnd.android.package-archive");  
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
            context.startActivity(i);  
            return true;  
        }  

        下面在来看看静默安装的程序是怎么实现的。

    public static int installSilent(Context context, String filePath,  
                String pmParams) {  
            if (filePath == null || filePath.length() == 0) {  
                return INSTALL_FAILED_INVALID_URI;  
            }  
      
            File file = new File(filePath);  
            if (file == null || file.length() <= 0 || !file.exists()  
                    || !file.isFile()) {  
                return INSTALL_FAILED_INVALID_URI;  
            }  
      
            /** 
             * if context is system app, don't need root permission, but should add 
             * <uses-permission android:name="android.permission.INSTALL_PACKAGES" 
             * /> in mainfest 
             **/  
            StringBuilder command = new StringBuilder()  
                    .append("LD_LIBRARY_PATH=/vendor/lib:/system/lib pm install ")  
                    .append(pmParams == null ? "" : pmParams).append(" ")  
                    .append(filePath.replace(" ", "\\ "));  
            CommandResult commandResult = ShellUtils.execCommand(  
                    command.toString(), !isSystemApplication(context), true);  
            if (commandResult.successMsg != null  
                    && (commandResult.successMsg.contains("Success") || commandResult.successMsg  
                            .contains("success"))) {  
                Log.d("PackageUtils", "install system app ok!");  
                return INSTALL_SUCCEEDED;  
            }  
    }  

        静默安装时,一般情况下需要获取系统权限,查看是否是系统APP或具有系统权限的代码如下:

    public static boolean isSystemApplication(PackageManager packageManager,  
                String packageName) {  
            if (packageManager == null || packageName == null  
                    || packageName.length() == 0) {  
                return false;  
            }  
      
            try {  
                ApplicationInfo app = packageManager.getApplicationInfo(  
                        packageName, 0);  
                return (app != null && (app.flags & ApplicationInfo.FLAG_SYSTEM) > 0);  
            } catch (NameNotFoundException e) {  
                e.printStackTrace();  
            }  
        return false;  
    }  

查看是否具有系统权限

    public static boolean checkRootPermission() {  
            return execCommand("echo root", true, false).result == 0;  
        }  
    public static CommandResult execCommand(String[] commands, boolean isRoot,  
                boolean isNeedResultMsg) {  
            int result = -1;  
            if (commands == null || commands.length == 0) {  
                return new CommandResult(result, null, null);  
            }  
      
            Process process = null;  
            BufferedReader successResult = null;  
            BufferedReader errorResult = null;  
            StringBuilder successMsg = null;  
            StringBuilder errorMsg = null;  
      
            DataOutputStream os = null;  
            try {  
                process = Runtime.getRuntime().exec(  
                        isRoot ? COMMAND_SU : COMMAND_SH);  
                os = new DataOutputStream(process.getOutputStream());  
                for (String command : commands) {  
                    if (command == null) {  
                        continue;  
                    }  
      
                    // donnot use os.writeBytes(commmand), avoid chinese charset  
                    // error  
                    os.write(command.getBytes());  
                    os.writeBytes(COMMAND_LINE_END);  
                    os.flush();  
                }  
                os.writeBytes(COMMAND_EXIT);  
                os.flush();  
      
                result = process.waitFor();  
                // get command result  
                if (isNeedResultMsg) {  
                    successMsg = new StringBuilder();  
                    errorMsg = new StringBuilder();  
                    successResult = new BufferedReader(new InputStreamReader(  
                            process.getInputStream()));  
                    errorResult = new BufferedReader(new InputStreamReader(  
                            process.getErrorStream()));  
                    String s;  
                    while ((s = successResult.readLine()) != null) {  
                        successMsg.append(s);  
                    }  
                    while ((s = errorResult.readLine()) != null) {  
                        errorMsg.append(s);  
                    }  
                }  
            } catch (IOException e) {  
                e.printStackTrace();  
            } catch (Exception e) {  
                e.printStackTrace();  
            } finally {  
                try {  
                    if (os != null) {  
                        os.close();  
                    }  
                    if (successResult != null) {  
                        successResult.close();  
                    }  
                    if (errorResult != null) {  
                        errorResult.close();  
                    }  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
      
                if (process != null) {  
                    process.destroy();  
                }  
            }  
            return new CommandResult(result, successMsg == null ? null  
                    : successMsg.toString(), errorMsg == null ? null  
                    : errorMsg.toString());  
        }  

安装时调用如下:

    public static final int install(Context context, String filePath) {  
            if (isSystemApplication(context,filePath)  
                    || checkRootPermission()) {  
                return installSilent(context, filePath);  
            }  
            return installNormal(context, filePath) ? INSTALL_SUCCEEDED  
                    : INSTALL_FAILED_INVALID_URI;  
        }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值