web-dev-qa-db-fra.com

Mise à jour automatique pour les applications Android (privées)

Je développe une application Android non publique, c'est-à-dire qu'elle ne sera pas disponible sur le marché Android mondial. L'application sera installée sur un nombre limité de clients, par exemple. en utilisant un fichier apk. Comment puis-je activer une fonctionnalité de mise à jour automatique dans cette application?

Je vois différentes options potentielles (je ne sais pas si elles sont techniquement difficiles voire impossibles à mettre en œuvre ou s'il existe des fonctionnalités pouvant être réutilisées):

  • À chaque lancement, l'application teste si une nouvelle version existe (en demandant un serveur), si c'est le cas, télécharge le nouvel apk et se remplace par la nouvelle version.
  • Utilisez (ou développez?) Une application ou un service séparé qui effectue le processus de vérification de mise à jour et de remplacement.
  • Utilisez (ou développez?) Une application du marché privé dotée d'une option de mise à jour automatique. Cette option est similaire à la seconde, mais plus générique: l’application du marché serait connectée à un référentiel, c’est-à-dire qu’elle gérerait un nombre arbitraire d’applications (privées).

Je préférerais la première option, car la fonctionnalité de mise à jour automatique est incluse dans l'application, ce qui nécessite moins d'efforts de développement.

50
janjonas

janjonas, dans l'entreprise où je travaille, nous avons eu un problème similaire avec Windows Mobile 6.x et nous utilisons à peu près la même solution proposée par EboMike:

enter image description here

L'application principale vérifie si elle est mise à jour par rapport à un WebService. Il reçoit la version actuelle et l'URL d'où télécharger la nouvelle version, si nécessaire. L'application principale démarre ensuite l'application Updater en passant l'URL, puis quitte.

Le programme de mise à jour effectue le téléchargement du nouveau programme, via HTTP, en affichant à l'utilisateur le% téléchargé. L'utilisateur peut annuler le téléchargement à tout moment, de manière contrôlée, et le programme de mise à jour peut enregistrer cette annulation.

Depuis que la nouvelle application est téléchargée, l'outil de mise à jour exécute la nouvelle application et quitte.

18
tcbrazil

Je pense que la première option représente le moins de travail possible pour vous, et en fait la plus propre aussi, car elle passera par le canal approprié consistant à utiliser le programme d'installation du paquet intégré d'Android, qui inclut la notification de l'utilisateur et l'option permettant à l'utilisateur d'abandonner l'installation si voulu.

Vous avez déjà tout décrit - recherchez une nouvelle version sur un serveur (ce serait bien de donner à l'utilisateur la possibilité de désactiver cette option), et s'il y a une nouvelle version, vous pouvez simplement créer un lien vers l'URL avec l'APK. (qui, IIRC, utilisera le gestionnaire de téléchargement du navigateur pour le télécharger), ou vous pouvez le télécharger avec votre application, puis pointer l'intention sur votre fichier local. L'utilisation du lien HTTP est techniquement moins laborieuse et plus propre - plus vous laissez le système d'exploitation faire, mieux c'est - à moins qu'il n'y ait une raison pour ne pas le faire.

6
EboMike

L'activation de "Installer une application non marchande" est toujours nécessaire pour toute application en dehors de Google Play. S'il n'est pas activé, le processus d'installation le demandera et redirigera l'utilisateur vers les paramètres de l'application, après quoi l'utilisateur pourra installer l'application.

Selon vos besoins, vous pouvez déléguer à un tiers lib. 

3
CelinHC

Certaines des autorisations que nous utiliserons pour cela sont les suivantes:

<uses-permission Android:name="Android.permission.ACCESS_SUPERUSER" />
<uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />

Laissez-moi vous expliquer un peu ... Le dernier, WRITE_EXTERNAL_STORAGE, s’explique de lui-même. Avec ACCESS_SUPERUSER, nous dirons au système que nous avons l'intention d'utiliser les privilèges root. READ_EXTERNAL_STORAGE sera nécessaire ultérieurement pour que votre application puisse lire les fichiers sur la carte SD.

En supposant que vous ayez téléchargé le fichier et que tous ces périphériques puissent être enracinés (nombre limité de clients, pas sur Play, etc.), vous pouvez le faire:

String filePath = Environment.getExternalStorageDirectory().toString() + "/your_app_directory/your_app_filename.apk";
Process installProcess = null;
int installResult = -1337;

try {
    installProcess = Runtime.getRuntime().exec("su -c pm install -r " + filePath);
} catch (IOException e) {
    // Handle IOException the way you like.
}

if (installProcess != null) {
    try {
        installResult = installProcess.waitFor();
    } catch(InterruptedException e) {
        // Handle InterruptedException the way you like.
    }

    if (installResult == 0) {
        // Success!
    } else {
        // Failure. :-/
    }
} else {
    // Failure 2. :-(
}
2
Nikola Tulimirovic

Cette méthode est peut-être très boiteuse, mais pour certaines entreprises, si vous croyez que cela s'applique, cela peut être très facile à mettre en œuvre.

  • Créez un écran de mot de passe (passwordActivity) demandant un mot de passe pour accéder à l'application.
  • Une fois le mot de passe entré, déclenchez un indicateur (définissez une valeur booléenne de false à true à l'aide des préférences partagées).
  • Placez le fichier .apk sur Google Store.
  • Modifiez le mot de passe une fois que tout le monde a installé l'application et publiez une nouvelle mise à jour sur Google Play Store.

Comme le logiciel va mettre en cache la valeur du drapeau, l’écran du mot de passe ne sera pas affiché, même si le mot de passe est modifié. Il n'apparaîtra que pour les nouvelles installations, vous devrez peut-être répéter le processus.

Remarque: Cette méthode pourrait mieux convenir s’il n’ya pas des centaines d’utilisateurs utilisant l’application. Et n'oubliez pas que cette méthode n'est pas non plus sécurisée. En résumé, si vous cherchez un moyen de garder l’application privée et que vous n’avez pas de problèmes de sécurité, voici ce que je recommande. 

0
0014

Mettez à jour l'application Assurez-vous que vous avez déjà votre nouveau téléchargement d'apk sur place 

void installNewVersion(String location) {

 Intent intent = new Intent(Intent.ACTION_VIEW);
 intent.setDataAndType(Uri.fromFile(new File(location + "app-debug.apk")),
            "application/vnd.Android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

}
0
wizmeaaaa