Android : mettre en œuvre la mise à jour de la version de l'application

〇. Préface

En tant que fonction de base des applications Android , la mise à jour de la version de l'application est indispensable pour chaque application, et il existe de nombreuses façons de réaliser cette fonction. Il y a quelque temps, notre projet a été revu, et la logique de mise à jour de l'application a été réorganisée.La fonction elle-même est relativement simple, mais il existe encore de nombreuses situations anormales possibles, et nous les enregistrons ici.

1. Utilisez OkHttp pour mettre à jour la version de l'application

Il existe trois méthodes principales : premièrement, vérifiez s'il existe une nouvelle version, puis téléchargez le fichier APK, et enfin installez le nouvel APK.

Voici comment détecter les nouvelles versions :

    /**
     * 检测是否有新的版本,如有则进行下载更新:
     * 1. 请求服务器, 获取数据;2. 解析json数据;3. 判断是否有更新;4. 弹出升级弹窗或直接进入主页面
     */
    private void checkVersion() {
        showLaunchInfo("正在检测是否有新版本...", false);
        String checkUrl = "http://localhost:8080/AndroidAPK/AndroidUpdate.json";

        OkHttpClient okHttpClient = new OkHttpClient();//创建 OkHttpClient 对象
        Request request = new Request.Builder().url(checkUrl).build();//创建 Request
        okHttpClient.newCall(request).enqueue(new Callback() {//发送请求
            @Override
            public void onFailure(@NotNull Call call, @NotNull IOException e) {
                Log.w(TAG, "onFailure: e = " + e.getMessage());
                mProcess = 30;
                showLaunchInfo("新版本检测失败,请检查网络!", true);
            }

            @Override
            public void onResponse(@NotNull Call call, @NotNull Response response) {
                try {
                    Log.w(TAG, "onResponse: response = " + response);
                    mProcess = 30;
                    final ResponseBody responseBody = response.body();
                    if (response.isSuccessful() && responseBody != null) {
                        final String responseString = responseBody.string();
                        Log.w(TAG, "onResponse: responseString = " + responseString);
                        //解析json
                        final JSONObject jo = new JSONObject(responseString);
                        final String versionName = jo.getString("VersionName");
                        final int versionCode = jo.getInt("VersionCode");
                        final String versionDes = jo.getString("VersionDes");
                        final String versionUrl = jo.getString("VersionUrl");
                        //本地版本号和服务器进行比对, 如果小于服务器, 说明有更新
                        if (BuildConfig.VERSION_CODE < versionCode) {
                            //本地版本小于服务器版本,存在新版本
                            showLaunchInfo("检测到新版本!", false);
                            progressBar.setProgress(mProcess);
                            //有更新, 弹出升级对话框
                            showUpdateDialog(versionDes, versionUrl);
                        } else {
                            showLaunchInfo("该版本已是最新版本,正在初始化项目...", true);
                        }
                    } else {
                        showLaunchInfo("新版本检测失败,请检查服务!", true);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    showLaunchInfo("新版本检测出现异常,请检查服务!", true);
                }
            }
        });
    }

Voici comment télécharger le fichier APK :

    private void downloadNewApk(String apkName) {
        showLaunchInfo("检测到新版本,正在下载...", false);
        final File downloadDir = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS);
        if (downloadDir != null && downloadDir.exists() && downloadDir.isDirectory()) {
            //删除(/storage/emulated/0/Android/data/包名/files/Download)文件夹下的所有文件,避免一直下载文件堆积
            File[] files = downloadDir.listFiles();
            if (files != null) {
                for (final File file : files) {
                    if (file != null && file.exists() && file.isFile()) {
                        boolean delete = file.delete();
                    }
                }
            }
        }
        //显示进度条
        final ProgressDialog dialog = new ProgressDialog(this);
        dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//水平方向进度条, 可以显示进度
        dialog.setTitle("正在下载新版本...");
        dialog.setCancelable(false);
        dialog.show();
        //APK文件路径
        final String url = "http://localhost:7090/AndroidAPK/" + apkName;
        Request request = new Request.Builder().url(url).build();
        new OkHttpClient().newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(@NotNull Call call, @NotNull IOException e) {
                e.printStackTrace();
                String strFailure = "新版本APK下载失败";
                showLaunchInfo(strFailure, false);
                showFailureDialog(strFailure, apkName);
                dialog.dismiss();
            }

            @Override
            public void onResponse(@NotNull Call call, @NotNull Response response) {
                try {
                    final ResponseBody responseBody = response.body();
                    if (response.isSuccessful() && responseBody != null) {
                        final long total = responseBody.contentLength();
                        final InputStream is = responseBody.byteStream();
                        final File file = new File(downloadDir, apkName);
                        final FileOutputStream fos = new FileOutputStream(file);

                        int len;
                        final byte[] buf = new byte[2048];
                        long sum = 0L;
                        while ((len = is.read(buf)) != -1) {
                            fos.write(buf, 0, len);
                            sum += len;
                            float downloadProgress = (sum * 100F / total);
                            dialog.setProgress((int) downloadProgress);//下载中,更新进度
                            progressBar.setProgress(mProcess + (int) (downloadProgress * 0.7));
                        }
                        fos.flush();
                        responseBody.close();
                        is.close();
                        fos.close();
                        installAPKByFile(file);//下载完成,开始安装
                    } else {
                        String strFailure = "新版本APK获取失败";
                        showLaunchInfo(strFailure, false);
                        showFailureDialog(strFailure, apkName);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    String strException = "新版本APK下载安装出现异常";
                    showLaunchInfo(strException, false);
                    showFailureDialog(strException, apkName);
                } finally {
                    /*正常应该在finally中进行关流操作,以避免异常情况时没有关闭IO流,导致内存泄露
                     *因为本场景下异常情况可能性较小,为了代码可读性直接在正常下载结束后关流
                     */
                    dialog.dismiss();//dialog消失
                }
            }
        });
    }

Voici comment installer un nouvel APK :

    /**
     * 7.0以上系统APK安装
     */
    private void installAPKByFile(File file) {
        showLaunchInfo("新版本下载成功,正在安装中...", false);
        Intent intent = new Intent(Intent.ACTION_VIEW);
        //intent.putExtra("pwd", "soft_2694349");//根据密码判断升级文件是否允许更新
        intent.addCategory(Intent.CATEGORY_DEFAULT);
        Uri uri = FileProvider.getUriForFile(this, "com.lxb.demo0325.fileProvider", file);
        //intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        intent.setDataAndType(uri, "application/vnd.android.package-archive");
        startActivityForResult(intent, REQUEST_INSTALL);
    }

Comme ci-dessus, le code n'est pas difficile, principalement c'est le jugement de diverses exceptions possibles.Pour l'intégrité du code, j'ai téléchargé la démo complète de mise à jour de la version de l'application : https://github.com/beita08/AppUpdate

Parmi eux, le fichier de mise à jour de la configuration du serveur peut être au format Json :

{
    "VersionName":"3.1.1.2",
    "VersionCode":545,
    "VersionDes":"发现新版本, 赶紧更新吧!",
    "VersionUrl":"ApkName"
}

Références : https://www.cnblogs.com/xiaoxiaoqingyi/p/7003241.html

2. Utilisez des services tiers pour mettre à jour la version de l'application

En tant que fonction unifiée générale, la mise à jour de la version de l'application peut également être effectuée à l'aide de services fournis par des tiers, le plus couramment utilisé étant le bugly de Tencent.

Tencent Bugly est un service tiers fourni par Tencent pour les développeurs. Il comprend principalement trois fonctions principales : rapport d'exception, statistiques de fonctionnement et mise à niveau d'application. Pour nous, nous pouvons utiliser ses fonctions de mise à niveau d'application et de rapport d'exception. L'adresse officielle du site Web est : https://bugly.qq.com/v2/. Tout d'abord, pour utiliser la fonction Bugly, vous devez intégrer son SDK associé côté client :

Introduction de la fonction Bugly :

1. Mise à niveau de l'application :

Téléchargez notre fichier apk mis à jour sur l'arrière-plan bugly, définissez la stratégie de distribution (mise à niveau obligatoire facultative et limite de distribution, etc., et remplissez également la description de la mise à jour), et le client le téléchargera lorsqu'il détectera qu'il y a une nouvelle version dans le fond buggy.

Lien d'introduction du site officiel de mise à niveau de l'application : https://bugly.qq.com/docs/introduction/app-upgrade-introduction/?v=20180709165613

2. Rapports anormaux

Une fois le client intégré, les problèmes anormaux qui surviennent lors de l'utilisation des utilisateurs en ligne seront agrégés à l'arrière-plan bogue pour un résumé et une classification automatiques, ce qui est pratique pour analyser les problèmes qui surviennent du côté de l'utilisateur. (Ce journal se trouve sur le périphérique client), l'intention initiale de bugly est de résumer les informations anormales.

Lien d'introduction du site officiel de signalement anormal : https://bugly.qq.com/docs/introduction/bugly-introduction/?v=20181014122344#_3

Analyse des avantages et des inconvénients de Bugly :

avantage:

1. La mise à niveau de l'application n'a pas besoin d'occuper nos propres ressources de serveur après l'utilisation de services tiers, et la mise à niveau simultanée est également garantie.

2. Les rapports anormaux peuvent surveiller la situation anormale de l'utilisateur final, ce qui est difficile à détecter par nous-mêmes.

défaut:

1. Problèmes de sécurité des informations : le client doit intégrer le SDK approprié et télécharger notre fichier APK sur un serveur tiers ;

2. Lors de la mise à jour de l'application, le terminal de la tablette doit se connecter au réseau externe en arrière-plan bugly ;

3. Les fichiers apk dans nos différentes régions doivent être différenciés pour éviter les liens croisés lors du téléchargement (tous sont téléchargés à partir de l'arrière-plan bugly).

 

 

 

Je suppose que tu aimes

Origine blog.csdn.net/beita08/article/details/115251372
conseillé
Classement