[{"data":1,"prerenderedAt":1929},["ShallowReactive",2],{"navigation_docs_de":3,"-de-developers-build-android":272,"-de-developers-build-android-surround":1924},[4,38,110,190,232],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":-1},"Erste Schritte","i-lucide-rocket","\u002Fde\u002Fgetting-started","de\u002F1.getting-started\u002Findex",[10,13,18,23,28,33],{"title":11,"path":7,"stem":8,"icon":12},"Übersicht","i-lucide-layout-grid",{"title":14,"path":15,"stem":16,"icon":17},"Installation","\u002Fde\u002Fgetting-started\u002Finstallation","de\u002F1.getting-started\u002F01.installation","i-lucide-download",{"title":19,"path":20,"stem":21,"icon":22},"Anmelden","\u002Fde\u002Fgetting-started\u002Fsign-in","de\u002F1.getting-started\u002F02.sign-in","i-lucide-log-in",{"title":24,"path":25,"stem":26,"icon":27},"Deine erste Instanz","\u002Fde\u002Fgetting-started\u002Ffirst-instance","de\u002F1.getting-started\u002F03.first-instance","i-lucide-play",{"title":29,"path":30,"stem":31,"icon":32},"Android: APK installieren","\u002Fde\u002Fgetting-started\u002Fandroid","de\u002F1.getting-started\u002F04.android","i-lucide-smartphone",{"title":34,"path":35,"stem":36,"icon":37},"iPhone\u002FiPad: mit AltStore\u002FSideStore installieren","\u002Fde\u002Fgetting-started\u002Fiphone-ipad","de\u002F1.getting-started\u002F05.iphone-ipad","i-lucide-tablet-smartphone",{"title":39,"icon":40,"path":41,"stem":42,"children":43,"page":-1},"Launcher","i-lucide-app-window","\u002Fde\u002Flauncher","de\u002F2.launcher\u002Findex",[44,45,50,55,60,65,70,75,80,85,90,95,100,105],{"title":11,"path":41,"stem":42,"icon":12},{"title":46,"path":47,"stem":48,"icon":49},"Instanzen","\u002Fde\u002Flauncher\u002Finstances","de\u002F2.launcher\u002F01.instances","i-lucide-boxes",{"title":51,"path":52,"stem":53,"icon":54},"Modloader","\u002Fde\u002Flauncher\u002Fmod-loaders","de\u002F2.launcher\u002F02.mod-loaders","i-lucide-layers",{"title":56,"path":57,"stem":58,"icon":59},"Mods","\u002Fde\u002Flauncher\u002Fmods","de\u002F2.launcher\u002F03.mods","i-lucide-puzzle",{"title":61,"path":62,"stem":63,"icon":64},"Modpacks","\u002Fde\u002Flauncher\u002Fmodpacks","de\u002F2.launcher\u002F04.modpacks","i-lucide-package",{"title":66,"path":67,"stem":68,"icon":69},"Modpacks teilen","\u002Fde\u002Flauncher\u002Fshare-modpacks","de\u002F2.launcher\u002F05.share-modpacks","i-lucide-share-2",{"title":71,"path":72,"stem":73,"icon":74},"Aus anderen Launchern importieren","\u002Fde\u002Flauncher\u002Fimport","de\u002F2.launcher\u002F06.import","i-lucide-folder-input",{"title":76,"path":77,"stem":78,"icon":79},"Clips & Screenshots","\u002Fde\u002Flauncher\u002Fclips","de\u002F2.launcher\u002F07.clips","i-lucide-clapperboard",{"title":81,"path":82,"stem":83,"icon":84},"Freunde & Chat","\u002Fde\u002Flauncher\u002Fsocial","de\u002F2.launcher\u002F08.social","i-lucide-messages-square",{"title":86,"path":87,"stem":88,"icon":89},"Erfolge","\u002Fde\u002Flauncher\u002Fachievements","de\u002F2.launcher\u002F09.achievements","i-lucide-trophy",{"title":91,"path":92,"stem":93,"icon":94},"Skins & Umhänge","\u002Fde\u002Flauncher\u002Fwardrobe","de\u002F2.launcher\u002F10.wardrobe","i-lucide-shirt",{"title":96,"path":97,"stem":98,"icon":99},"Einstellungen","\u002Fde\u002Flauncher\u002Fsettings","de\u002F2.launcher\u002F11.settings","i-lucide-settings",{"title":101,"path":102,"stem":103,"icon":104},"Updates","\u002Fde\u002Flauncher\u002Fupdates","de\u002F2.launcher\u002F12.updates","i-lucide-refresh-cw",{"title":106,"path":107,"stem":108,"icon":109},"Server","\u002Fde\u002Flauncher\u002Fservers","de\u002F2.launcher\u002F13.servers","i-lucide-server",{"title":111,"icon":112,"path":113,"stem":114,"children":115,"page":-1},"TRS Client","i-lucide-blocks","\u002Fde\u002Fclient","de\u002F3.client\u002Findex",[116,117,121,126,131,136,141,146,151,156,160,165,170,175,180,185],{"title":11,"path":113,"stem":114,"icon":12},{"title":118,"path":119,"stem":120,"icon":112},"Was ist der TRS Client?","\u002Fde\u002Fclient\u002Foverview","de\u002F3.client\u002F01.overview",{"title":122,"path":123,"stem":124,"icon":125},"TRS-Menü und HUD-Editor","\u002Fde\u002Fclient\u002Fmenu-and-hud-editor","de\u002F3.client\u002F02.menu-and-hud-editor","i-lucide-layout-dashboard",{"title":127,"path":128,"stem":129,"icon":130},"Leistung und FPS","\u002Fde\u002Fclient\u002Fperformance","de\u002F3.client\u002F03.performance","i-lucide-gauge",{"title":132,"path":133,"stem":134,"icon":135},"PvP-Module","\u002Fde\u002Fclient\u002Fpvp","de\u002F3.client\u002F04.pvp","i-lucide-swords",{"title":137,"path":138,"stem":139,"icon":140},"Zoom, Freelook und Toggle-Sprint","\u002Fde\u002Fclient\u002Fzoom-and-freelook","de\u002F3.client\u002F05.zoom-and-freelook","i-lucide-zoom-in",{"title":142,"path":143,"stem":144,"icon":145},"Minimap, Wegpunkte und Weltkarte","\u002Fde\u002Fclient\u002Fminimap-and-world-map","de\u002F3.client\u002F06.minimap-and-world-map","i-lucide-map",{"title":147,"path":148,"stem":149,"icon":150},"Redstone-Werkzeuge","\u002Fde\u002Fclient\u002Fredstone-tools","de\u002F3.client\u002F07.redstone-tools","i-lucide-zap",{"title":152,"path":153,"stem":154,"icon":155},"Schaltungs-Bibliothek","\u002Fde\u002Fclient\u002Fcircuit-library","de\u002F3.client\u002F08.circuit-library","i-lucide-cpu",{"title":157,"path":158,"stem":159,"icon":94},"Emotes, Umhänge, Garderobe und Konten","\u002Fde\u002Fclient\u002Femotes-and-capes","de\u002F3.client\u002F09.emotes-and-capes",{"title":161,"path":162,"stem":163,"icon":164},"Screenshots, Clips und Panoramen","\u002Fde\u002Fclient\u002Fscreenshots-and-clips","de\u002F3.client\u002F10.screenshots-and-clips","i-lucide-camera",{"title":166,"path":167,"stem":168,"icon":169},"Welt-Notizen","\u002Fde\u002Fclient\u002Fnotes","de\u002F3.client\u002F11.notes","i-lucide-notebook-pen",{"title":171,"path":172,"stem":173,"icon":174},"Chat und Komfort","\u002Fde\u002Fclient\u002Fchat-and-comfort","de\u002F3.client\u002F12.chat-and-comfort","i-lucide-message-square",{"title":176,"path":177,"stem":178,"icon":179},"Sozial im Spiel","\u002Fde\u002Fclient\u002Fsocial-in-game","de\u002F3.client\u002F13.social-in-game","i-lucide-users",{"title":181,"path":182,"stem":183,"icon":184},"Standard-Tasten","\u002Fde\u002Fclient\u002Fkeybinds","de\u002F3.client\u002F14.keybinds","i-lucide-keyboard",{"title":186,"path":187,"stem":188,"icon":189},"Welt für Freunde hosten","\u002Fde\u002Fclient\u002Fworld-hosting","de\u002F3.client\u002F15.world-hosting","i-lucide-globe",{"title":191,"icon":192,"path":193,"stem":194,"children":195,"page":-1},"Hilfe","i-lucide-life-buoy","\u002Fde\u002Fhelp","de\u002F4.help\u002Findex",[196,197,202,207,212,217,222,227],{"title":11,"path":193,"stem":194,"icon":12},{"title":198,"path":199,"stem":200,"icon":201},"Absturz-Helfer","\u002Fde\u002Fhelp\u002Fcrash-helper","de\u002F4.help\u002F01.crash-helper","i-lucide-heart-pulse",{"title":203,"path":204,"stem":205,"icon":206},"Häufige Probleme","\u002Fde\u002Fhelp\u002Fcommon-problems","de\u002F4.help\u002F02.common-problems","i-lucide-circle-help",{"title":208,"path":209,"stem":210,"icon":211},"Java & Arbeitsspeicher","\u002Fde\u002Fhelp\u002Fjava","de\u002F4.help\u002F03.java","i-lucide-coffee",{"title":213,"path":214,"stem":215,"icon":216},"Linux","\u002Fde\u002Fhelp\u002Flinux","de\u002F4.help\u002F04.linux","i-lucide-terminal",{"title":218,"path":219,"stem":220,"icon":221},"Logs","\u002Fde\u002Fhelp\u002Flogs","de\u002F4.help\u002F05.logs","i-lucide-scroll-text",{"title":223,"path":224,"stem":225,"icon":226},"Bug melden","\u002Fde\u002Fhelp\u002Freport-a-bug","de\u002F4.help\u002F06.report-a-bug","i-lucide-bug",{"title":228,"path":229,"stem":230,"icon":231},"Datenschutz","\u002Fde\u002Fhelp\u002Fprivacy","de\u002F4.help\u002F07.privacy","i-lucide-shield-check",{"title":233,"icon":234,"path":235,"stem":236,"children":237,"page":-1},"Entwickler","i-lucide-code-xml","\u002Fde\u002Fdevelopers","de\u002F5.developers\u002Findex",[238,239,244,249,254,259,263,267],{"title":11,"path":235,"stem":236,"icon":12},{"title":240,"path":241,"stem":242,"icon":243},"Aus dem Quellcode bauen","\u002Fde\u002Fdevelopers\u002Fbuild-from-source","de\u002F5.developers\u002F01.build-from-source","i-lucide-hammer",{"title":245,"path":246,"stem":247,"icon":248},"Mitmachen","\u002Fde\u002Fdevelopers\u002Fcontributing","de\u002F5.developers\u002F02.contributing","i-lucide-git-pull-request",{"title":250,"path":251,"stem":252,"icon":253},"Übersetzen","\u002Fde\u002Fdevelopers\u002Ftranslating","de\u002F5.developers\u002F03.translating","i-lucide-languages",{"title":255,"path":256,"stem":257,"icon":258},"Öffentliche API","\u002Fde\u002Fdevelopers\u002Fpublic-api","de\u002F5.developers\u002F04.public-api","i-lucide-braces",{"title":260,"path":261,"stem":262,"icon":32},"Android-App selbst bauen","\u002Fde\u002Fdevelopers\u002Fbuild-android","de\u002F5.developers\u002F05.build-android",{"title":264,"path":265,"stem":266,"icon":37},"iOS-App selbst bauen mit Xcode","\u002Fde\u002Fdevelopers\u002Fbuild-ios","de\u002F5.developers\u002F06.build-ios",{"title":268,"path":269,"stem":270,"icon":271},"TRS Server Rules","\u002Fde\u002Fdevelopers\u002Fserver-rules","de\u002F5.developers\u002F07.server-rules","i-lucide-server-cog",{"id":273,"title":260,"body":274,"description":1917,"extension":1918,"links":1919,"meta":1920,"navigation":1921,"path":261,"seo":1922,"stem":262,"__hash__":1923},"docs_de\u002Fde\u002F5.developers\u002F05.build-android.md",{"type":275,"value":276,"toc":1884},"minimark",[277,285,297,325,330,404,408,523,545,563,567,1002,1013,1017,1041,1052,1056,1077,1092,1316,1342,1346,1353,1441,1484,1487,1519,1525,1529,1535,1603,1610,1686,1689,1693,1720,1724,1753,1757,1773,1777,1783,1787,1793,1797,1803,1807,1816,1820,1830,1834,1837,1841,1862,1865,1869,1880],[278,279,280,281,284],"p",{},"Die Android-App ist dasselbe Tauri-2-Projekt wie der Launcher auf dem PC, nur für Android gebaut. Diese Seite ist für\nalle, die mitentwickeln, und für Spieler, die ihre eigene APK bauen und installieren möchten. Wenn du nur spielen\nwillst, nimm die signierte APK von unserer Website – siehe ",[282,283,29],"a",{"href":30},".",[278,286,287,288,292,293,296],{},"Was du bekommst: die komplette App – Anmeldung, Instanzen, Modpacks, Sozial, Garderobe und ",[289,290,291],"strong",{},"Minecraft: Java Edition","\nüber die eingebaute Spiel-Engine mit Touch-Steuerung. Was du nicht bekommst: automatische Updates. Die App fragt zwar\nunseren offiziellen Update-Kanal ab, aber Android installiert ein Update nur mit gleichem Paketnamen ",[289,294,295],{},"und"," gleichem\nSignierschlüssel – dein Build hat einen anderen Schlüssel, also aktualisierst du ihn, indem du neu baust.",[298,299,300,301,305,306,309,310,313,314,317,318,320,321,324],"note",{},"Die Befehle hier sind die, die das CI nutzt (",[302,303,304],"code",{},".github\u002Fworkflows\u002Fci.yml"," und ",[302,307,308],{},"release.yml",", Jobs ",[289,311,312],{},"Android","), plus die\nHinweise für lokale Builds aus ",[302,315,316],{},"docs\u002Fmobile.md"," im Repository. Das CI baut unter ",[289,319,213],{},", lokale Builds sind für\n",[289,322,323],{},"Windows"," beschrieben. Unter macOS ist der Android-Build nicht getestet.",[326,327,329],"h2",{"id":328},"was-wo-liegt","Was wo liegt",[331,332,333,346],"table",{},[334,335,336],"thead",{},[337,338,339,343],"tr",{},[340,341,342],"th",{},"Pfad",[340,344,345],{},"Was es ist",[347,348,349,360,370,380,394],"tbody",{},[337,350,351,357],{},[352,353,354],"td",{},[302,355,356],{},"src-tauri\u002Fgen\u002Fandroid\u002F",[352,358,359],{},"Das Gradle-Projekt der App (eingecheckt, minSdk 26 = Android 8.0)",[337,361,362,367],{},[352,363,364],{},[302,365,366],{},"src-tauri\u002Fgen\u002Fandroid\u002Fapp\u002Fbuild.gradle.kts",[352,368,369],{},"App-ID, SDK-Stufen, Release-Signatur",[337,371,372,377],{},[352,373,374],{},[302,375,376],{},"src-tauri\u002Ftauri.android.conf.json",[352,378,379],{},"Android-Abweichungen der Tauri-Konfiguration (kein Desktop-Updater, keine mitgelieferten TRS-Client-Jars)",[337,381,382,387],{},[352,383,384],{},[302,385,386],{},"src-tauri\u002Fplugins\u002Ftauri-plugin-trs-game\u002Fandroid\u002F",[352,388,389,390,393],{},"Die Spiel-Engine (Teile von Amethyst\u002FPojavLauncher, ",[302,391,392],{},"ndk-build",") und das Touch-Overlay",[337,395,396,401],{},[352,397,398],{},[302,399,400],{},"src-tauri\u002Fplugins\u002Ftauri-plugin-trs-game\u002Fandroid\u002Fprebuilt.lock",[352,402,403],{},"Fertige Engine-Teile, die Gradle lädt und per SHA-256 prüft",[326,405,407],{"id":406},"voraussetzungen","Voraussetzungen",[331,409,410,420],{},[334,411,412],{},[337,413,414,417],{},[340,415,416],{},"Werkzeug",[340,418,419],{},"Version (wie im CI)",[347,421,422,441,464,475,489,511],{},[337,423,424,427],{},[352,425,426],{},"Node.js und pnpm",[352,428,429,432,433,436,437,440],{},[289,430,431],{},"Node 22",", pnpm in der Version aus ",[302,434,435],{},"package.json"," (",[302,438,439],{},"corepack enable",")",[337,442,443,446],{},[352,444,445],{},"Rust",[352,447,448,449,455,456,459,460,463],{},"stable über ",[282,450,454],{"href":451,"rel":452},"https:\u002F\u002Frustup.rs",[453],"nofollow","rustup",", Targets ",[302,457,458],{},"aarch64-linux-android"," (Handys) und ",[302,461,462],{},"x86_64-linux-android"," (Emulator)",[337,465,466,469],{},[352,467,468],{},"JDK",[352,470,471,474],{},[289,472,473],{},"21"," (CI: Temurin; das JBR aus Android Studio geht auch)",[337,476,477,480],{},[352,478,479],{},"Android-SDK",[352,481,482,483,305,486],{},"mit ",[302,484,485],{},"cmdline-tools",[302,487,488],{},"platform-tools",[337,490,491,494],{},[352,492,493],{},"Android-NDK",[352,495,496,499,500,503,504,506,507,510],{},[289,497,498],{},"28.2.13676358"," für die App (",[302,501,502],{},"NDK_HOME",") ",[289,505,295],{}," ",[289,508,509],{},"27.3.13750724"," (r27d) für die Spiel-Engine",[337,512,513,516],{},[352,514,515],{},"Gradle",[352,517,518,519,522],{},"nichts zu installieren – der Wrapper in ",[302,520,521],{},"src-tauri\u002Fgen\u002Fandroid"," nimmt Gradle 8.14.3",[278,524,525,526,529,530,533,534,537,538,540,541,544],{},"Die App wird gegen Android-SDK ",[289,527,528],{},"36"," gebaut (",[302,531,532],{},"compileSdk","\u002F",[302,535,536],{},"targetSdk","). Im CI werden nur ",[302,539,488],{}," und die beiden\nNDKs von Hand installiert, den Rest holt das Android-Gradle-Plugin. Nimm die SDK-Lizenzen einmal mit\n",[302,542,543],{},"sdkmanager --licenses"," an.",[546,547,548,549,552,553,506,556,559,560,562],"warning",{},"Du brauchst ",[289,550,551],{},"beide NDKs",". Das Spiel-Plugin legt in seiner eigenen ",[302,554,555],{},"build.gradle.kts",[302,557,558],{},"ndkVersion = \"27.3.13750724\"","\nfest; der Rust-Teil wird mit dem NDK aus ",[302,561,502],{}," (28.2) gelinkt.",[326,564,566],{"id":565},"debug-apk-bauen","Debug-APK bauen",[568,569,571,576,620,624,677,688,692,695,809,820,824,854,869,873,880,966,970,977,996],"steps",{"level":570},"3",[572,573,575],"h3",{"id":574},"code-holen","Code holen",[577,578,583],"pre",{"className":579,"code":580,"language":581,"meta":582,"style":582},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","git clone https:\u002F\u002Fgithub.com\u002Ftheredstonee\u002FTRS-Launcher.git\ncd TRS-Launcher\npnpm install\n","bash","",[302,584,585,601,611],{"__ignoreMap":582},[586,587,590,594,598],"span",{"class":588,"line":589},"line",1,[586,591,593],{"class":592},"sBMFI","git",[586,595,597],{"class":596},"sfazB"," clone",[586,599,600],{"class":596}," https:\u002F\u002Fgithub.com\u002Ftheredstonee\u002FTRS-Launcher.git\n",[586,602,604,608],{"class":588,"line":603},2,[586,605,607],{"class":606},"s2Zo4","cd",[586,609,610],{"class":596}," TRS-Launcher\n",[586,612,614,617],{"class":588,"line":613},3,[586,615,616],{"class":592},"pnpm",[586,618,619],{"class":596}," install\n",[572,621,623],{"id":622},"sdk-teile-und-rust-targets-installieren","SDK-Teile und Rust-Targets installieren",[577,625,627],{"className":579,"code":626,"language":581,"meta":582,"style":582},"sdkmanager --install \"platform-tools\" \"ndk;28.2.13676358\" \"ndk;27.3.13750724\"\nrustup target add aarch64-linux-android x86_64-linux-android\n",[302,628,629,661],{"__ignoreMap":582},[586,630,631,634,637,641,643,646,648,651,653,655,658],{"class":588,"line":589},[586,632,633],{"class":592},"sdkmanager",[586,635,636],{"class":596}," --install",[586,638,640],{"class":639},"sMK4o"," \"",[586,642,488],{"class":596},[586,644,645],{"class":639},"\"",[586,647,640],{"class":639},[586,649,650],{"class":596},"ndk;28.2.13676358",[586,652,645],{"class":639},[586,654,640],{"class":639},[586,656,657],{"class":596},"ndk;27.3.13750724",[586,659,660],{"class":639},"\"\n",[586,662,663,665,668,671,674],{"class":588,"line":603},[586,664,454],{"class":592},[586,666,667],{"class":596}," target",[586,669,670],{"class":596}," add",[586,672,673],{"class":596}," aarch64-linux-android",[586,675,676],{"class":596}," x86_64-linux-android\n",[278,678,679,680,683,684,687],{},"Die beiden NDK-Versionen kannst du auch in Android Studio installieren (",[289,681,682],{},"SDK Manager → SDK Tools → NDK (Side by\nside)",", Haken bei ",[289,685,686],{},"Show Package Details",").",[572,689,691],{"id":690},"umgebung-setzen","Umgebung setzen",[278,693,694],{},"Unter Windows (PowerShell) oder Linux:",[696,697,698,747],"code-group",{},[577,699,703],{"className":700,"code":701,"filename":323,"language":702,"meta":582,"style":582},"language-shell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","$env:ANDROID_HOME = \"$env:LOCALAPPDATA\\Android\\Sdk\"\n$env:NDK_HOME     = \"$env:ANDROID_HOME\\ndk\\28.2.13676358\"\n$env:JAVA_HOME    = \"C:\\Program Files\\Android\\Android Studio\\jbr\"\n","shell",[302,704,705,721,735],{"__ignoreMap":582},[586,706,707,711,713,716,719],{"class":588,"line":589},[586,708,710],{"class":709},"sTEyZ","$env:ANDROID_HOME = ",[586,712,645],{"class":639},[586,714,715],{"class":709},"$env",[586,717,718],{"class":596},":LOCALAPPDATA\\Android\\Sdk",[586,720,660],{"class":639},[586,722,723,726,728,730,733],{"class":588,"line":603},[586,724,725],{"class":709},"$env:NDK_HOME     = ",[586,727,645],{"class":639},[586,729,715],{"class":709},[586,731,732],{"class":596},":ANDROID_HOME\\ndk\\28.2.13676358",[586,734,660],{"class":639},[586,736,737,740,742,745],{"class":588,"line":613},[586,738,739],{"class":709},"$env:JAVA_HOME    = ",[586,741,645],{"class":639},[586,743,744],{"class":596},"C:\\Program Files\\Android\\Android Studio\\jbr",[586,746,660],{"class":639},[577,748,750],{"className":579,"code":749,"filename":213,"language":581,"meta":582,"style":582},"export ANDROID_HOME=\"$HOME\u002FAndroid\u002FSdk\"          # dort, wo dein SDK liegt\nexport NDK_HOME=\"$ANDROID_HOME\u002Fndk\u002F28.2.13676358\"\nexport JAVA_HOME=\u002Fpfad\u002Fzum\u002Fjdk-21\n",[302,751,752,778,797],{"__ignoreMap":582},[586,753,754,758,761,764,766,769,772,774],{"class":588,"line":589},[586,755,757],{"class":756},"spNyl","export",[586,759,760],{"class":709}," ANDROID_HOME",[586,762,763],{"class":639},"=",[586,765,645],{"class":639},[586,767,768],{"class":709},"$HOME",[586,770,771],{"class":596},"\u002FAndroid\u002FSdk",[586,773,645],{"class":639},[586,775,777],{"class":776},"sHwdD","          # dort, wo dein SDK liegt\n",[586,779,780,782,785,787,789,792,795],{"class":588,"line":603},[586,781,757],{"class":756},[586,783,784],{"class":709}," NDK_HOME",[586,786,763],{"class":639},[586,788,645],{"class":639},[586,790,791],{"class":709},"$ANDROID_HOME",[586,793,794],{"class":596},"\u002Fndk\u002F28.2.13676358",[586,796,660],{"class":639},[586,798,799,801,804,806],{"class":588,"line":613},[586,800,757],{"class":756},[586,802,803],{"class":709}," JAVA_HOME",[586,805,763],{"class":639},[586,807,808],{"class":709},"\u002Fpfad\u002Fzum\u002Fjdk-21\n",[278,810,811,812,815,816,284],{},"Unter Windows schaltest du vorher den ",[289,813,814],{},"Entwicklermodus"," ein – siehe ",[282,817,819],{"href":818},"#a-required-privilege-is-not-held-by-the-client","Probleme",[572,821,823],{"id":822},"bauen","Bauen",[577,825,827],{"className":579,"code":826,"language":581,"meta":582,"style":582},"pnpm tauri android build --apk --debug --target aarch64\n",[302,828,829],{"__ignoreMap":582},[586,830,831,833,836,839,842,845,848,851],{"class":588,"line":589},[586,832,616],{"class":592},[586,834,835],{"class":596}," tauri",[586,837,838],{"class":596}," android",[586,840,841],{"class":596}," build",[586,843,844],{"class":596}," --apk",[586,846,847],{"class":596}," --debug",[586,849,850],{"class":596}," --target",[586,852,853],{"class":596}," aarch64\n",[278,855,856,857,860,861,864,865,868],{},"Das baut die Oberfläche (",[302,858,859],{},"pnpm generate","), die Rust-Bibliothek für arm64 und dann mit Gradle die APK. Der erste\nGradle-Lauf lädt die fertigen Engine-Teile aus ",[302,862,863],{},"prebuilt.lock"," (per SHA-256 geprüft, zwischengespeichert in\n",[302,866,867],{},"~\u002F.gradle\u002Fcaches\u002Ftrs-engine-prebuilt",") – er braucht also Internet und dauert eine Weile.",[572,870,872],{"id":871},"apk-finden","APK finden",[278,874,875,876,879],{},"Die APKs landen unter ",[302,877,878],{},"src-tauri\u002Fgen\u002Fandroid\u002Fapp\u002Fbuild\u002Foutputs\u002Fapk\u002F",", in einem Ordner je ABI und Build-Art. Das CI\nverlässt sich nicht auf den genauen Ordnernamen – du musst es auch nicht:",[696,881,882,907],{},[577,883,885],{"className":579,"code":884,"filename":213,"language":581,"meta":582,"style":582},"find src-tauri\u002Fgen\u002Fandroid\u002Fapp\u002Fbuild\u002Foutputs\u002Fapk -name '*.apk'\n",[302,886,887],{"__ignoreMap":582},[586,888,889,892,895,898,901,904],{"class":588,"line":589},[586,890,891],{"class":592},"find",[586,893,894],{"class":596}," src-tauri\u002Fgen\u002Fandroid\u002Fapp\u002Fbuild\u002Foutputs\u002Fapk",[586,896,897],{"class":596}," -name",[586,899,900],{"class":639}," '",[586,902,903],{"class":596},"*.apk",[586,905,906],{"class":639},"'\n",[577,908,910],{"className":700,"code":909,"filename":323,"language":702,"meta":582,"style":582},"Get-ChildItem -Recurse -Filter *.apk src-tauri\\gen\\android\\app\\build\\outputs\\apk\n",[302,911,912],{"__ignoreMap":582},[586,913,914,917,920,923,926,929,932,935,938,941,944,946,949,952,955,958,961,963],{"class":588,"line":589},[586,915,916],{"class":592},"Get-ChildItem",[586,918,919],{"class":596}," -Recurse",[586,921,922],{"class":596}," -Filter",[586,924,925],{"class":709}," *",[586,927,928],{"class":596},".apk",[586,930,931],{"class":596}," src-tauri",[586,933,934],{"class":709},"\\g",[586,936,937],{"class":596},"en",[586,939,940],{"class":709},"\\a",[586,942,943],{"class":596},"ndroid",[586,945,940],{"class":709},[586,947,948],{"class":596},"pp",[586,950,951],{"class":709},"\\b",[586,953,954],{"class":596},"uild",[586,956,957],{"class":709},"\\o",[586,959,960],{"class":596},"utputs",[586,962,940],{"class":709},[586,964,965],{"class":596},"pk\n",[572,967,969],{"id":968},"aufs-handy-bringen","Aufs Handy bringen",[278,971,972,973,976],{},"Schalte in den Entwickleroptionen deines Handys ",[289,974,975],{},"USB-Debugging"," ein, schließ es an und starte:",[577,978,980],{"className":579,"code":979,"language":581,"meta":582,"style":582},"adb install -r pfad\u002Fzur.apk\n",[302,981,982],{"__ignoreMap":582},[586,983,984,987,990,993],{"class":588,"line":589},[586,985,986],{"class":592},"adb",[586,988,989],{"class":596}," install",[586,991,992],{"class":596}," -r",[586,994,995],{"class":596}," pfad\u002Fzur.apk\n",[278,997,998,999,1001],{},"Oder kopier die APK aufs Handy und öffne sie dort, wie unter ",[282,1000,29],{"href":30},"\nbeschrieben. Eine Debug-APK ist mit dem Debug-Schlüssel deines Android-SDK signiert und lässt sich sofort installieren.",[546,1003,1004,1005,1008,1009,687],{},"Ein Debug-Build und unsere offizielle App haben den ",[289,1006,1007],{},"gleichen Paketnamen, aber verschiedene Schlüssel",". Android\ninstalliert die eine nicht über die andere („App nicht installiert“ \u002F „Konflikt mit vorhandenem Paket“). Deinstalliere\nvorher die andere – damit sind auch ihre Instanzen und Welten weg – oder gib deinem Build eine eigene App-ID (siehe\n",[282,1010,1012],{"href":1011},"#zu-deiner-eigenen-app-machen","unten",[572,1014,1016],{"id":1015},"für-den-emulator","Für den Emulator",[577,1018,1020],{"className":579,"code":1019,"language":581,"meta":582,"style":582},"pnpm tauri android build --apk --debug --target x86_64\n",[302,1021,1022],{"__ignoreMap":582},[586,1023,1024,1026,1028,1030,1032,1034,1036,1038],{"class":588,"line":589},[586,1025,616],{"class":592},[586,1027,835],{"class":596},[586,1029,838],{"class":596},[586,1031,841],{"class":596},[586,1033,844],{"class":596},[586,1035,847],{"class":596},[586,1037,850],{"class":596},[586,1039,1040],{"class":596}," x86_64\n",[278,1042,1043,1044,1047,1048,1051],{},"Starte den Emulator mit ",[302,1045,1046],{},"-gpu host"," – mit SwiftShader stürzt der Renderer bei seiner Vulkan-Prüfung ab. Minecraft\n",[289,1049,1050],{},"26.x"," ist im Emulator nicht spielbar (seinem Vulkan fehlen nötige Erweiterungen, und OpenGL hängt dort); teste diese\nVersionen auf einem echten Handy.",[326,1053,1055],{"id":1054},"release-apk-bauen","Release-APK bauen",[577,1057,1059],{"className":579,"code":1058,"language":581,"meta":582,"style":582},"pnpm tauri android build --apk --target aarch64\n",[302,1060,1061],{"__ignoreMap":582},[586,1062,1063,1065,1067,1069,1071,1073,1075],{"class":588,"line":589},[586,1064,616],{"class":592},[586,1066,835],{"class":596},[586,1068,838],{"class":596},[586,1070,841],{"class":596},[586,1072,844],{"class":596},[586,1074,850],{"class":596},[586,1076,853],{"class":596},[278,1078,1079,1080,1083,1084,1087,1088,1091],{},"Das ist der Release-Befehl des CI ohne ",[302,1081,1082],{},"--ci",". Release-Builds werden mit R8 verkleinert. Ohne Signierschlüssel kommt\neine ",[289,1085,1086],{},"unsignierte"," APK heraus (",[302,1089,1090],{},"…-unsigned.apk",") – die kann Android nicht installieren. Signiere sie mit deinem\neigenen Schlüssel:",[568,1093,1094,1098,1150,1155,1159,1173,1238,1244,1248,1301],{"level":570},[572,1095,1097],{"id":1096},"einmal-einen-keystore-anlegen","Einmal einen Keystore anlegen",[577,1099,1101],{"className":579,"code":1100,"language":581,"meta":582,"style":582},"keytool -genkeypair -v -keystore my-release.jks -alias my-key \\\n  -keyalg RSA -keysize 4096 -validity 10000\n",[302,1102,1103,1129],{"__ignoreMap":582},[586,1104,1105,1108,1111,1114,1117,1120,1123,1126],{"class":588,"line":589},[586,1106,1107],{"class":592},"keytool",[586,1109,1110],{"class":596}," -genkeypair",[586,1112,1113],{"class":596}," -v",[586,1115,1116],{"class":596}," -keystore",[586,1118,1119],{"class":596}," my-release.jks",[586,1121,1122],{"class":596}," -alias",[586,1124,1125],{"class":596}," my-key",[586,1127,1128],{"class":709}," \\\n",[586,1130,1131,1134,1137,1140,1144,1147],{"class":588,"line":603},[586,1132,1133],{"class":596},"  -keyalg",[586,1135,1136],{"class":596}," RSA",[586,1138,1139],{"class":596}," -keysize",[586,1141,1143],{"class":1142},"sbssI"," 4096",[586,1145,1146],{"class":596}," -validity",[586,1148,1149],{"class":1142}," 10000\n",[278,1151,1152,1154],{},[302,1153,1107],{}," gehört zum JDK. Heb Datei und Passwörter gut auf: Android installiert Updates einer App nur, wenn sie mit\ndemselben Schlüssel signiert sind.",[572,1156,1158],{"id":1157},"die-vier-variablen-setzen","Die vier Variablen setzen",[278,1160,1161,1162,1165,1166,1168,1169,1172],{},"Gradle signiert die Release-APK selbst (",[302,1163,1164],{},"signingConfigs"," in ",[302,1167,366],{},"), sobald\n",[302,1170,1171],{},"ANDROID_KEYSTORE_PATH"," auf eine vorhandene Datei zeigt:",[577,1174,1176],{"className":579,"code":1175,"language":581,"meta":582,"style":582},"export ANDROID_KEYSTORE_PATH=\u002Fpfad\u002Fzu\u002Fmy-release.jks\nexport ANDROID_KEYSTORE_PASSWORD='…'\nexport ANDROID_KEY_ALIAS=my-key\nexport ANDROID_KEY_PASSWORD='…'      # wie das Keystore-Passwort, wenn du kein anderes gewählt hast\n",[302,1177,1178,1190,1207,1219],{"__ignoreMap":582},[586,1179,1180,1182,1185,1187],{"class":588,"line":589},[586,1181,757],{"class":756},[586,1183,1184],{"class":709}," ANDROID_KEYSTORE_PATH",[586,1186,763],{"class":639},[586,1188,1189],{"class":709},"\u002Fpfad\u002Fzu\u002Fmy-release.jks\n",[586,1191,1192,1194,1197,1199,1202,1205],{"class":588,"line":603},[586,1193,757],{"class":756},[586,1195,1196],{"class":709}," ANDROID_KEYSTORE_PASSWORD",[586,1198,763],{"class":639},[586,1200,1201],{"class":639},"'",[586,1203,1204],{"class":596},"…",[586,1206,906],{"class":639},[586,1208,1209,1211,1214,1216],{"class":588,"line":613},[586,1210,757],{"class":756},[586,1212,1213],{"class":709}," ANDROID_KEY_ALIAS",[586,1215,763],{"class":639},[586,1217,1218],{"class":709},"my-key\n",[586,1220,1222,1224,1227,1229,1231,1233,1235],{"class":588,"line":1221},4,[586,1223,757],{"class":756},[586,1225,1226],{"class":709}," ANDROID_KEY_PASSWORD",[586,1228,763],{"class":639},[586,1230,1201],{"class":639},[586,1232,1204],{"class":596},[586,1234,1201],{"class":639},[586,1236,1237],{"class":776},"      # wie das Keystore-Passwort, wenn du kein anderes gewählt hast\n",[278,1239,1240,1241,284],{},"Unter Windows setzt du sie wie oben mit ",[302,1242,1243],{},"$env:NAME = \"…\"",[572,1245,1247],{"id":1246},"bauen-und-prüfen","Bauen und prüfen",[577,1249,1251],{"className":579,"code":1250,"language":581,"meta":582,"style":582},"pnpm tauri android build --apk --target aarch64\n\"$ANDROID_HOME\"\u002Fbuild-tools\u002F\u003Cversion>\u002Fapksigner verify --print-certs \u003Cdie.apk>\n",[302,1252,1253,1269],{"__ignoreMap":582},[586,1254,1255,1257,1259,1261,1263,1265,1267],{"class":588,"line":589},[586,1256,616],{"class":592},[586,1258,835],{"class":596},[586,1260,838],{"class":596},[586,1262,841],{"class":596},[586,1264,844],{"class":596},[586,1266,850],{"class":596},[586,1268,853],{"class":596},[586,1270,1271,1273,1275,1277,1280,1283,1286,1289,1292,1295,1298],{"class":588,"line":603},[586,1272,645],{"class":592},[586,1274,791],{"class":709},[586,1276,645],{"class":592},[586,1278,1279],{"class":592},"\u002Fbuild-tools\u002F",[586,1281,1282],{"class":709},"\u003Cversion>\u002Fapksigner ",[586,1284,1285],{"class":596},"verify",[586,1287,1288],{"class":596}," --print-certs",[586,1290,1291],{"class":639}," \u003C",[586,1293,1294],{"class":596},"die.ap",[586,1296,1297],{"class":709},"k",[586,1299,1300],{"class":639},">\n",[278,1302,1303,1306,1307,1310,1311,1315],{},[302,1304,1305],{},"apksigner"," zeigt den SHA-256 ",[289,1308,1309],{},"deines"," Zertifikats – nicht den auf der\n",[282,1312,1314],{"href":1313},"\u002Fde\u002Fgetting-started\u002Fandroid#installieren","Installationsseite",", der gehört zu unserem offiziellen Schlüssel.",[298,1317,1318,1319,1322,1323,1326,1327,1330,1331,1334,1335,436,1338,1341],{},"Geheimnisse des Projekts brauchst du keine. Der Schlüssel des Desktop-Updaters (",[302,1320,1321],{},"TAURI_SIGNING_PRIVATE_KEY",") signiert\nim Release-Workflow nur die Dateien des Update-Kanals, und Android-Builds erzeugen ohnehin keine Updater-Dateien\n(",[302,1324,1325],{},"tauri.android.conf.json","). Der ",[289,1328,1329],{},"CurseForge","-Schlüssel ist wie auf dem PC freiwillig: Umgebungsvariable\n",[302,1332,1333],{},"CURSEFORGE_API_KEY"," oder die Datei ",[302,1336,1337],{},"~\u002F.tauri\u002Fcurseforge-api-key",[302,1339,1340],{},"%USERPROFILE%\\.tauri\\curseforge-api-key"," unter\nWindows). Ohne ihn klappt der Build, CurseForge ist dann einfach ausgeblendet.",[326,1343,1345],{"id":1344},"zu-deiner-eigenen-app-machen","Zu deiner eigenen App machen",[278,1347,1348,1349,1352],{},"Wenn du deinen Build ",[289,1350,1351],{},"neben"," der offiziellen App installieren oder mit Freunden teilen willst, gib ihm eine eigene\nApp-ID und einen eigenen Namen:",[331,1354,1355,1368],{},[334,1356,1357],{},[337,1358,1359,1362,1365],{},[340,1360,1361],{},"Was",[340,1363,1364],{},"Wo",[340,1366,1367],{},"Ändern",[347,1369,1370,1388,1406,1426],{},[337,1371,1372,1375,1379],{},[352,1373,1374],{},"App-ID (Paketname)",[352,1376,1377],{},[302,1378,366],{},[352,1380,1381,1384,1385],{},[302,1382,1383],{},"applicationId = \"dev.theredstonee.trslauncher\""," → zum Beispiel ",[302,1386,1387],{},"\"io.github.deinname.trslauncher\"",[337,1389,1390,1393,1398],{},[352,1391,1392],{},"Name auf dem Startbildschirm",[352,1394,1395],{},[302,1396,1397],{},"src-tauri\u002Fgen\u002Fandroid\u002Fapp\u002Fsrc\u002Fmain\u002Fres\u002Fvalues\u002Fstrings.xml",[352,1399,1400,305,1403],{},[302,1401,1402],{},"app_name",[302,1404,1405],{},"main_activity_title",[337,1407,1408,1411,1416],{},[352,1409,1410],{},"Symbol",[352,1412,1413],{},[302,1414,1415],{},"src-tauri\u002Fgen\u002Fandroid\u002Fapp\u002Fsrc\u002Fmain\u002Fres\u002Fmipmap-*\u002F",[352,1417,1418,1421,1422,1425],{},[302,1419,1420],{},"ic_launcher*.png"," (die ",[302,1423,1424],{},"ic_launcher_halloween*","-Dateien sind das Event-Symbol)",[337,1427,1428,1431,1434],{},[352,1429,1430],{},"Signierschlüssel",[352,1432,1433],{},"dein eigener Keystore",[352,1435,1436,1437],{},"siehe ",[282,1438,1440],{"href":1439},"#release-apk-bauen","oben",[546,1442,1443,1444,1450,1451,1454,1455,1458,1459,1462,1463,1466,1467,1165,1470,1473,1474,1165,1477,1480,1481,1483],{},"Ändere ",[289,1445,1446,1447],{},"nur ",[302,1448,1449],{},"applicationId"," – nicht ",[302,1452,1453],{},"namespace"," in derselben Datei und nicht ",[302,1456,1457],{},"identifier"," in\n",[302,1460,1461],{},"src-tauri\u002Ftauri.conf.json",". Das Kotlin-Paket ",[302,1464,1465],{},"dev.theredstonee.trslauncher"," steckt fest im Rust-Code\n(",[302,1468,1469],{},"register_android_plugin",[302,1471,1472],{},"src-tauri\u002Fsrc\u002Fmobile.rs",", die JNI-Funktion\n",[302,1475,1476],{},"Java_dev_theredstonee_trslauncher_PushPollWorker_nativePoll",[302,1478,1479],{},"src-tauri\u002Fsrc\u002Fpush.rs","), und die Tauri-CLI bricht den\nBuild mit „you have modified your \"identifier\" in the Tauri configuration“ ab, wenn der Identifier nicht mehr zum\nKotlin-Ordner passt. Engine- und Push-Plugin lesen den Paketnamen zur Laufzeit – für sie ist eine neue ",[302,1482,1449],{},"\nkein Problem.",[278,1485,1486],{},"Was in deinem eigenen Build laut Code weiter funktioniert:",[1488,1489,1490,1497,1503,1513],"ul",{},[1491,1492,1493,1496],"li",{},[289,1494,1495],{},"Microsoft-Anmeldung:"," Die App nutzt die Anmeldung per Gerätecode (du tippst einen Code auf der Microsoft-Seite\nein). Sie hängt nicht am Paketnamen und nicht an einer Weiterleitung in die App.",[1491,1498,1499,1502],{},[289,1500,1501],{},"TRS-Dienste"," (Freunde, Chat, Umhänge, TRS-API): Die App spricht mit derselben API; Paketname oder Signatur werden\nnicht geprüft.",[1491,1504,1505,1508,1509,1512],{},[289,1506,1507],{},"Links"," wie ",[302,1510,1511],{},"trs-launcher:\u002F\u002Fpack\u002F\u003Ccode>"," haben in jedem Build dasselbe Schema. Sind offizielle App und dein Build\nbeide installiert, fragt Android, welche App sie öffnen soll.",[1491,1514,1515,1518],{},[289,1516,1517],{},"Updates:"," siehe oben. Der Installer in der App nimmt nur eine APK mit dem eigenen Paketnamen an – er kann deinen\nBuild also nicht durch die offizielle App ersetzen, und Android lehnt unsere APK über einem Build mit deinem Schlüssel\nab.",[278,1520,1521,1522,284],{},"Einen umbenannten Build haben wir selbst noch nicht getestet – wenn etwas nicht geht, ",[282,1523,1524],{"href":224},"melde es bitte",[326,1526,1528],{"id":1527},"prüfungen-ausführen","Prüfungen ausführen",[278,1530,1531,1532,1534],{},"Dieselben Prüfungen wie im CI-Job ",[289,1533,312],{},":",[577,1536,1538],{"className":579,"code":1537,"language":581,"meta":582,"style":582},"pnpm generate                       # generate_context! braucht die gebaute Oberfläche\ncd src-tauri\ncargo clippy --workspace --target aarch64-linux-android -- -D warnings\ncd gen\u002Fandroid\n.\u002Fgradlew --no-daemon :tauri-plugin-trs-game:testDebugUnitTest   # Touch-Overlay und Engine-Logik, ohne Gerät\n",[302,1539,1540,1550,1557,1581,1588],{"__ignoreMap":582},[586,1541,1542,1544,1547],{"class":588,"line":589},[586,1543,616],{"class":592},[586,1545,1546],{"class":596}," generate",[586,1548,1549],{"class":776},"                       # generate_context! braucht die gebaute Oberfläche\n",[586,1551,1552,1554],{"class":588,"line":603},[586,1553,607],{"class":606},[586,1555,1556],{"class":596}," src-tauri\n",[586,1558,1559,1562,1565,1568,1570,1572,1575,1578],{"class":588,"line":613},[586,1560,1561],{"class":592},"cargo",[586,1563,1564],{"class":596}," clippy",[586,1566,1567],{"class":596}," --workspace",[586,1569,850],{"class":596},[586,1571,673],{"class":596},[586,1573,1574],{"class":596}," --",[586,1576,1577],{"class":596}," -D",[586,1579,1580],{"class":596}," warnings\n",[586,1582,1583,1585],{"class":588,"line":1221},[586,1584,607],{"class":606},[586,1586,1587],{"class":596}," gen\u002Fandroid\n",[586,1589,1591,1594,1597,1600],{"class":588,"line":1590},5,[586,1592,1593],{"class":592},".\u002Fgradlew",[586,1595,1596],{"class":596}," --no-daemon",[586,1598,1599],{"class":596}," :tauri-plugin-trs-game:testDebugUnitTest",[586,1601,1602],{"class":776},"   # Touch-Overlay und Engine-Logik, ohne Gerät\n",[278,1604,1605,1606,1609],{},"Clippy läuft außerhalb von ",[302,1607,1608],{},"tauri android build"," und braucht für die C-Teile (SQLite, ring) den Compiler aus dem NDK.\nDas CI setzt dafür unter Linux:",[577,1611,1613],{"className":579,"code":1612,"language":581,"meta":582,"style":582},"bin=\"$NDK_HOME\u002Ftoolchains\u002Fllvm\u002Fprebuilt\u002Flinux-x86_64\u002Fbin\"\nexport CC_aarch64_linux_android=\"$bin\u002Faarch64-linux-android26-clang\"\nexport AR_aarch64_linux_android=\"$bin\u002Fllvm-ar\"\nexport CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER=\"$bin\u002Faarch64-linux-android26-clang\"\n",[302,1614,1615,1632,1651,1669],{"__ignoreMap":582},[586,1616,1617,1620,1622,1624,1627,1630],{"class":588,"line":589},[586,1618,1619],{"class":709},"bin",[586,1621,763],{"class":639},[586,1623,645],{"class":639},[586,1625,1626],{"class":709},"$NDK_HOME",[586,1628,1629],{"class":596},"\u002Ftoolchains\u002Fllvm\u002Fprebuilt\u002Flinux-x86_64\u002Fbin",[586,1631,660],{"class":639},[586,1633,1634,1636,1639,1641,1643,1646,1649],{"class":588,"line":603},[586,1635,757],{"class":756},[586,1637,1638],{"class":709}," CC_aarch64_linux_android",[586,1640,763],{"class":639},[586,1642,645],{"class":639},[586,1644,1645],{"class":709},"$bin",[586,1647,1648],{"class":596},"\u002Faarch64-linux-android26-clang",[586,1650,660],{"class":639},[586,1652,1653,1655,1658,1660,1662,1664,1667],{"class":588,"line":613},[586,1654,757],{"class":756},[586,1656,1657],{"class":709}," AR_aarch64_linux_android",[586,1659,763],{"class":639},[586,1661,645],{"class":639},[586,1663,1645],{"class":709},[586,1665,1666],{"class":596},"\u002Fllvm-ar",[586,1668,660],{"class":639},[586,1670,1671,1673,1676,1678,1680,1682,1684],{"class":588,"line":1221},[586,1672,757],{"class":756},[586,1674,1675],{"class":709}," CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER",[586,1677,763],{"class":639},[586,1679,645],{"class":639},[586,1681,1645],{"class":709},[586,1683,1648],{"class":596},[586,1685,660],{"class":639},[326,1687,819],{"id":1688},"probleme",[572,1690,1692],{"id":1691},"a-required-privilege-is-not-held-by-the-client","„A required privilege is not held by the client“",[278,1694,1695,1696,1698,1699,1702,1703,1705,1706,1709,1710,1713,1714,1716,1717,284],{},"Unter Windows verlinkt ",[302,1697,1608],{}," die Rust-Bibliothek per symbolischem Link nach\n",[302,1700,1701],{},"gen\u002Fandroid\u002Fapp\u002Fsrc\u002Fmain\u002FjniLibs",". Ohne ",[289,1704,814],{}," (oder Adminrechte) schlägt das fehl. Schalte den\nEntwicklermodus in den Windows-Einstellungen ein oder kopier die Bibliothek selbst\n(",[302,1707,1708],{},"src-tauri\u002Ftarget\u002F\u003Ctriple>\u002Fdebug\u002Flibtrs_launcher_lib.so"," → ",[302,1711,1712],{},"jniLibs\u002F\u003Cabi>\u002F",") und starte den Gradle-Task in\n",[302,1715,521],{},", für den Emulator ",[302,1718,1719],{},"gradlew assembleX86_64Debug",[572,1721,1723],{"id":1722},"ndk-nicht-gefunden-oder-falsche-ndk-version","NDK nicht gefunden oder falsche NDK-Version",[278,1725,1726,1728,1729,1731,1732,1734,1735,1738,1739,1165,1742,1745,1746,1749,1750,1752],{},[302,1727,502],{}," muss auf ",[289,1730,498],{}," zeigen, und ",[289,1733,509],{}," muss zusätzlich im ",[302,1736,1737],{},"ndk\u002F","-Ordner des SDK liegen.\nLiegt dein r27d woanders, setz ",[302,1740,1741],{},"android.ndkPath",[302,1743,1744],{},"src-tauri\u002Fgen\u002Fandroid\u002Flocal.properties"," oder die Variable\n",[302,1747,1748],{},"ANDROID_NDK_HOME"," (siehe Kommentar in der ",[302,1751,555],{}," des Plugins).",[572,1754,1756],{"id":1755},"die-sdk-einrichtung-will-das-paket-tools","Die SDK-Einrichtung will das Paket „tools“",[278,1758,1759,1760,1763,1764,1766,1767,1769,1770,1772],{},"Das alte SDK-Paket ",[302,1761,1762],{},"tools"," gibt es mit aktuellen ",[302,1765,485],{}," nicht mehr. Installiere nur ",[302,1768,485],{},",\n",[302,1771,488],{}," und die beiden NDKs – so macht es auch das CI.",[572,1774,1776],{"id":1775},"die-release-apk-lässt-sich-nicht-installieren","Die Release-APK lässt sich nicht installieren",[278,1778,1779,1780,1782],{},"Sie ist unsigniert (",[302,1781,1090],{},"). Setz die vier Signier-Variablen und bau neu, oder nimm einen Debug-Build.",[572,1784,1786],{"id":1785},"app-nicht-installiert-oder-konflikt-mit-vorhandenem-paket","„App nicht installiert“ oder „Konflikt mit vorhandenem Paket“",[278,1788,1789,1790,284],{},"Es ist schon ein Build der App mit einem anderen Schlüssel installiert – oft unsere offizielle App. Deinstalliere sie\nvorher (damit sind ihre Instanzen weg) oder gib deinem Build eine eigene ",[282,1791,1792],{"href":1011},"App-ID",[572,1794,1796],{"id":1795},"sha-256-stimmt-nicht-beim-laden-der-engine-teile","„SHA-256 stimmt nicht“ beim Laden der Engine-Teile",[278,1798,1799,1800,1802],{},"Ein Download aus ",[302,1801,863],{}," passt nicht zu seiner Prüfsumme (zum Beispiel abgebrochene Verbindung oder ein Proxy).\nDie Datei wird verworfen; starte den Build noch einmal.",[572,1804,1806],{"id":1805},"das-spiel-stürzt-im-emulator-ab-oder-26x-startet-dort-nicht","Das Spiel stürzt im Emulator ab oder 26.x startet dort nicht",[278,1808,1809,1810,1812,1813,687],{},"Nimm ",[302,1811,1046],{}," und teste Minecraft 26.x auf einem echten Handy (siehe ",[282,1814,1016],{"href":1815},"#f%C3%BCr-den-emulator",[572,1817,1819],{"id":1818},"die-app-lässt-sich-auf-einem-älteren-oder-32-bit-handy-nicht-installieren","Die App lässt sich auf einem älteren oder 32-Bit-Handy nicht installieren",[278,1821,1822,1823,305,1826,1829],{},"Die App braucht Android 8.0 und einen 64-Bit-Prozessor: Es werden nur ",[302,1824,1825],{},"arm64-v8a",[302,1827,1828],{},"x86_64"," eingepackt, weil es die\nSpiel-Engine nur für 64 Bit gibt.",[572,1831,1833],{"id":1832},"curseforge-fehlt","CurseForge fehlt",[278,1835,1836],{},"Der Build hatte keinen CurseForge-API-Schlüssel. Bei eigenen Builds ist das normal – siehe den Hinweis zum Schlüssel\noben.",[326,1838,1840],{"id":1839},"lizenz-und-name","Lizenz und Name",[278,1842,1843,1844,436,1847,1850,1851,1854,1855,1858,1859,1861],{},"Der TRS Launcher ist freie Software unter der ",[289,1845,1846],{},"GNU General Public License v3.0",[302,1848,1849],{},"LICENSE",", Urheberrechtshinweise in\n",[302,1852,1853],{},"NOTICE","). Du darfst die App bauen, ändern und weitergeben. Gibst du eine APK weiter, verlangt die GPL, dass das unter\nderselben Lizenz passiert und du den ",[289,1856,1857],{},"vollständigen Quellcode"," genau dieses Builds samt deiner Änderungen zugänglich\nmachst. Die Spiel-Engine enthält Teile anderer Projekte mit eigenen Lizenzen (Amethyst\u002FPojavLauncher unter LGPL-3.0 und\nweitere) – sie stehen in ",[302,1860,1853],{}," und müssen drinbleiben.",[278,1863,1864],{},"Eigene Markenregeln hat das Repository nicht. Trotzdem: Wenn du deinen Build weitergibst, gib ihm einen eigenen Namen\nund eine eigene App-ID, damit ihn niemand für den offiziellen TRS Launcher hält, und verweise auf deinen Quellcode –\nnicht auf unseren Support.",[326,1866,1868],{"id":1867},"weiter-gehts","Weiter geht's",[1870,1871,1872,1877],"card-group",{},[1873,1874,1876],"card",{"icon":37,"title":1875,"to":265},"iOS-App selbst bauen","Dasselbe für iPhone und iPad – braucht einen Mac mit Xcode.",[1873,1878,1879],{"icon":243,"title":240,"to":241},"Der Launcher für den PC, die Prüfungen und die TRS-Client-Mod.",[1881,1882,1883],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":582,"searchDepth":603,"depth":603,"links":1885},[1886,1887,1888,1897,1902,1903,1904,1915,1916],{"id":328,"depth":603,"text":329},{"id":406,"depth":603,"text":407},{"id":565,"depth":603,"text":566,"children":1889},[1890,1891,1892,1893,1894,1895,1896],{"id":574,"depth":613,"text":575},{"id":622,"depth":613,"text":623},{"id":690,"depth":613,"text":691},{"id":822,"depth":613,"text":823},{"id":871,"depth":613,"text":872},{"id":968,"depth":613,"text":969},{"id":1015,"depth":613,"text":1016},{"id":1054,"depth":603,"text":1055,"children":1898},[1899,1900,1901],{"id":1096,"depth":613,"text":1097},{"id":1157,"depth":613,"text":1158},{"id":1246,"depth":613,"text":1247},{"id":1344,"depth":603,"text":1345},{"id":1527,"depth":603,"text":1528},{"id":1688,"depth":603,"text":819,"children":1905},[1906,1907,1908,1909,1910,1911,1912,1913,1914],{"id":1691,"depth":613,"text":1692},{"id":1722,"depth":613,"text":1723},{"id":1755,"depth":613,"text":1756},{"id":1775,"depth":613,"text":1776},{"id":1785,"depth":613,"text":1786},{"id":1795,"depth":613,"text":1796},{"id":1805,"depth":613,"text":1806},{"id":1818,"depth":613,"text":1819},{"id":1832,"depth":613,"text":1833},{"id":1839,"depth":603,"text":1840},{"id":1867,"depth":603,"text":1868},"Die APK des TRS Launchers aus dem Quellcode bauen: Android-SDK und NDK, Rust-Targets, Debug- und Release-Build, eigener Signierschlüssel und eigene App-ID.","md",null,{},{"icon":32},{"title":260,"description":1917},"ETuTnbPGhVFiZeYNZvq070h0Yvwz-Wg8C8yPx_TAeuE",[1925,1927],{"title":255,"path":256,"stem":257,"description":1926,"icon":258,"children":-1},"Endpunkte der TRS-API, die du ohne Konto lesen kannst – Status, Releases, Umhänge, Schaltungen, Modpack-Codes, Blog, Issues, Team und Erfolge.",{"title":264,"path":265,"stem":266,"description":1928,"icon":37,"children":-1},"Die IPA des TRS Launchers für iPhone und iPad auf dem Mac bauen: Xcode-Projekt, Rust-Bibliothek, Spiel-Engine, Sideloading und Start mit eigener Apple-ID.",1792830329704]