Kann NetLink nicht in eine SO -Bibliothek für direkte Verwendung durch eine APK zusammengestellt werden?
Posted: 18 Aug 2025, 11:28
Ich versuche, Kernel -Nachrichten in einem UserSpace -Programm über ein benutzerdefiniertes NetLink -Protokoll zu empfangen. Rufen Sie beispielsweise den Plug-In- und Auszugsstatus der DP-Schnittstelle und die Informationen der angeschlossenen Geräte ab. Wenn ich den Userspace -Code in eine ausführbare Datei zusammenstelle und direkt im Android -Gerät ausführt, funktioniert er korrekt und empfängt Kernel -Nachrichten. Die Registrierung des benutzerdefinierten Protokolls im Kernel -Teil wurde abgeschlossen, weshalb das ausführbare Programm die Informationen überwachen kann. Wenn ich jedoch denselben Benutzerspace -Code in eine gemeinsam genutzte Bibliothek (.SO) für einen APK zusammenstellen kann, begegne ich einen Laufzeitfehler im Bind -Schritt: [/b] Kann NetLink nicht in eine SO -Bibliothek für direkte Verwendung durch eine APK (kompiliert werden. Die Bibliothek hat also keinen Prozess.)? Wie kann ich dieses Problem beheben und beheben? < /P>
Ich habe festgestellt Funktion auf [/b] Sockets. Interessanterweise stellte ich fest, dass die Bindung an Standardprotokolle bei der Targeting von SDK 32 ordnungsgemäß funktioniert. works without errors in both cases:
[/b] vom APK aufgerufene Bibliothek fällt mit fehl [/b] Fehler
[/list]
struct sockaddr_nl sa;
memset(&sa, 0, sizeof(sa));
sa.nl_family = PF_NETLINK;
sa.nl_groups = 1;
fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_TEST);
bind(fd, (struct sockaddr *) &sa, sizeof(sa));
< /code>
1.at Erstens erstellen sogar ein Socket einen Fehler. Später hat die Ausführung "ADB Shell SetEnforce 0" dieses Problem behoben. Aber der Bindungsfehler bleibt weiterhin bestehen. Ich habe dieser privilegierten App die Berechtigung von Local_Mac_address hinzugefügt, aber es hat nicht funktioniert.
Code: Select all
Error message: bind error: Operation not permitted。
Ich habe festgestellt
Code: Select all
bind()
Code: Select all
NETLINK_ROUTE
Code: Select all
bind()
- As a standalone executable
- When compiled into a shared library (.so) called by an APK
Code: Select all
struct sockaddr_nl sa;
memset(&sa, 0, sizeof(sa));
sa.nl_family = PF_NETLINK;
sa.nl_groups = 1;
fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
bind(fd, (struct sockaddr *) &sa, sizeof(sa));
< /code>
Mit einem [b] benutzerdefinierten Protokoll (netlink_test) < /strong>: < /p>
[list]
[*] Es treten keine Fehler auf, die in der ausführbaren Ausführungsleistung < /p>
< /li> die < /p>
< /li> Die -An> auftreten..so
Code: Select all
bind()
[/list]
struct sockaddr_nl sa;
memset(&sa, 0, sizeof(sa));
sa.nl_family = PF_NETLINK;
sa.nl_groups = 1;
fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_TEST);
bind(fd, (struct sockaddr *) &sa, sizeof(sa));
< /code>
1.at Erstens erstellen sogar ein Socket einen Fehler. Später hat die Ausführung "ADB Shell SetEnforce 0" dieses Problem behoben. Aber der Bindungsfehler bleibt weiterhin bestehen. Ich habe dieser privilegierten App die Berechtigung von Local_Mac_address hinzugefügt, aber es hat nicht funktioniert.