Kann ich eine versteckte (aber öffentliche) Methode überschreiben und ihre Super-Methode aufrufen?

9

Es gibt eine nicht öffentliche API, die ich außer Kraft setzen muss, um mit dem WebView von Android eine Kleinigkeit zu umgehen.

Die API ist versteckt, aber es ist öffentlich:

%Vor%

So kann ich es überschreiben, indem ich es einfach in meiner eigenen WebView-Klasse deklariere, abzüglich des @Override:

%Vor%

Ist es möglich, die Super-Methode aus meiner Überschreibung heraus aufzurufen? Normalerweise könnte ich schreiben:

%Vor%

Aber die Methode ist versteckt, daher ist super.selectText() nicht verfügbar. Wenn ich Reflexion verwende:

%Vor%

Ich bekomme eine Endlosschleife, weil sie meine überschriebene Methode aufruft.

Gibt es trotzdem eine Möglichkeit diese Methode zu überschreiben UND die super Methode aufzurufen?

Danke!

    
cottonBallPaws 23.03.2012, 18:04
quelle

3 Antworten

3
  

Gibt es sowieso, diese Methode zu überschreiben UND den Super zu rufen   Methode?

Nein, leider, wie in der Antwort auf die Frage So rufen Sie eine Superklassenmethode mit der Java-Reflektion auf können Sie dieses Problem nicht durch Reflektion lösen.

    
Konrad Reiche 02.08.2012, 00:11
quelle
1

Es gibt tatsächlich ein paar Möglichkeiten, dies zu tun, aber sie sind ein wenig arbeitsintensiv, also sollte wahrscheinlich als letzter Ausweg verwendet werden. Mit einem gerooteten Gerät können Sie die Symbole aus den Framework-Dateien auf dem Gerät extrahieren und in die android.jar-Datei in Ihrem sdk / platforms / -Ordner kopieren. Hatte ein Skript, um dies zu tun; verlor es in wechselnden Jobs.

Schritte aus dem Speicher (beachten Sie, dass Sie wahrscheinlich Probleme haben werden, da ich mich nicht an die Schritte erinnere ... für fortgeschrittene Benutzer, die verstehen, woran ich versuche zu kommen):

  • adb pull / system / framework / * (das sind alles JAR-Dateien). Es könnte sein genug, um framework.jar zu bekommen. entpacken Sie sie.
  • für jeden glaube ich dir ein classes.dex und ein Manifest. Ob Sie erhalten nur Klassendateien, überspringen Sie den nächsten Schritt
  • dex2jar the classes.dex und unjar die classes_dex2jar.jar oder was auch immer Ausgabe ist von Dex2jar, die Ihnen eine Reihe von .class-Dateien
  • geben wird
  • nimm die Klassendateien und füge sie deinem android sdk android.jar hinzu Datei (sdk / plattformen / android- # sdk # / android.jar).

Ich schlage vor, Ihren android- # sdk # -Ordner in einen android-1 # sdk # -Ordner zu kopieren, so dass android-19 android-119 wird und dann build.prop im Ordner ro.build.version.sdk ändert = 119, und baue dann gegen sdk 119 auf. Auf diese Weise hast du die Wahl, gegen eine saubere 119 oder deine gehackte 119 zu bauen. Beziehe dich einfach nicht auf irgendwelche com.android.internal.R Dateien, weil diese IDs nicht genau in meinen sind Erfahrung.

Sie können nun gegen diese Symbole kompilieren und auf sie zugreifen. Seien Sie jedoch nicht sauer, wenn sie die Funktionsweise der Dinge ändern, und sie sind nicht verpflichtet, die Kompatibilität mit Apps von Drittanbietern aufrechtzuerhalten.

Dies funktioniert, weil das hide-Tag nur während des SDK-Kompilierungsschritts verwendet wird und diese Symbole von der android.jar in Ihrem sdk entfernt. Wenn wir alle Symbole sammeln, die auf dem Gerät kompiliert sind, und sie in dein SDK-Krug stecken, ist es so, als ob sie nie entfernt worden wären.

Alternativ könntest du den kompletten Android-Baum runterziehen ( Ссылка ) und dann deine App gegen die erstellen volle Quelle, die der erste Schritt im Wesentlichen ist, indem sie bereits kompilierte Symbole übernimmt und mit ihnen arbeitet.

    
ryan gordon 05.05.2014 15:36
quelle
0
  1. JA KÖNNEN SIE:) - erster Teil der Frage
  2. NEIN, Sie können nicht - das zweite

Lösung 1) - was Sie hier am besten tun können, was Sie erreichen möchten

%Vor%

Lösungen 2)

gehört das Objekt (das diese Methode aufruft) zu Ihnen? und implementiert Schnittstelle?

Wenn ja, wie wäre es mit Proxy?

  1. Erweitern Sie die Klasse
  2. Proxy erstellen
  3. benutze Proxy
  4. Abfangen Methodenaufruf
  5. basierend auf einigen Bedingungen? eigene Implementierung aufrufen oder auf ursprünglich zurückgreifen?
ceph3us 31.05.2017 22:32
quelle

Tags und Links