VirtualApp est une solution de sandboxing avancée pour Android, permettant l'exécution de multiples instances d'applications sur un même appareil. Cette technologie trouve des applications variées, notamment pour le multi-comptes d'applications, les environnements de jeu, ou encore l'optimisation des performances des jeux mobiles. Ce guide vous initiera au développement de plugins pour VirtualApp, en couvrant les API essentielles et des exemples concrets.
Introduction au Développement de Plugins VirtualApp
Configuration de l'Environnement de Développement
Pour commencer, assurez-vous de disposer des éléments suivants :
- Android Studio version 4.0 ou supérieure.
- Gradle version 6.0 ou supérieure.
- Le code source de VirtualApp (disponible sur GitCode).
Après avoir cloné le dépôt et ouvert le projet dans Android Studio, synchronisez les dépendances. Le fichier de configuration clé pour le développement de plugins est VAConfig.gradle.
Compréhension de l'Architecture
VirtualApp adopte une architecture en couches. Le dévelopement de plugins interagit principalement avec la couche Framework et la couche Native :
- VA Framework : Gère les services et les mécanismes d'accroche (hooking) des applications.
- VA Native : Comprend le système de fichiers virtuel, les hooks d'entrées/sorties et les hooks liés à la machine virtuelle.
- Couche Système Android : Assure la compatibilité avec les fonctionnalités du système d'exploitation sous-jacent.
API Fondamentales
Gestion du Cycle de Vie des Applications
VirtualApp offre des API complètes pour gérer le cycle de vie des applications. La classe DelegateApplicationExt.java permet de synchroniser les événements du cycle de vie entre le plugin et l'application hôte.
Les méthodes importantes incluent :
onCreate(): Point d'entrée pour l'initialisation du plugin.onConfigurationChanged(): Gestion des changements de configuration.onLowMemory(): Traitement des situations de mémoire faible.
API de Correction des Vues Distantes (RemoteViews)
Pour les composants système tels que les notifications, une API spécifique permet de corriger les RemoteViews. Cette fonctionnalité est implémentée dans RemoteViewsFixer.java.
public RemoteViews makeRemoteViews(String key, Context pluginContext,
RemoteViews contentView, boolean isBig, boolean click) {
// Logique de correction des vues distantes
return contentView; // Exemple simplifié
}
Outils de Réflexion (Reflection)
VirtualApp inclut une classe utilitaire Reflect.java conçue selon une approche Fluent-API, simplifiant ainsi les opérations de réflexion Java.
// Exemple d'appel de méthode via l'outil de réflexion
try {
Object notificationBuilder = Reflect.on(Notification.Builder.class)
.create(pluginContext, notification)
.get();
// Utilisation de notificationBuilder...
} catch (Exception e) {
e.printStackTrace();
}
Cas Pratique : Développement d'un Plugin de Simulation de Localisation
Objectif Fonctionnel
Cet exemple vise à créer un plugin permettant de définir une localisation virtuelle pour une application spécifique au sein de VirtualApp.
Étapes de Développement
-
Création du Module Plugin : Ajoutez un nouveau module à votre projet. Modifiez son fichier
build.gradlepour inclure la dépendance VirtualApp : ```dependencies { implementation project(':lib') }
-
Implémentation de l'Accroche de Service de Localisation : Créez une classe
LocationHookhéritant de la classe de baseHookde VirtualApp. Redéfinissez la méthodeafterHookedMethod: ```public class LocationHook extends XC_FrameworkHook { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { // Logique pour modifier les informations de localisation Location mockLocation = new Location("virtual_provider"); mockLocation.setLatitude(39.9042); // Coordonnées exemple (Pékin) mockLocation.setLongitude(116.4074); // Assurez-vous que les autres champs pertinents de Location sont définis si nécessaire mockLocation.setTime(System.currentTimeMillis()); mockLocation.setAccuracy(1.0f); // Précision exemple
param.setResult(mockLocation); // Retourner la localisation simulée }}
-
Enregistrement du Service du Plugin : Déclarez le service dans le fichier
AndroidManifest.xmldu plugin : ``` -
Communication Plugin-Hôte : Utilisez le mécanisme de communication inter-processus de VA pour l'échange de données : ```
// Dans votre service ou activité de plugin VClient.get().getService().registerPlugin("location_service", new PluginInfo(getPackageName(), LocationPluginService.class.getName()));
Flux d'Exécution du Plugin
L'architecture de processus de VirtualApp garantit l'exécution isolée des plugins et la séparation des ressources.
Ressources de Développement Avancé
Documentation Officielle
- Guide de Développement :
doc/VADev.md - Documentation Anglaise :
doc/VADev_eng.md
Structure du Code Source
- Définitions des API de Plugin :
lib/src/main/java/com/lody/virtual/client/ - Implémentations des Services :
lib/src/main/java/com/lody/virtual/server/
Points Clés à Considérer
- Compatibilité des Versions : VirtualApp requiert une adaptation pour différents niveaux d'API Android. Consultez
PackageParserCompat.javapour les stratégies de gestion des versions. - Conflits de Ressources : Isolez les espaces de noms des ressources des plugins. Il est conseillé d'utiliser des préfixes uniques pour les ressources de chaque plugin.
- Optimisation des Performances : Évitez les opérations longues dans les méthodes d'accroche. Privilégiez les traitements asynchrones lorsque cela est possible.
En maîtrisant les API et les exemples présentés, vous êtes désormais équipé pour développer vos propres plugins VirtualApp. Les capacités de sandboxing offertes par VirtualApp ouvrent de nouvelles perspectives pour le développement d'applications mobiles.