73 votes

Est-il possible de charger dynamiquement une bibliothèque au moment de l'exécution à partir d'une application Android ?

Existe-t-il un moyen de faire en sorte qu'une application Android télécharge et utilise une bibliothèque Java au moment de l'exécution ?

Voici un exemple :

Imaginons que l'application doive effectuer certains calculs en fonction des valeurs d'entrée. L'application demande ces valeurs d'entrée et vérifie ensuite si les valeurs requises sont correctes. Classe ou Method sont disponibles.

Sinon, il se connecte à un serveur, télécharge la bibliothèque nécessaire et la charge au moment de l'exécution pour appeler les méthodes requises en utilisant des techniques de réflexion. L'implémentation peut changer en fonction de divers critères tels que l'utilisateur qui télécharge la bibliothèque.

1voto

user4356087 Points 31

Si vous conservez vos fichiers .DEX dans la mémoire externe du téléphone, comme la carte SD (non recommandé ! Toute application ayant les mêmes permissions peut facilement écraser votre classe et effectuer une attaque par injection de code), assurez-vous que vous avez donné à l'application la permission de lire la mémoire externe. L'exception qui est levée si c'est le cas est "ClassNotFound" qui est assez trompeuse, mettez quelque chose comme ce qui suit dans votre manifeste (consultez Google pour la version la plus à jour).

<manifest ...>

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
                 android:maxSdkVersion="18" />
    ...
</manifest>

1voto

ashish Points 300

Je pense que la réponse de @Shlublu est correcte mais je veux juste souligner quelques points clés.

  1. Nous pouvons charger n'importe quelle classe depuis un fichier jar ou apk externe.
  2. De quelque manière que ce soit, nous pouvons charger l'activité à partir d'un jar externe mais nous ne pouvons pas la démarrer à cause du concept de contexte.
  3. Pour charger l'interface utilisateur à partir d'un jar externe, nous pouvons utiliser le fragment. Créez l'instance du fragment et intégrez-la dans l'activité. Mais assurez-vous que le fragment crée l'interface utilisateur dynamiquement. comme indiqué ci-dessous.

    public class MyFragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup 
      container, @Nullable Bundle savedInstanceState)
     {
      super.onCreateView(inflater, container, savedInstanceState);
    
      LinearLayout layout = new LinearLayout(getActivity());
      layout.setLayoutParams(new 
     LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
            LinearLayout.LayoutParams.MATCH_PARENT));
    Button button = new Button(getActivity());
    button.setText("Invoke host method");
    layout.addView(button, LinearLayout.LayoutParams.MATCH_PARENT,
            LinearLayout.LayoutParams.WRAP_CONTENT);
    
    return layout;
     }
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X