自我更新的应用程序(Self updating app)

2019-08-17 01:52发布

TL:DR; 版本;)

  • 我的应用程序应该在没有用户交互运行(自动启动等工作)

  • 它应该在没有任何用户交互(通过APK)更新自身

  • 解锁装置是可能的

问题:

  • 从服务器的工作方式查询新的APK
  • 开始用(图?)意图APK时,“安装程序”的提示弹出,需要用户确认

我该如何解决这个问题无需任何用户交互?

http://code.google.com/p/auto-update-apk-client/这似乎是一个解决方案,但必须有更好的办法。

我已经发现了这一点: 安装应用程序在Android

但是,这并不解决我的问题。

Answer 1:

解决它! :d

这只是工作中根深蒂固的设备,但完美的作品。 使用Unix CMD“PM”(packageManager)允许你从SD卡执行它的权限时安装的APK。

希望能帮助一些人的未来。

public static void installNewApk()
{
        try
        {
            Runtime.getRuntime().exec(new String[] {"su", "-c", "pm install -r /mnt/internal/Download/fp.apk"});
        }
        catch (IOException e)
        {
            System.out.println(e.toString());
            System.out.println("no root");
        }
}

所需的权限:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />


Answer 2:

我的建议是使用更新的应用程序的插件机制instad。 您可以动态地从网络加载类和运行这些应用程式中无需任何用户交互。 有很多在互联网上流传的资源:

如何动态地加载Java类在Android / Dalvik的?

http://android-developers.blogspot.com/2011/07/custom-class-loading-in-dalvik.html



Answer 3:

如果su -c不起作用,尝试su 0 (只有扎根设备可以做苏!)

完整的答案是这样的:

private void installNewApk()
    {
        String path = mContext.getFilesDir().getAbsolutePath() + "/" + LOCAL_FILENAME;
        mQuickLog.logD("Install at: " + path);
        ProcessUtils.runProcessNoException(mQuickLog, "su", "0", "pm", "install", "-r", path);
    }

随着定义这个类:

public class ProcessUtils {
    Process process;
    int errCode;
    public ProcessUtils(String ...command) throws IOException, InterruptedException{
        ProcessBuilder pb = new ProcessBuilder(command);
        this.process = pb.start();
        this.errCode = this.process.waitFor();
    }

    public int getErrCode() {
        return errCode;
    }

    public String getOutput() throws IOException {
        InputStream inputStream = process.getInputStream();
        InputStream errStream = process.getErrorStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
        String line;
        StringBuilder sb = new StringBuilder();
        while ((line = br.readLine()) != null) {
            sb.append(line + System.getProperty("line.separator"));
        }

        br = new BufferedReader(new InputStreamReader(errStream));
        while ((line = br.readLine()) != null) {
            sb.append(line + System.getProperty("line.separator"));
        }
        return sb.toString();
    }


    public static String runProcess(String ...command) throws IOException, InterruptedException {
        ProcessUtils p = new ProcessUtils(command);
        if (p.getErrCode() != 0) {
            // err
        }
        return p.getOutput();
    }

    public static void runProcessNoException(String ...command) {
        try {
            runProcess(command);
        } catch (InterruptedException | IOException e) {
            // err
        }
    }
}


文章来源: Self updating app