2015-09-24 2 views
3

Notre application a trois dex dans apk qui a été construit par gradle avec la fonction multidex.Comment vérifier si le second dex a été chargé terminé ou non après l'installation de mon application?

Après l'application a été installée,

  1. ont été les principaux dex et le second dex chargé par le même chargeur de classe? Comment vérifier si le second (classes2.dex) et le troisième ont été chargés ou non? Puis-je vérifier dynamiquement le code? Ou pouvez-vous présenter un document relatif à la procédure de chargement de classe (ou dex) dans Android? Je ne suis pas familier avec ça.

Merci.

+0

Il y a une ressource ici: https://developer.android.com/tools/building/multidex .html –

+0

En outre, cela dépend si vous utilisez ART (par défaut sur API20 +) ou Dalvik (par défaut jusqu'à API19 inclus). –

+1

Pour la 2ème question, j'ai lu ClassLoader.java et trouvé que je peux vérifier si n'importe quelle classe dans le 2ème dex a été chargée par ClassLoader # findLoadedClass() avec la réflexion. – Zachary

Répondre

2

Je n'ai pas creusé dans le code ART, mais vous pouvez lire ce que le soutien Multidex lib fait pour Dalvik here:

  1. Oui. Les classes de tous les dex sont chargées par le même ClassLoader. Lorsque votre application charge, l'instrumentation MultiDex:
    • extrait les fichiers dex supplémentaires de la .apk et les met dans leurs propres fichiers .zip dans un répertoire de données (afin qu'ils sont impossibles à distinguer de APK au ClassLoader),
    • Obtient le ClassLoader du contexte de votre application et ajoute ces nouveaux fichiers .zip à la liste que le ClassLoader connaît de manière réfléchie.

Non seulement sont les dexes séparés chargés par le même ClassLoader, ils sont chargés par le même ClassLoader qui serait utilisé sans MultiDex.

  1. Les dexes supplémentaires doivent être configurés automatiquement lors du chargement de votre application. Il n'est pas facile de vérifier ce code, mais vous pouvez vérifier localement en vérifiant les journaux de votre appareil.

  2. Il existe quelques Android docs about the architecture of ART and Dalvik. Mais, il n'y a rien de mieux que de lire la source :)

+0

Merci pour votre réponse Fabian! J'ai encore une question, notre application a deux processus nommés Processus d'interface utilisateur et processus de service. Est-ce que leurs chargeurs de classe sont les mêmes? Sinon, est-il possible qu'une classe soit chargée deux fois? – Zachary

+0

@Zachary processus distincts dans le même APK sont entièrement isolés les uns des autres. Ainsi, les classes de votre processus 'UI' et votre 'service' ne se connaissent pas. 'Application' sera créé pour chaque processus, ce qui signifie que le support multidex sera installé pour les deux processus. Les deux processus utiliseront le même type de Classloader, mais ils seront des instances différentes et ne se reconnaîtront pas mutuellement. Cela a-t-il du sens? –

+0

oui cela a du sens. Alors est-il possible qu'une classe soit chargée deux fois puisque ces deux processus appartiennent à une même application? Un VM pour un processus, donc une classe sera chargée séparément dans chaque processus, est-ce? – Zachary