尝试以编程方式更新我的 apk 导致解析错误

Trying to update my apk programmatically results in parse error

我需要在没有 Google Play 的情况下更新我的应用程序。所以我把我的apk上传到我的服务器,需要的时候可以下载。

通过下面的代码可以正常下载,但是安装intent开始的时候抛出:"Parse Error: There is a problem parsing the package"

如果我尝试 运行 手动下载 apk,它仍然会出现同样的错误。

但是,如果我通过 USB 传输 apk 然后 运行 它,安装会很顺利。所以这个问题不是apk本身的问题。

这是我的任务 class:

class Update implements Runnable {
    @Override
    public void run() {
        FTPClient ftpClient = new FTPClient();
        try {
            ftpClient.connect(InetAddress.getByName("mysite.com"));
            ftpClient.login("mysite.com", "123456"));
            ftpClient.enterLocalPassiveMode();
            String remoteFile1 = "/httpdocs/program/app-release.apk";
            String downPath = getExternalStoragePublicDirectory(DIRECTORY_DOWNLOADS).getAbsolutePath();
            File myapk = new File(downPath + "/app-release.apk");
            OutputStream outputStream1 = new BufferedOutputStream(new FileOutputStream(myapk));
            boolean success = ftpClient.retrieveFile(remoteFile1, outputStream1);
            outputStream1.close();
            myapk.setReadable(true, false);
            if (!success) {
                ftpClient.logout();
                ftpClient.disconnect();
                return;
            } else {
                Intent promptInstall = new Intent(Intent.ACTION_VIEW)
                        .setDataAndType(Uri.fromFile(myapk), "application/vnd.android.package-archive")
                        .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(promptInstall);
            }
        }
        catch (Exception ex) {
            //catch exception
        }
    }
}

好吧,这是我自己的错误。对于扫描到我完美的工作代码并感到沮丧的任何人,我们深表歉意。

原因是我,试图通过 USB 直接从 Android Studio 更新我 运行 的应用程序。尽管它在 "Release" 模式下 运行ning,它会在新下载的 apk 文件上抛出解析错误(我仍然不确定为什么)。

所以,我刚刚生成了一个带有适当(较低)版本控制的签名 apk;复制到phone然后安装。只有这样,应用程序才能正确下载和 运行 更新版本的 apk 文件。按预期更新自身。

让这成为与我做过同样事情的任何人的示例。 测试手动更新功能时使用生成的 apk。

最后,我想分享我的代码。我将其从 FTP 更改为通过 HttpURLConnection 直接下载。两个版本都工作正常(问题中的代码和这个)。所以请随意选择适合您的工作。

class Update implements Runnable {
    @Override
    public void run() {
        try {
            URL url = new URL("mysite.com/app-release.apk");
            HttpURLConnection c = (HttpURLConnection) url.openConnection();
            c.setRequestMethod("GET");
            c.setDoOutput(true);
            c.connect();
            String PATH = getExternalStoragePublicDirectory(DIRECTORY_DOWNLOADS).getAbsolutePath();
            File file = new File(PATH);
            File outputFile = new File(file, "app-release.apk");
            FileOutputStream fos = new FileOutputStream(outputFile);
            InputStream is = c.getInputStream();
            byte[] buffer = new byte[1024];
            int len1 = 0;
            while ((len1 = is.read(buffer)) != -1) {
                fos.write(buffer, 0, len1);
            }
            fos.close();
            is.close();
            Intent promptInstall = new Intent(Intent.ACTION_VIEW)
                    .setDataAndType(Uri.fromFile(outputFile), "application/vnd.android.package-archive")
                    .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(promptInstall);
        } catch (Exception ex) {
            //catch exception
        }
    }
}