Android: Principe MultiDex et optimisation

MultiDex:

Les bibliothèques de tiers de Google, android5.0 précédemment ne prend pas en charge le chargement plus dex, donc Google fournit plusieurs support bibliothèque MultiDex Dex chargé et utilisé lors de l'exécution.

Sous la version 5.0 sont également le taux de part de marché, et lorsque le fonctionnement des principes internes de MultiDex et correctifs domestiques, plug-in solutions technologiques sont les mêmes principes.

Les fichiers de classe et les fichiers Dex:

MultiDex = Multi + Dex (多 Dex)

Dex (Dalvik-exécutable)

* .Java / .kt ---- le code source de compilateur, générant JVM * .class peut être chargé et exécuté.

Le matériel du téléphone est limité, Google a développé spécifiquement pour une utilisation sur la plate-forme Android offre un environnement de machine virtuelle pour les programmes à exécuter sur Android.

Dans lequel les machines virtuelles sur les différentes versions du système, la plate-forme Android est divisé en:

  • Dalvik VM
  • ART VM

Ce qui précède deux sont différents et ne supportent pas les charges JVM et exécute le fichier de classe directement, mais plutôt dans le code source est compilé dans le fichier de classe en outre la traduction de la pluralité de fichiers de classe, de la reconstruction, l'interprétation, ou une étape de compression consistant à générer un fichier dex à charger les applications machine virtuelle est exécutée, l'exécution.

fichier de classe enregistre toutes les informations correspondant aux fichiers de classe: une piscine constante de la classe, des informations sur le terrain, la méthode de l'information

Tous les fichiers de classe sont recueillis seront compilés dans un fichier dex, le fichier dex contiendra toutes les informations devant le fichier de classe pool constant.

fichier dex pour les fichiers de classe pour l'élimination de la redondance, de sorte que le volume final des fichiers générés plus petit et plus rapide. 

nombre de problèmes et Overrun solutions: 

apk est essentiellement un paquet comprimé, de sorte qu'il peut être modifié à apk suffixe .zip

Après extraction:

processus de compilation natif génère un fichier dex par défaut.

Lorsque le projet la quantité de code beaucoup de temps jusqu'à ce que l'erreur:

Conversion to Dalvik format failed: Unable to execute dex: method ID not in [0,0xffff]: 65536

Qui est souvent dit: le nombre de façons plus 65536

Un fichier Dex est une collection de fichiers de classe:

C'est un fichier dex peut contenir plusieurs méthodes de plusieurs classes, qui sont tous attribués indice, lorsque la possibilité d'exécuter une méthode de référence virtuelle procédé correspondant selon l'indice. Dans lequel l'indice est compris entre 0 et 65535, de sorte que le procédé est limité au nombre 65.536.

Ces méthodes comprennent:

  • Les développeurs de méthodes ont écrit
  • méthode de bibliothèque tiers

idées de résolution de problèmes:

  • Dans la mesure du possible le nombre de façons de ne pas dépasser cette limite.
  • Devrait essayer d'enlever la confusion, supprimer le code inutile.
  • Dispersés en plusieurs Dex (comment générer plus dex, comment Dex supplémentaire est chargé et en cours d'exécution) ===== « MultiDex

MultiDex est la bibliothèque de support de fichiers Dex de Google qui prend en charge l'utilisation de plusieurs Dex dans votre application.


MultiDex utilisation:

  • utilisation Android5.0 +
  • utilisation Android5.0-
  • analyse de la structure d'emballage apk compilé

1.Android5.0 + Utilisation:

utilisation 2.Android5.0-:

 

Et pas le temps d'application personnalisée:

Quand il est nécessaire d'hériter l'application MultiDexApplication personnalisée.

Si le code d'origine n'est pas héritée application native, vous devez ajouter à attachBaseContext () dans

MultoDex.install(this)

changements APK qui se produisent avant et après l'utilisation sur une structure de paquet généré :( multidex montré ici après Android5.0)


MultiDex principe:

1. Principe de la compilation:

processus de compilation apk, les fichiers * classe. outil de ligne de commande dx pour générer le fichier classes.dex,

outil dx responsable du fichier de classe dans une machine virtuelle a besoin de fichier Dex.

package jar peut générer un fichier dex:

dx --dex --output=<target.dex> origin.jar

paramètres --multi-dex: 

--multi-dex:
   allows to generate several dex files if needed.

 Par conséquent --multi-dex au moment de la compilation est dans l'opération de dx processus, les paramètres de contrôle utilisés --multi-dex dex génèrent une pluralité de fichiers fractionnés pour obtenir le paquet final avec le package d'installation peut exécuter le apk.

Principe 2. Exécutez: Une analyse de l'entrée et le processus global

L'AAR comprend l'opération logique de l'installation.

Analyse des points d'entrée:

  •  Déterminer si la machine virtuelle supporte MultiDex
  • décompression Dex obtenir une liste des fichiers à installer
  • Dex monté dans le ClassLoader

3. juge de machine virtuelle

 ART et la différence de la machine virtuelle Dalvik:

Android4.4 et la version suivante utilise la machine virtuelle Dalvik, Dalvik de JIT (compilation de temps) correspond java.vm.version <2.0.0

APK -> INSTALLATION -> * .DEX-> Démarrer -> JIT-> Native Command -> Exécuter

Ce qui JIT: exécution d'exécution dynamique du bytecode dex à haute fréquence, puis traduit en code machine natif exécution, il a eu lieu lors de l'opération de l'application, réexécutez chaque besoin de temps pour re-faire le travail.

  • Démarrage lent (sans cache)
  • Plus de puissance pour courir lentement

Après Android4.4: ART d'AOT (devant compilateur de temps) correspond java.vm.version> = 2.0.0

APK -> Installer (AOT) -> instruction native -> Démarrer -> exécution

AOT où: lors de l'installation d'une application est livrée avec l'utilisation de tous les outils dans le fichier de package d'installation dex précompilés, précompilés bytecode en code machine, peut générer un fichier en cours d'exécution de l'OAT sur la machine locale et stockée localement suite pas besoin de compiler.

  • Démarrez plus vite
  • fonctionnement du bloc, faible consommation d'énergie

Ainsi, le jugement ci-dessus est que le code source est la machine virtuelle Dalvik ou ART

décompression 4.Dex:

List<? extends File> load(...){
  List files;
  if(!isModified(..)){//若apk未修改
     files = loadExistingExtractions(...);//加载之前解压的dex
  }else{
    files = performExtractions(...);//解压dex到指定的目录
    putStoredApkInfo(...);//保存已经解压的apk信息
  }
  return files;
}

Après décompression, la présence originale dans le fichier apk class2.dex sera extrait à utiliser les données de répertoire intégré / données en attente d'être utilisés.

Installation 5.Dex:

Dans la machine virtuelle, compiler les fichiers .class résultants sont requis par les charges de chargeur de classe en mémoire pour exécuter. Après application android est démarré, le système nous aidera à créer une classe de travail PathClassLoader à la charge, qui a une variable membre pathList: DexPathList son intérieur contient un tableau de l'élément: dexElements: Element [], chaque élément du tableau correspondra à un dex fichier, le système de fichiers par défaut premier dex (class.dex) pour charger le cas de la matrice.

Lors de l'exécution, lorsque vous avez besoin de charger une classe, pathClassLoader passera pathList l'élément de tableau d'avant en arrière à travers tous les éléments pour voir quel fichier dex a une classe correspondant, le retour direct, complétant ainsi la classe chargement.

void install(){
  //反射获取到pathclassloader的dexpathlist
  Field pathListsField = Multidex.findField(loader,"pathList");
  Object dexPathList = pathListsField.get(loader);
//生成dex文件对应的element数组
   expandFieldArray(dexPathList,"dexElements",makeDexElements(...))
}

6. processus global:

javac compiler tous les fichiers de code source généré fichier de classe, et génère ensuite une pluralité de fichiers dex outil dx.

Run déterminera la version de la machine virtuelle.

Si une machine virtuelle est un art, le processus a pris en charge au niveau du système de fichiers multi-Dex, tous les fichiers dex sont fusionnés en une avance d'avoine dans les fichiers d'installation d'application lorsque la course est également le fichier d'avoine, plus besoin d'appliquer faire face à leurs propres procédures.

Si Dalvik machine virtuelle, le système ne supporte pas le niveau de traitement fichier multi-Dex, vous devez installer leur propre usage dx, il est nécessaire d'extraire les fichiers dex de niveau 2 à une application de répertoire spécifique, obtenir un niveau 2 liste de Dex, puis Niveau 2 liste dex sera injectée dans l'opération de classloader.


Code Hot Fix:

  • Code Description Hot Fix
  • Code Hot Fix principe
  • Code Hot Fix démo

1. Code Hot Fix:

Il a publié un temps apk bug:

Option 1: Réédition apk

x.java- révisé « paquet compilateur - » New APK- « Shelf applications marché - » télécharger et installer manuellement apk- « pour redémarrer l'application - » pour terminer la réparation

  • Sortie sur les rayons
  • perception de l'utilisateur

Scénario 2: programme de réhabilitation thermique

x.java- révisée « patches compilés - » Les nouveaux patches - « cheveux à distance - » retour en mode silencieux téléchargement et installer des correctifs - « pour redémarrer l'application - » pour terminer la réparation

  • Sans application republication
  • L'utilisateur n'a pas Percevoir

2. Hot Fix le code fonctionne:

  • Générer correctif de code

ToBeFixed.java-> javac -.> Classe-> DX-> patch.dex

  • exécute package correctifs de code inject

PathClassLoader-> Pathlist-> dexElements

Le but est de laisser le patch correctif est inclus dans la catégorie du système de chargement prioritaire pour atteindre l'objectif de la réparation.

Par conséquent dexElements patch.dex peuvent être insérés dans l'avant de la matrice, à savoir, la pièce d'injection.

3. l'application du Code:

Avec une petite démonstration, par exemple, textview les paramètres d'affichage à réparer comme cliquez sur le bouton:

Générez ensuite patch:

En plus du code source à supprimer pour être réparé classe:

Ce fichier est similaire au code source de la réparation BOGUE i.

Création d'un correctif correspondant:

Utilisation commande dex dx génère un fichier:

Voir les outils de construction en cours de projet version utilisée:

Cela a généré un bon patch.

Le prochain patch est injecté Durée:

package com.yinlei.multidexdemo;

import android.content.Context;
import android.os.Environment;

import java.io.File;
import java.io.IOException;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

/**
 * 运行时注入补丁包
 */
public class HotFixManager {
    public static final String FIXED_DEX_SDCARD_PATH = Environment.getExternalStorageDirectory().getPath() + "/fixed.dex";

    /**
     * 注入补丁包
     * @param context
     */
    public static void installFixedDex(Context context){
        try{
            //获取收集目录的补丁包
            File fixedDexFile = new File(FIXED_DEX_SDCARD_PATH);
            //文件不存在,说明不需要热修复
            if (!fixedDexFile.exists()){
                return;
            }
            // 获取PathCLassLoader的pathList字段
            Field pathListField = ReflectUtils.findField(context.getClassLoader(),"pathList");
            Object dexPathList = pathListField.get(context.getClassLoader());
            
            // 获取DexPathList中的makeDexElements方法
            Method makeDexElements = ReflectUtils.findMethod(dexPathList,"makeDexElements",
                    List.class,File.class,List.class,ClassLoader.class);
            // 把待加载的补丁文件添加到列表中
            ArrayList<File> filesToBeInstalled = new ArrayList<>();
            filesToBeInstalled.add(fixedDexFile);
            
            // 准备makeDexElements()的其他参数
            File optimizedDirecotry = new File(context.getFilesDir(),"fixed_dex");
            ArrayList<IOException> suppressedException = new ArrayList<>();
            
            //调用makeDexElements(),然后得到新的elements数组
            Object[] extraElements = (Object[]) makeDexElements.invoke(dexPathList,filesToBeInstalled,optimizedDirecotry,suppressedException,context.getClassLoader());
            
            //获取原始的elements数组
            Field dexElementsField = ReflectUtils.findField(dexPathList,"dexElements");
            Object[] originElements = (Object[]) dexElementsField.get(dexPathList);
            
            //数组的合并
            Object[] combinedElements = (Object[]) Array.newInstance(originElements.getClass().getComponentType(),originElements.length+extraElements.length);
            //在新的elements数组中先放入补丁包中的数组,再放原来的数组,以确保优先加载我们补丁包中的类
            System.arraycopy(extraElements,0,combinedElements, 0, extraElements.length);//深拷贝
            System.arraycopy(originElements,0,combinedElements,extraElements.length,originElements.length);
            
            // 用新的combinedElements,重新复制给dexPathList
            dexElementsField.set(dexPathList, combinedElements);
        }catch (Exception e){
            throw new RuntimeException(e);
        }
    }
}

La dernière étape consiste à lancer une logique d'injection et les autorisations applicables:

Il est maintenant réparé look.

Tout d'abord tuer l'application, exécutez:

 Puis pousser l'application:

Après la réparation est maintenant la version.

TOUT:

  • compatibilité API avec les différentes versions du système
  • Non réalisé correctif ressources, pour réaliser le code correctif

optimisation MultiDex:

1.MultiDex en raison de commencer ANR:

Lors du démarrage, Multidex trouvera le niveau 2 fichier dex de l'APK d'origine, puis extraire le magasin à l'autre annuaire d'applications / données, puis Dex décompressé injecté dans PathClassLoader, les appels après la première dexopt d'injection seront optimisés pour le fichier Dex. odex, l'application effectivement chargée lorsque la classe est chargée par fichier .odex.

Il y a deux opérations de temps possible de ce processus:

  • Décompressez les fichiers
  • L'exécution du programme dexopt

Ces processus sont généralement exécutés dans le thread principal, comme aucun cas plus de 5 s click se produit en réponse à l'apparition de l'ANR.

2. Optimisation du démarrage MultiDex:

ANR cause du problème est temps processus IO effectué dans le thread principal du processus principal. opérations chronophages ne se produira que dans les applications installées démarrage initial, donc l'idée est de ne pas résoudre le processus principal

attachBaseContext () pour effectuer le temps MultiDex.install ()

Au lieu de cela dans un nouveau processus pour rendre ces opérations de temps.

Si une nouvelle démarrage à distance, le processus maître d'origine est devenu un processus d'arrière-plan, il ne sera pas la cause des problèmes ANR bloque.

idées spécifiques:

Cliquez sur l'icône de l'application APP dans les applications - « processus principal est levée - » Application.attachBaseContext- « Dex est déjà initialisé.

Si vous avez installé pour la première opération Dex temps, appelez multidex.install () et le processus d'initialisation de l'application ultérieure. (Décompression DEX, l'installation, l'application fichier d'initialisation)

Si vous ne initialize Dex pour la première fois, il entre dans une boucle: suspendre le processus principal, et de continuer à détecter la présence ou l'absence temp.file, il est juste de sortir de la boucle.

Après les principaux blocages du processus en même temps commence un nouveau processus (dex processus de chargement), après le processus de chargement Dex est tiré, soulevé l'écran de dexActivity pour afficher l'application et créer un thread enfant, appel multidex.install () à dex d'installation de décompression, puis créez temp.file, enfin dexActivity à la fin (). puis exécuter dex processus de chargement est terminé.

Ensuite, regardez le processus principal, lorsque le processus de chargement du fichier intermédiaire temp.file dex a été créé, le principal processus de détection de boucle de processus arrêter le cycle, continuer à mettre en œuvre le principal processus d'initialisation logique pour compléter l'ensemble du processus.

 

Résumé: Le point clé est que l' installation de Dex , au- dessus d' une petite démo est truqué dans ce lien:

Publié 363 articles originaux · louange gagné 75 · vues 160 000 +

Je suppose que tu aimes

Origine blog.csdn.net/qq_39969226/article/details/105167392
conseillé
Classement