是否可以在运行时更新Android应用程序,然后重新加载它

时间:2013-03-13 01:52:26

标签: android auto-update

这个问题可能早些时候曾被问过,但无法得到任何明确答案。我基本上不希望和客户端交互更新和其他东西,他们只能看到应用程序运行,他们很高兴。但为了做到这一点,我需要一些后台线程或某些东西来检查市场的新更新,并在后面更新它,并在应用更新后重新启动应用程序。

P.S。我对Android开发是全新的,所以非常抱歉,如果我听起来很疯狂,但这是我的要求

2 个答案:

答案 0 :(得分:3)

AFAIK,如果您具有root访问权限,则该过程如下:

  1. 您的应用位于/system/app文件夹(作为系统应用)
  2. 您需要以下权限:

    android.permission.INSTALL_PACKAGES
    android.permission.DELETE_PACKAGES
    android.permission.CLEAR_APP_CACHE
    android.permission.WRITE_EXTERNAL_STORAGE
    android.permission.MOUNT_UNMOUNT_FILESYSTEMS
    
  3. 您的应用必须使用系统签名

    进行签名
    java -jar signapk.jar platform.x509.pem platform.pk8 helloworld.apk hello.apk
    
  4. 检查后台线程中的更新并将更新的.apk文件下载到临时位置,例如apk_path

  5. 以编程方式执行pm install apk_path命令,下面是一个片段:

    public String silentInstallation(String apkPath)
    {
            String[] args = { "pm", "install", "-r", apkPath };             
            ProcessBuilder processBuilder = new ProcessBuilder(args);  
            Process process = null;  
            InputStream errIs = null;  
            InputStream inIs = null;  
            try {  
                ByteArrayOutputStream baos = new ByteArrayOutputStream();  
                int read = -1;  
                process = processBuilder.start();  
                errIs = process.getErrorStream();  
                while ((read = errIs.read()) != -1) {  
                    baos.write(read);  
                }  
                baos.write('\n');  
                inIs = process.getInputStream();  
                while ((read = inIs.read()) != -1) {  
                    baos.write(read);  
                }  
                byte[] data = baos.toByteArray();  
                result = new String(data);  
            } catch (IOException e) {  
                e.printStackTrace();  
            } catch (Exception e) {  
                e.printStackTrace();  
            } finally {  
                try {  
                    if (errIs != null) {  
                        errIs.close();  
                    }  
                    if (inIs != null) {  
                        inIs.close();  
                    }  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
                if (process != null) {  
                    process.destroy();  
                }  
            }  
            return result;  
    }
    
  6. 希望它有所帮助。

答案 1 :(得分:3)

除非

,否则无法在没有用户互动的情况下更新(或安装)应用
  1. 您是系统应用(自定义ROM)
  2. 您的设备已植根,您的更新程序具有root权限。
  3. 此外,没有官方API可用于检查Google Play商店中提供的应用版本。

    您可以通过跟踪Google Play之外的当前版本,然后通过启动市场链接提示更新用户来实现您尝试做的一些操作。如果您从辅助应用程序执行此操作,您甚至可以等待更新完成,然后重新启动应用程序。

    实际上,由于前几位评论者所说的原因,您无法在没有用户互动的情况下进行静音安装/更新,这是一件好事(tm)。