Möglich, System.so-Bibliothek in App zu überschreiben

8

Ich muss die Http Live Streaming-Implementierung von Android Media Player ändern. Die Implementierung befindet sich unter der Bibliothek für Lampenfieber Ссылка

Ich denke, diese Bibliothek wird zu einer libstagefight.so kompilieren, die Teil des Android-Systems sein sollte.

Meine Frage ist, ob ich einige Änderungen an dieser Bibliothek vornimmt und eine neue libstagefright.so kompiliere. Wenn ich dieses neue libstagefright.so in meiner neuen Anwendung lade und den Media Player abrufe, wird er den Code in meinem neuen libstagefright.so verwenden?

    
eroy4u 03.12.2013, 04:46
quelle

2 Antworten

7

Sie können die ursprüngliche Bibliothek nicht ersetzen, da Sie versuchen, loadLibrary wird die Bibliothek von /system/lib geladen. Wenn Sie das also nicht ersetzen (was auf nicht gerooteten Geräten nicht möglich ist), können Sie Ihren benutzerdefinierten Code nicht laden.

Ссылка legt die LD_LIBRARY_PATH standardmäßig fest. Und lädt es aus diesen Pfaden, wenn verfügbar. Wenn nicht, dann wird das Verzeichnis lib Ihrer Anwendung gesucht. aber nicht umgekehrt.

Ich habe das mit libwebkit.so in der Vergangenheit auf verschiedenen Mainstream-Geräten versucht und hatte kein Glück, es zum Laden zu bekommen, anstatt das in /system/lib .

Sie können mehr erfahren, wenn Sie sich Folgendes ansehen:

Ich bin mir ziemlich sicher, dass Sie den Standardklassenlader aus Sicherheitsgründen nicht ersetzen können.

Was Sie jedoch tun können, ist eine einfache Abzweigung des Media Player und laden Sie Ihre modifizierte libstagefright-modified.so . Es könnte andere Lösungen geben, den Code des Media Players nicht angesehen.

    
soulseekah 03.12.2013, 07:16
quelle
4

Da Sie wissen, dass Sie die Daten nur analysieren wollen, bevor sie an den MediaPlayer gelangen, schlage ich vor, die Android-Bibliotheken nicht zu verändern. Wie seeleseekah bereits erwähnt hat, wird es ohne ein gerootetes Gerät nicht funktionieren. Es gibt andere Möglichkeiten, obwohl sie beide Nachteile haben.

1) Wenn Sie nur auf neuere Versionen abzielen (4.2 oder später, glaube ich), können Sie sich neue Klassen ansehen, die dem Paket android.media hinzugefügt wurden, wie MediaExtractor und MediaCodec . Ich bin mit diesen nicht sehr vertraut, weil sie auf der Hardware, mit der ich arbeite, nicht verfügbar sind, aber sie könnten nützlich sein, um zu den Rohdaten zu gelangen. Hier ist eine gute Auswahl, um sie zum Abspielen von Videos zu verwenden. Der Nachteil ist, dass Klassen in früheren Versionen nicht verfügbar sind.

2) Die andere Option besteht darin, einen lokalen Proxy auf das Gerät zu setzen. Verbinden Sie MediaPlayer mit dem Proxy und stellen Sie die Anfrage selbst an den Medienserver. Siehe meine Antwort hier für ein wenig mehr Informationen dazu. Mit einem Proxy sehen Sie alle Daten, die durchkommen, und geben Ihnen die Möglichkeit, die ID3-Tags zu parsen. Es gibt den Nachteil, dass Sie die TS-Pakete parsen müssen, um einen elementaren Stream zu erstellen (im Wesentlichen den Job des Demuxers), aber es wird mit jeder Version von Android funktionieren. TS-Streams sind nicht schwer zu zerlegen, und ID3-Tags sind nicht zeitaufwändig zu analysieren, daher halte ich das für einen vernünftigen Ansatz.

    
Dave 04.12.2013 04:07
quelle