Künstliche Intelligenz
Wie offen ist Metas VR-Plattform für Sideloading?
Meta hat diese Woche die Utility-App „VR Android File Manager“ aus dem Horizon Store entfernt. Die App gewährte Zugriff auf den Android-Dateimanager der Meta Quest und erlaubte es, Android-Anwendungen aus externen Quellen am Store vorbei direkt auf Meta Quest zu installieren.
In einer Nachricht an den Entwickler begründete Meta den Schritt damit, dass die App die Installation anderer Anwendungen außerhalb des Horizon Stores ermögliche. Um die Integrität der Plattform zu wahren, müsse diese Funktion entfernt und die App erneut eingereicht werden. Erst dann werde über eine Wiederaufnahme in den Horizon Store entschieden, so Meta.
Der Entwickler, bekannt unter dem Pseudonym „Anagan79“ und durch sein außerhalb des Horizon Stores vertriebenes Tool „Quest Games Optimizer“, warf Meta in seiner Reaktion vor, ein geschlossenes System zu betreiben: Während andere Android-Geräte Sideloading standardmäßig unterstützen, sei dies unter Horizon OS nicht der Fall. Der „VR Android File Manager“ war eineinhalb Monate im Horizon Store verfügbar und erreichte in dieser Zeit mehr als 50.000 Nutzer.
Sideloading auf Quest: Möglich, aber umständlich
Das Betriebssystem der Meta Quest, Horizon OS, basiert auf einer stark angepassten und erweiterten Android-Version. Wie auf anderen Android-Geräten werden Anwendungen im APK-Format („Android Package Kit“) bereitgestellt.
Meta erlaubt die Installation von APKs aus anderen Quellen als dem Horizon Store, stellt dafür aber einige Hürden auf. Nutzer müssen zunächst ein Entwicklerkonto einrichten, wofür eine gültige Kreditkarte oder Telefonnummer hinterlegt werden muss. Erst danach lässt sich der für das Sideloading erforderliche Entwicklermodus auf dem Gerät aktivieren. Für das Sideloading selbst müssen Nutzer ihre Meta Quest per USB-C-Kabel mit einem Rechner (Windows, MacOS oder Linux) verbinden. Die Installation von APKs erfolgt anschließend mithilfe spezieller Kommandozeilenbefehle oder, wesentlich komfortabler, durch die Sideloading-Anwendung „SideQuest“.
Der „VR Android File Manager“ umging diese Hürden vollständig. Nach der Installation der Utility-App über den Horizon Store konnten Nutzer per Browser heruntergeladene APKs direkt auf der Quest installieren – ganz ohne Entwicklerkonto, Entwicklermodus oder externe Geräte.
Metas Plattform-Missbrauchsrichtlinien verbieten Apps im Horizon Store, welche die Sideloading-Beschränkungen umgehen. Dass der „VR Android File Manager“ überhaupt im Store zugelassen wurde, dürfte auf eine ungenaue Prüfung seitens Meta zurückzuführen sein. Das Unternehmen wurde offenbar erst durch mediale Berichterstattung und soziale Netzwerke auf die Sideloading-Funktion der Anwendung aufmerksam.
Meta wählt den Mittelweg
Der Rauswurf war absehbar. Bereits im Juni hatte Meta einen anderen Entwickler gezwungen, eine ähnliche Funktion aus der VR-App „Mobile VR Station“ zu entfernen. Beim „VR Android File Manager“ ergäbe die Entfernung wenig Sinn: Die App öffnet lediglich den Dateimanager des zugrundeliegenden Android-Betriebssystems (mit dem sich APKs installieren lassen) und hat darüber hinaus keine andere Funktion. Quest-Nutzern ist der Dateimanager standardmäßig verborgen.
Sideloading ist ein natives Android-Feature und auf den meisten Android-Smartphones ohne große Umwege möglich. Nutzer müssen in den Einstellungen die Option „Unbekannte Apps installieren“ aktivieren und können anschließend heruntergeladene APKs direkt auf dem Gerät installieren.
Anders sieht es auf iOS aus. Apple sperrt sich gegen Sideloading, musste jedoch auf Druck der EU in den Mitgliedsstaaten entsprechende Optionen zulassen. Die erzwungene Öffnung ist noch im Gange: Zwar erleichtert das jüngste iOS-Update das Einspielen alternativer App-Marktplätze, der direkte Download einzelner Apps von einer Entwickler-Webseite ist für Anbieter aber weiterhin mit großen Hürden verbunden. Das Sideloading ist also nach wie unter Apples Kontrolle. Für visionOS gelten zudem andere Regeln als für iOS und iPadOS: Auf Apple Vision Pro haben Endnutzer keinerlei Möglichkeit, Apps aus anderen Quellen als dem App Store zu installieren.
Im direkten Vergleich mit den großen Smartphone-Plattformen nimmt Metas VR-Plattform in puncto Sideloading eine Mittelstellung ein: weniger offen als Android, aber deutlich weniger geschlossen als iOS. Offener gestaltet sind die VR-Headsets der Marke Pico, die ebenfalls auf Android basieren und anders als Meta auf künstliche Hürden beim Sideloading verzichten.
Was macht Google mit Android XR?
Dass Meta den Nutzern Steine in den Weg legt, hat mehrere Gründe. An erster Stelle dürften finanzielle Interessen stehen. Meta behält 30 Prozent der Einnahmen aus dem Store ein. Alternative App-Stores und externe Bezugsquellen bedrohen dieses Geschäftsmodell langfristig.
Sicherheitsaspekte dürften ebenfalls eine Rolle spielen: Könnten Verbraucher unkontrolliert Software installieren, würden die Geräte häufiger durch Schadprogramme in Mitleidenschaft gezogen. Anstatt Nutzer zu bevormunden, könnte Meta aber auch, wie andere Hersteller, auf Warnhinweise setzen.
Zu guter Letzt dürfte Meta mit den Sideloading-Beschränkungen auch Piraterie eindämmen wollen. Die VR-Plattform des Unternehmens ist ohnehin stark von Raubkopien betroffen. Die Möglichkeit, APKs aus unbekannten Quellen ohne Umwege auf dem Headset zu installieren, würde der Piraterie Tür und Tor öffnen.
Offen ist noch, wie sich Google mit Android XR positionieren wird. Wird das Sideloading auf dieser Plattform so einfach wie auf Android-Smartphones und zu einem Erfolgstreiber für kommende Android-XR-Headsets, dann könnte Meta vielleicht nachziehen. Vorerst dürfte das Unternehmen jedoch am bewährten Modell festhalten. Eine Plattform nachträglich zu öffnen, ist aus PR-Sicht stets einfacher, als sie im Nachhinein einzuschränken.
Der VR Android File Manager ist unter dem Namen XR Native Android File Manager frei im Netz verfügbar. Ist die App einmal per Sideloading installiert, entfallen Metas Hürden für das Sideloading weiterer APKs.
(tobe)
Künstliche Intelligenz
Trump: Exportkontrolle für Software und Zollverdoppelung für China
US-Präsident Donald Trump hat zusätzliche Zölle in Höhe von 100 Prozent für Importe aus China in die USA angekündigt. Diese würden ab dem 1. November –oder je nach dem weiteren Agieren Chinas auch früher – erhoben, schrieb der Republikaner auf seiner Plattform „Truth Social“ und begründete das Vorhaben mit der aktuellen Handelspolitik Chinas. Zwischen China und den USA herrscht derzeit eine Pause im Zollstreit, der im Frühjahr eskaliert war. Beide Länder hatten im April Importe aus dem jeweils anderen Land mit Aufschlägen von mehr als 100 Prozent belegt. Laut Medienberichten plant China jetzt neue Exportbeschränkungen für seltene Erden.
Aus der Mitteilung von Trump ging nicht hervor, ob die nun angekündigten Zölle eine weitere Erhöhung zu den bereits im Frühjahr angekündigten sind oder wie sie sich zu ihnen verhalten. Trump kündigte in seinem Post zudem Exportkontrollen für jegliche wichtige Software ab dem 1. November an. Genauere Details dazu nannte er nicht. Die sogenannten Exportkontrollen sind meistens Ausfuhrsperren, die von der Regierung in einzelnen Fällen aufgehoben werden können. Dadurch kann ein Land Einfluss darauf nehmen, welche Produkte in andere Staaten gelangen.
Am Ende des zweiten Absatzes seines Posts kündigt Trump Exportkontrollen für Software an.
(Bild: „Truth Social„, Screenshot: heise medien)
Trump stellt Treffen mit Xi infrage
Bereits Stunden zuvor hatte Trump sein geplantes Treffen mit Chinas Präsident Xi Jinping in Südkorea mit Verweis auf den laufenden Handelskonflikt infrage gestellt. Er habe Xi beim Gipfel der Asiatisch-Pazifischen Wirtschaftsgemeinschaft (Apec), der Ende Oktober stattfindet, treffen sollen – „aber jetzt scheint es keinen Grund mehr dafür zu geben“, schrieb der Republikaner am Freitag auf „Truth Social“. Trump begründete seine Aussage damit, dass China angeblich „Briefe an Länder in aller Welt“ geschickt habe, in denen Exportbeschränkungen für seltene Erden und andere Materialien angekündigt wurden. Dies „sei aus dem Nichts gekommen“, könne den Welthandel lahmlegen und vielen Staaten schaden. Die Volksrepublik werde zunehmend „feindselig“, meinte Trump.
In seinem neuen Post spezifizierte er nun, dass China ab November unter anderem Exportkontrollen auf beinahe alle Produkte angekündigt habe, die es herstellt. Die sogenannten seltenen Erden sind wichtig für Elektronik von Smartphones bis Fernsehern sowie in der Autoproduktion und der Rüstungsindustrie. China spielt eine zentrale Rolle bei der weltweiten Versorgung mit den Mineralien. Laut Erhebungen (PDF) der US-Geologie-Behörde USGS, welche dem Innenministerium unterstellt ist, werden rund 70 Prozent aller seltenen Erden in China gefördert.
(nie)
Künstliche Intelligenz
LaunchAngels: Was sich hinter Apples neuen Start-„Engeln“ verbirgt
In macOS 26 alias Tahoe ist eine neue Kategorie von Launch-Arten hinzugekommen, über die Apple bislang schweigt: Auf LaunchDaemons und LaunchAgents treffen die sogenannten LaunchAngels. Ein entsprechendes Verzeichnis findet sich im Ordner /System/Library
, wie Mac & i-Autor und macOS-Experte Howard Oakley entdeckt hat. Es ist noch nicht viel darüber bekannt, was es damit auf sich hat. Klar ist nur, dass die Technik aktuell für drei Apple-eigene Routinen zum Einsatz kommt.
Drei LaunchAngels entdeckt
Während Daemons Hintergrundprozesse sind, die unabhängig agieren, als root
bereits vor dem Login laufen, indirekt mit Nutzerprozessen interagieren und von launchd
verwaltet werden, laufen Agents zwar unter der Kontrolle von launchd
, werden aber vom Nutzer angefordert und interagieren mit Prozessen und Daemons direkt. Die Verwaltung erfolgt über plist-Dateien. Das ist bei Angels genauso.
Aktuell gibt es im System (macOS 26.0.1) drei LaunchAngels: GameOverlayUI, Posterboard und AccessibilityUIServer. Letzteres hilft bei Eingabehilfen und ist direkt mit dem Prozess Accessibility verbunden. GameOverlayUI hat mit dem neuen Game-Overlay-System zu tun, das Apple nun Spielen gönnt. PosterBoard scheint mit der Konfiguration des Lockscreen zu tun zu haben, etwa um dort Kurzbefehle zu platzieren – allerdings scheint es sich dabei noch um einen Test zu enthalten. Der Key „_ExperimentalNonLaunching“ ist hierfür gesetzt.
Geschütztes Verzeichnis
Oakley entdeckte auch, dass alle drei LaunchAngels Referenzen zu RunningBoard haben, einem Life-Cycle-Management-Werkzeug. Diese gibt es für Agents und Daemons bislang nicht. Es bleibt abzuwarten, was Apple mit den LaunchAngels künftig plant – und warum der Hersteller dafür eine neue Kategorie der Startwerkzeuge eingeführt hat. Es gibt derzeit keinen Weg, eigene Angels zu definieren, das Verzeichnis ist geschützt.
Unklar ist auch noch, ob LaunchAngels im Library-Ordner des Nutzers funktionieren oder eben nur systemweit. Letzteres müsste implementiert werden, sofern Apple die Technik für Drittanbieter-Apps als neue Form von Diensten öffnet. Welche Vorteile dies für Entwickler hätte, ist ebenfalls noch nicht gesagt. Durch den Schutz können Angels jedenfalls bislang nicht missbraucht werden.
(bsc)
Künstliche Intelligenz
Asynchrone Programmierung – Teil 1: C++ komfortabel mit Boost.Asio
Mit Boost.Asio gibt es eine altbekannte und dennoch moderne, effiziente und mächtige Bibliothek für die asynchrone Programmierung in C++. Je nach C++-Version können Entwicklerinnen und Entwickler damit auf verschiedene Arten asynchron programmieren, ohne dabei auf komplizierte und fehleranfällige Threading-Mechanismen zurückgreifen zu müssen.
Martin Meeser ist selbständiger Diplominformatiker (Uni) und bietet Dienstleistungen zum Thema Softwareentwicklung an: Individual-Software-Entwicklung, Beratung zu Prozessen und Schulungen. In zahlreichen Projekten betreute er bisher Kunden unter anderem aus den Bereichen Automotive, Finance, Raumfahrt, Radioastronomie und Medizintechnik.
Dieser Artikel bildet den Auftakt einer Reihe zur asynchronen Programmierung in verschiedenen Sprachen – außer Python, das vor Kurzem erst vorgestellt wurde.
Einbinden von Boost.Asio
Auf Linux-Systemen kann man Boost in einer aktuellen Version über die diversen Paketverwaltungen beziehen, unter Ubuntu ist das beispielsweise mit apitude aktuell die Version 1.83:
sudo apt-get install libboost-all-dev
Möchte man die neueste Version (aktuell 1.89) einsetzen oder arbeitet unter Windows, lädt man Boost von der Homepage und baut es selbst. Die entsprechenden Anleitungen finden sich beim Anbieter. Es gibt auch eine baugleiche, reine Asio-Bibliothek – ohne Boost-Abhängigkeiten und mit einem anderen Namespace, die hier aber nicht betrachtet wird.
Context und Event Loop
Grundsätzlich erfordert asynchrone Programmierung ein verwaltendes System, das die API sowie die Mechanismen bereitstellt und den Programmablauf orchestriert. Hier hat sich allgemein der Begriff „Event Loop“ etabliert, Boost.Asio spricht jedoch von „Context“. Der geläufige Ansatz ist es, einen io_context
zu verwenden, wie folgendes Beispiel zeigt:
#include
#include
int main()
{
boost::asio::io_context io_context;
boost::asio::post(io_context, []()
{
std::cout << "Hello World from async context!" << std::endl;
});
// async execution startet nach dem Aufruf von io_context.run()
io_context.run(); // run() blockiert bis keine Arbeit mehr vorliegt
}
Listing 1: Einfaches Beispiel zur Verwendung eines Kontextes
post()
reiht das Funktionsobjekt, das als Parameter übergeben wird – hier ein Lambda – in die Warteschlange des Kontexts ein und springt sofort zurück.
Der Kontext startet durch den Aufruf von io_context.run()
und beginnt nun, die Funktionen der Reihe nach abzuarbeiten. In dem Beispiel wird „Hello World…“ also erst nach io_context.run()
ausgegeben.
So initialisiert man das Programm, ohne dass asynchrone Mechanismen auf ein nicht fertig initialisiertes System einwirken. Das vermeidet Fehler, die unter bestimmten Umständen auftreten und schwer zu finden sind, beispielsweise zufällige Nachrichten aus einem anderen Prozess oder eine hohe Auslastung der CPU durch ein anderes Programm.
Die Methode io_context.run()
endet, sobald keine Aufgaben mehr vorhanden sind oder io_context.stop()
aufgerufen wird. io_context.run()
kann man nur einmal pro Thread verwenden. Es ist aber möglich, run()
mit dem gleichen io_context
aus mehreren Threads aufzurufen.
Im Fall von Listing 1 übergibt der io_context
die Arbeit einem Thread, was eine nebenläufige (concurrent) Ausführung bedeutet. In Listing 2 wird io_context.run()
von mehreren Threads aus aufgerufen. Übergibt man nun Aufgaben an den Kontext, dann führt dieser die Aufgaben sofort auf einem der Threads aus. Diese Ausführung ist wirklich parallel. Sind alle Threads bereits mit Arbeit ausgelastet, wird die neue Aufgabe in eine Warteschlange eingereiht. Sobald einer der Threads seine Aufgabe abgeschlossen hat, teilt Context ihm Arbeit aus der Warteschlange zu.
#include
#include
#include
#include
int main()
{
boost::asio::io_context io_context;
int n = 4;
std::vector<:thread> threads(n);
for (int i = 0; i < n; i++)
{
threads[i] = std::thread([&io_context](){ io_context.run();});
}
// ... parallel asynchrone Aktionen hier
for (auto& t : threads)
{
if (t.joinable()){ t.join(); }
}
}
Listing 2: Verwendung von mehreren Threads in einem io_context
Hier erahnt man bereits die Stärke des asynchronen Programmierstils: Die ausführenden Einheiten sind abgelöst von einem konkreten Thread
. Asynchrone Programme skalieren nativ und nutzen so viele Ressourcen, wie zur Verfügung stehen.
Nach meiner Erfahrung ist in der Regel ein Thread
völlig ausreichend, während mehrere Threads
vor allem bei Serversystemen oder ganz speziellen Aufgaben interessant sind, beispielweise zur Berechnung großer Primzahlen oder anderer algorithmischer Probleme. Je mehr Threads (bzw. CPU-Kerne) dem Kontext zur Verfügung stehen, desto mehr Teil-Berechnungen können parallel erfolgen – ohne jede Veränderung des Programms. Entwickler können sich vollständig auf die Funktionalität konzentrieren.
Es ist möglich, das Verhalten von io_context.run()
zu verändern, indem man einen work_guard
verwendet, wie in Listing 3 zu sehen ist.
#include
#include
int main()
{
boost::asio::io_context io_context;
boost::asio::executor_work_guard<:asio::io_context::executor_type>
work_guard(io_context.get_executor());
boost::asio::post(io_context, []()
{
std::cout << "Hello World from async context." << std::endl;
});
boost::asio::signal_set signals(io_context, SIGINT, SIGTERM);
signals.async_wait([&io_context /*&work_guard*/]
(const boost::system::error_code& ec, int signal)
{
io_context.stop(); // bricht sofort alles ab
// work_guard.reset(); // bricht ab, wenn alles fertig ist
});
io_context.run();
}
Listing 3: executor_work_guard kann verhindern, dass run() zurückspringt, wenn context keine Arbeit mehr hat.
Nun springt io_context.run()
erst dann zurück, wenn zum einen io_context.stop()
aufgerufen wurde – in diesem Fall kommen bereits vorgesehene Aufgaben nicht mehr zur Ausführung und gerade laufende werden mit einem Abbruch-Fehler gestoppt. Zum anderen springt die Funktion zurück, wenn work_guard.reset()
aufgerufen wurde – dann arbeitet das Programm alle gerade laufenden und auch alle vorgesehenen Aufgaben noch ab.
Bei letzterem sollten Entwicklerinnen und Entwickler darauf achten, dass sie innerhalb der eingereihten Einheiten keine neuen Aufgaben hinzufügen – denn sonst gerät der Code in eine asynchrone Endlosschleife und io_context.run()
wird niemals enden.
Es gibt noch zwei weitere Kontexte in Boost.Asio: thread_pool
(siehe Listing 4) und system_context
(siehe Listing 5).
#include
#include
int main()
{
boost::asio::thread_pool thread_pool(16);
boost::asio::post(thread_pool, []()
{
std::cout << "Hello World from async context!" << std::endl;
});
// thread_pool.stop(); // bricht alle Arbeit im Pool sofort ab
thread_pool.join(); // wartet bis alle Arbeit abgeschlossen ist
Listing 4: Beispielhafte Verwendung eines thread_pool
Der thread_pool
ist eine einfache und empfohlene Alternative, wenn Entwickler mehrere Threads verwenden möchten und keine feingranulare Steuerung der einzelnen Threads benötigen. Eines muss man jedoch berücksichtigen: Im Gegensatz zum io_context
startet thread_pool
direkt nach der Konstruktion. Ansonsten verhält es sich analog zum io_context
: Mit der Methode thread_pool.stop()
brechen Entwickler die Ausführung sofort ab, mit thread_pool.join()
beendet das Programm aber noch alle Aufgaben. Wurde vorher stop()
aufgerufen, dann springt join()
sofort zurück.
Der system_context
ist von überall immer verfügbar – er muss nicht gestartet oder gestoppt werden. Er ist eine gute Wahl, wenn Entwickler an einem bestimmten Punkt ohne großen Aufwand und Vorbereitung – aber auch ohne eigene Steuerung – asynchrone Operationen ausführen möchten.
#include
#include
int main()
{
boost::asio::system_context system_context;
boost::asio::post(system_context, []()
{
std::cout << "Hello World from async context!" << std::endl;
});
}
Listing 5: Beispielhafte Verwendung von system_context
-
UX/UI & Webdesignvor 2 Monaten
Der ultimative Guide für eine unvergessliche Customer Experience
-
UX/UI & Webdesignvor 1 Monat
Adobe Firefly Boards › PAGE online
-
Social Mediavor 2 Monaten
Relatable, relevant, viral? Wer heute auf Social Media zum Vorbild wird – und warum das für Marken (k)eine gute Nachricht ist
-
Entwicklung & Codevor 2 Monaten
Posit stellt Positron vor: Neue IDE für Data Science mit Python und R
-
Entwicklung & Codevor 1 Monat
EventSourcingDB 1.1 bietet flexiblere Konsistenzsteuerung und signierte Events
-
UX/UI & Webdesignvor 4 Wochen
Fake It Untlil You Make It? Trifft diese Kampagne den Nerv der Zeit? › PAGE online
-
Apps & Mobile Entwicklungvor 3 Monaten
Firefox-Update 141.0: KI-gestützte Tab‑Gruppen und Einheitenumrechner kommen
-
Online Marketing & SEOvor 2 Monaten
So baut Googles NotebookLM aus deinen Notizen KI‑Diashows