Wie kann Android-Projekt kompiliert werden, wenn importierte Klasse im SDK fehlt?

9

OK, vielleicht ist es sehr einfach, aber ich kann es gerade jetzt nicht herausfinden.

Ich habe das Google Beispielprojekt Kartenleser in Android Studio 1.5.1 importiert, kompiliert es bei compileSdkVerison 23, Es funktioniert auf meinem Handy.

Dann ging ich durch das SDK und kam zum Quellcode zu android.nfc.tech.BasicTagTechnology . Ich fand TransceiveResult in% android.nfc.tech.BasicTagTechnology#transceive konnte nicht aufgelöst werden. Dann fand ich die Klasse TransceiveResult fehlt in meinem D:\Android\sdk\platforms\android-23\android.jar , aber präsentiert in Android-Quellcode hier D:\Android\sdk\sources\android-23\android\nfc\TransceiveResult.java dann erkannte ich, dass es von der Öffentlichkeit versteckt werden konnte, nicht exportiert, eigentlich ist es

%Vor%

Dann habe ich einige zufällige Dinge getan, nachdem ich das Projekt synchronisieren, säubern und neu erstellen, Caches ungültig machen / neu gestartet, noch nicht TransceiveResult auflösen kann, frage ich mich, da das Symbol im SDK verloren gegangen ist Wie kann das Projekt reibungslos kompiliert werden?

BEARBEITEN für endlich Aha

Wir nennen android.nfc.tech.BasicTagTechnology#transceive in unserem Code anstatt TransceiveResult , in der Kompilierzeit müssen wir TransceiveResult nicht auflösen, wir müssen nur android.nfc.tech.BasicTagTechnology#transceive auflösen, auf das in unserem Code verwiesen wird, bei dem ich verloren habe dieser Moment.

    
hylepo 15.03.2016, 07:06
quelle

1 Antwort

6

@hide bedeutet, dass hier nicht in den Dokumenten enthalten ist und es wird auch aus den Klassen innerhalb Ihrer android.jar entfernt, die bei der Kompilierung verwendet wird. Diese sind jedoch in Runtime verfügbar.

Aktualisierung: Um in Ihrer IDE zu verdeutlichen, wenn Sie in Ihre SDK-Klassen eintauchen, sehen Sie möglicherweise Verweise auf versteckte Elemente, die Sie nicht auflösen können. Das ist OK und es wird weiterhin kompilieren, solange sich diese in den SDK-Klassen nicht in Ihrem Code befinden.

Wenn Sie diese versteckten Klassen / Methoden / Felder verwenden möchten, haben Sie zwei Hauptoptionen:

1) eine Vollversion von android-framework.jar holen und kompilieren können. Dies hat jedoch den Nachteil, dass der kompilierte Code wahrscheinlich nicht in anderen Android-Versionen ausgeführt wird, da die Klasse oder die Methode möglicherweise gar nicht da ist. und auch BasicTagTechnology zum Beispiel ist eigentlich Paket privat, so dass Sie sowieso nicht darauf zugreifen können

2) verwende Reflexion:

%Vor%

Dies ist eine bessere Option in dem Sinne, dass es flexibler ist und Sie überprüfen können, ob die Klasse / Methode existiert, um sie zu initialisieren / aufzurufen, Ausnahme zu fangen etc.

    
djodjo 07.04.2016, 21:53
quelle