[{"data":1,"prerenderedAt":1928},["ShallowReactive",2],{"navigation_docs_es":3,"-es-developers-build-android":272,"-es-developers-build-android-surround":1923},[4,38,110,190,232],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":-1},"Primeros pasos","i-lucide-rocket","\u002Fes\u002Fgetting-started","es\u002F1.getting-started\u002Findex",[10,13,18,23,28,33],{"title":11,"path":7,"stem":8,"icon":12},"Resumen","i-lucide-layout-grid",{"title":14,"path":15,"stem":16,"icon":17},"Instalación","\u002Fes\u002Fgetting-started\u002Finstallation","es\u002F1.getting-started\u002F01.installation","i-lucide-download",{"title":19,"path":20,"stem":21,"icon":22},"Iniciar sesión","\u002Fes\u002Fgetting-started\u002Fsign-in","es\u002F1.getting-started\u002F02.sign-in","i-lucide-log-in",{"title":24,"path":25,"stem":26,"icon":27},"Tu primera instancia","\u002Fes\u002Fgetting-started\u002Ffirst-instance","es\u002F1.getting-started\u002F03.first-instance","i-lucide-play",{"title":29,"path":30,"stem":31,"icon":32},"Android: instalar el APK","\u002Fes\u002Fgetting-started\u002Fandroid","es\u002F1.getting-started\u002F04.android","i-lucide-smartphone",{"title":34,"path":35,"stem":36,"icon":37},"iPhone\u002FiPad: instalar con AltStore\u002FSideStore","\u002Fes\u002Fgetting-started\u002Fiphone-ipad","es\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","\u002Fes\u002Flauncher","es\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},"Instancias","\u002Fes\u002Flauncher\u002Finstances","es\u002F2.launcher\u002F01.instances","i-lucide-boxes",{"title":51,"path":52,"stem":53,"icon":54},"Cargadores de mods","\u002Fes\u002Flauncher\u002Fmod-loaders","es\u002F2.launcher\u002F02.mod-loaders","i-lucide-layers",{"title":56,"path":57,"stem":58,"icon":59},"Mods","\u002Fes\u002Flauncher\u002Fmods","es\u002F2.launcher\u002F03.mods","i-lucide-puzzle",{"title":61,"path":62,"stem":63,"icon":64},"Modpacks","\u002Fes\u002Flauncher\u002Fmodpacks","es\u002F2.launcher\u002F04.modpacks","i-lucide-package",{"title":66,"path":67,"stem":68,"icon":69},"Compartir modpacks","\u002Fes\u002Flauncher\u002Fshare-modpacks","es\u002F2.launcher\u002F05.share-modpacks","i-lucide-share-2",{"title":71,"path":72,"stem":73,"icon":74},"Importar desde otros launchers","\u002Fes\u002Flauncher\u002Fimport","es\u002F2.launcher\u002F06.import","i-lucide-folder-input",{"title":76,"path":77,"stem":78,"icon":79},"Clips y capturas","\u002Fes\u002Flauncher\u002Fclips","es\u002F2.launcher\u002F07.clips","i-lucide-clapperboard",{"title":81,"path":82,"stem":83,"icon":84},"Amigos y chat","\u002Fes\u002Flauncher\u002Fsocial","es\u002F2.launcher\u002F08.social","i-lucide-messages-square",{"title":86,"path":87,"stem":88,"icon":89},"Logros","\u002Fes\u002Flauncher\u002Fachievements","es\u002F2.launcher\u002F09.achievements","i-lucide-trophy",{"title":91,"path":92,"stem":93,"icon":94},"Skins y capas","\u002Fes\u002Flauncher\u002Fwardrobe","es\u002F2.launcher\u002F10.wardrobe","i-lucide-shirt",{"title":96,"path":97,"stem":98,"icon":99},"Ajustes","\u002Fes\u002Flauncher\u002Fsettings","es\u002F2.launcher\u002F11.settings","i-lucide-settings",{"title":101,"path":102,"stem":103,"icon":104},"Actualizaciones","\u002Fes\u002Flauncher\u002Fupdates","es\u002F2.launcher\u002F12.updates","i-lucide-refresh-cw",{"title":106,"path":107,"stem":108,"icon":109},"Servidores","\u002Fes\u002Flauncher\u002Fservers","es\u002F2.launcher\u002F13.servers","i-lucide-server",{"title":111,"icon":112,"path":113,"stem":114,"children":115,"page":-1},"TRS Client","i-lucide-blocks","\u002Fes\u002Fclient","es\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},"¿Qué es TRS Client?","\u002Fes\u002Fclient\u002Foverview","es\u002F3.client\u002F01.overview",{"title":122,"path":123,"stem":124,"icon":125},"Menú TRS y editor HUD","\u002Fes\u002Fclient\u002Fmenu-and-hud-editor","es\u002F3.client\u002F02.menu-and-hud-editor","i-lucide-layout-dashboard",{"title":127,"path":128,"stem":129,"icon":130},"Rendimiento y FPS","\u002Fes\u002Fclient\u002Fperformance","es\u002F3.client\u002F03.performance","i-lucide-gauge",{"title":132,"path":133,"stem":134,"icon":135},"Módulos de PvP","\u002Fes\u002Fclient\u002Fpvp","es\u002F3.client\u002F04.pvp","i-lucide-swords",{"title":137,"path":138,"stem":139,"icon":140},"Zoom, vista libre y correr fijo","\u002Fes\u002Fclient\u002Fzoom-and-freelook","es\u002F3.client\u002F05.zoom-and-freelook","i-lucide-zoom-in",{"title":142,"path":143,"stem":144,"icon":145},"Minimapa, puntos de ruta y mapa del mundo","\u002Fes\u002Fclient\u002Fminimap-and-world-map","es\u002F3.client\u002F06.minimap-and-world-map","i-lucide-map",{"title":147,"path":148,"stem":149,"icon":150},"Herramientas de redstone","\u002Fes\u002Fclient\u002Fredstone-tools","es\u002F3.client\u002F07.redstone-tools","i-lucide-zap",{"title":152,"path":153,"stem":154,"icon":155},"Biblioteca de circuitos","\u002Fes\u002Fclient\u002Fcircuit-library","es\u002F3.client\u002F08.circuit-library","i-lucide-cpu",{"title":157,"path":158,"stem":159,"icon":94},"Emotes, capas, vestuario y cuentas","\u002Fes\u002Fclient\u002Femotes-and-capes","es\u002F3.client\u002F09.emotes-and-capes",{"title":161,"path":162,"stem":163,"icon":164},"Capturas, clips y panorámicas","\u002Fes\u002Fclient\u002Fscreenshots-and-clips","es\u002F3.client\u002F10.screenshots-and-clips","i-lucide-camera",{"title":166,"path":167,"stem":168,"icon":169},"Notas del mundo","\u002Fes\u002Fclient\u002Fnotes","es\u002F3.client\u002F11.notes","i-lucide-notebook-pen",{"title":171,"path":172,"stem":173,"icon":174},"Chat y comodidad","\u002Fes\u002Fclient\u002Fchat-and-comfort","es\u002F3.client\u002F12.chat-and-comfort","i-lucide-message-square",{"title":176,"path":177,"stem":178,"icon":179},"Social en el juego","\u002Fes\u002Fclient\u002Fsocial-in-game","es\u002F3.client\u002F13.social-in-game","i-lucide-users",{"title":181,"path":182,"stem":183,"icon":184},"Teclas predeterminadas","\u002Fes\u002Fclient\u002Fkeybinds","es\u002F3.client\u002F14.keybinds","i-lucide-keyboard",{"title":186,"path":187,"stem":188,"icon":189},"Hospedar un mundo para amigos","\u002Fes\u002Fclient\u002Fworld-hosting","es\u002F3.client\u002F15.world-hosting","i-lucide-globe",{"title":191,"icon":192,"path":193,"stem":194,"children":195,"page":-1},"Ayuda","i-lucide-life-buoy","\u002Fes\u002Fhelp","es\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},"Asistente de errores","\u002Fes\u002Fhelp\u002Fcrash-helper","es\u002F4.help\u002F01.crash-helper","i-lucide-heart-pulse",{"title":203,"path":204,"stem":205,"icon":206},"Problemas frecuentes","\u002Fes\u002Fhelp\u002Fcommon-problems","es\u002F4.help\u002F02.common-problems","i-lucide-circle-help",{"title":208,"path":209,"stem":210,"icon":211},"Java y memoria","\u002Fes\u002Fhelp\u002Fjava","es\u002F4.help\u002F03.java","i-lucide-coffee",{"title":213,"path":214,"stem":215,"icon":216},"Linux","\u002Fes\u002Fhelp\u002Flinux","es\u002F4.help\u002F04.linux","i-lucide-terminal",{"title":218,"path":219,"stem":220,"icon":221},"Registros","\u002Fes\u002Fhelp\u002Flogs","es\u002F4.help\u002F05.logs","i-lucide-scroll-text",{"title":223,"path":224,"stem":225,"icon":226},"Reportar un error","\u002Fes\u002Fhelp\u002Freport-a-bug","es\u002F4.help\u002F06.report-a-bug","i-lucide-bug",{"title":228,"path":229,"stem":230,"icon":231},"Privacidad","\u002Fes\u002Fhelp\u002Fprivacy","es\u002F4.help\u002F07.privacy","i-lucide-shield-check",{"title":233,"icon":234,"path":235,"stem":236,"children":237,"page":-1},"Desarrolladores","i-lucide-code-xml","\u002Fes\u002Fdevelopers","es\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},"Compilar desde el código","\u002Fes\u002Fdevelopers\u002Fbuild-from-source","es\u002F5.developers\u002F01.build-from-source","i-lucide-hammer",{"title":245,"path":246,"stem":247,"icon":248},"Contribuir","\u002Fes\u002Fdevelopers\u002Fcontributing","es\u002F5.developers\u002F02.contributing","i-lucide-git-pull-request",{"title":250,"path":251,"stem":252,"icon":253},"Traducir","\u002Fes\u002Fdevelopers\u002Ftranslating","es\u002F5.developers\u002F03.translating","i-lucide-languages",{"title":255,"path":256,"stem":257,"icon":258},"API pública","\u002Fes\u002Fdevelopers\u002Fpublic-api","es\u002F5.developers\u002F04.public-api","i-lucide-braces",{"title":260,"path":261,"stem":262,"icon":32},"Compila tú mismo la app de Android","\u002Fes\u002Fdevelopers\u002Fbuild-android","es\u002F5.developers\u002F05.build-android",{"title":264,"path":265,"stem":266,"icon":37},"Compila tú mismo la app de iOS con Xcode","\u002Fes\u002Fdevelopers\u002Fbuild-ios","es\u002F5.developers\u002F06.build-ios",{"title":268,"path":269,"stem":270,"icon":271},"TRS Server Rules","\u002Fes\u002Fdevelopers\u002Fserver-rules","es\u002F5.developers\u002F07.server-rules","i-lucide-server-cog",{"id":273,"title":260,"body":274,"description":1916,"extension":1917,"links":1918,"meta":1919,"navigation":1920,"path":261,"seo":1921,"stem":262,"__hash__":1922},"docs_es\u002Fes\u002F5.developers\u002F05.build-android.md",{"type":275,"value":276,"toc":1883},"minimark",[277,285,297,325,330,404,408,523,543,562,566,1001,1012,1016,1040,1051,1055,1076,1090,1314,1341,1345,1352,1440,1483,1486,1518,1524,1528,1534,1602,1609,1685,1688,1692,1719,1723,1752,1756,1772,1776,1782,1786,1792,1796,1802,1806,1815,1819,1829,1833,1836,1840,1861,1864,1868,1879],[278,279,280,281,284],"p",{},"La app de Android es el mismo proyecto de Tauri 2 que el launcher de escritorio, compilado para Android. Esta página es\npara quien colabora en el proyecto y para jugadores que quieren compilar e instalar su propio APK. Si solo quieres\njugar, usa el APK firmado de nuestra web: mira ",[282,283,29],"a",{"href":30},".",[278,286,287,288,292,293,296],{},"Lo que obtienes: la app completa, con inicio de sesión, instancias, modpacks, social, vestuario y ",[289,290,291],"strong",{},"Minecraft: Java\nEdition"," a través del motor de juego integrado con controles táctiles. Lo que no obtienes: actualizaciones automáticas.\nLa app consulta nuestro canal oficial de actualizaciones, pero Android solo instala una actualización con el mismo\nnombre de paquete ",[289,294,295],{},"y"," la misma clave de firma. Tu build tiene otra clave, así que lo actualizas compilando de nuevo.",[298,299,300,301,305,306,309,310,313,314,317,318,320,321,324],"note",{},"Los comandos de esta página son los que usa la CI (",[302,303,304],"code",{},".github\u002Fworkflows\u002Fci.yml"," y ",[302,307,308],{},"release.yml",", jobs ",[289,311,312],{},"Android","), más\nlas notas para builds locales de ",[302,315,316],{},"docs\u002Fmobile.md"," en el repositorio. La CI compila en ",[289,319,213],{},"; los builds locales están\ndescritos para ",[289,322,323],{},"Windows",". Compilar la app de Android en macOS no está probado.",[326,327,329],"h2",{"id":328},"qué-hay-en-cada-sitio","Qué hay en cada sitio",[331,332,333,346],"table",{},[334,335,336],"thead",{},[337,338,339,343],"tr",{},[340,341,342],"th",{},"Ruta",[340,344,345],{},"Qué es",[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],{},"El proyecto de Gradle de la app (incluido en el repositorio, 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],{},"ID de la app, niveles de SDK, firma de release",[337,371,372,377],{},[352,373,374],{},[302,375,376],{},"src-tauri\u002Ftauri.android.conf.json",[352,378,379],{},"Cambios de la configuración de Tauri para Android (sin actualizador de escritorio, sin los jars del TRS Client)",[337,381,382,387],{},[352,383,384],{},[302,385,386],{},"src-tauri\u002Fplugins\u002Ftauri-plugin-trs-game\u002Fandroid\u002F",[352,388,389,390,393],{},"El motor de juego (partes de Amethyst\u002FPojavLauncher, ",[302,391,392],{},"ndk-build",") y la capa táctil",[337,395,396,401],{},[352,397,398],{},[302,399,400],{},"src-tauri\u002Fplugins\u002Ftauri-plugin-trs-game\u002Fandroid\u002Fprebuilt.lock",[352,402,403],{},"Partes del motor ya compiladas que Gradle descarga y comprueba con SHA-256",[326,405,407],{"id":406},"requisitos","Requisitos",[331,409,410,420],{},[334,411,412],{},[337,413,414,417],{},[340,415,416],{},"Herramienta",[340,418,419],{},"Versión (como en la CI)",[347,421,422,441,464,475,489,511],{},[337,423,424,427],{},[352,425,426],{},"Node.js y pnpm",[352,428,429,432,433,436,437,440],{},[289,430,431],{},"Node 22",", pnpm en la versión fijada en ",[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 con ",[282,450,454],{"href":451,"rel":452},"https:\u002F\u002Frustup.rs",[453],"nofollow","rustup",", targets ",[302,457,458],{},"aarch64-linux-android"," (móviles) y ",[302,461,462],{},"x86_64-linux-android"," (emulador)",[337,465,466,469],{},[352,467,468],{},"JDK",[352,470,471,474],{},[289,472,473],{},"21"," (CI: Temurin; el JBR que trae Android Studio también sirve)",[337,476,477,480],{},[352,478,479],{},"SDK de Android",[352,481,482,483,305,486],{},"con ",[302,484,485],{},"cmdline-tools",[302,487,488],{},"platform-tools",[337,490,491,494],{},[352,492,493],{},"NDK de Android",[352,495,496,499,500,503,504,506,507,510],{},[289,497,498],{},"28.2.13676358"," para la app (",[302,501,502],{},"NDK_HOME",") ",[289,505,295],{}," ",[289,508,509],{},"27.3.13750724"," (r27d) para el motor de juego",[337,512,513,516],{},[352,514,515],{},"Gradle",[352,517,518,519,522],{},"no hay que instalar nada: el wrapper de ",[302,520,521],{},"src-tauri\u002Fgen\u002Fandroid"," usa Gradle 8.14.3",[278,524,525,526,436,529,532,533,536,537,539,540,284],{},"La app se compila contra el SDK de Android ",[289,527,528],{},"36",[302,530,531],{},"compileSdk","\u002F",[302,534,535],{},"targetSdk","). En la CI solo se instalan a mano\n",[302,538,488],{}," y los dos NDK; el resto lo trae el plugin de Android para Gradle. Acepta una vez las licencias del SDK\ncon ",[302,541,542],{},"sdkmanager --licenses",[544,545,546,547,550,551,554,555,558,559,561],"warning",{},"Necesitas ",[289,548,549],{},"los dos NDK",". El plugin del juego fija ",[302,552,553],{},"ndkVersion = \"27.3.13750724\""," en su propio ",[302,556,557],{},"build.gradle.kts","; la\nparte de Rust se enlaza con el NDK de ",[302,560,502],{}," (28.2).",[326,563,565],{"id":564},"compilar-un-apk-debug","Compilar un APK debug",[567,568,570,575,619,623,676,687,691,694,808,819,823,853,868,872,879,965,969,976,995],"steps",{"level":569},"3",[571,572,574],"h3",{"id":573},"descarga-el-código","Descarga el código",[576,577,582],"pre",{"className":578,"code":579,"language":580,"meta":581,"style":581},"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,583,584,600,610],{"__ignoreMap":581},[585,586,589,593,597],"span",{"class":587,"line":588},"line",1,[585,590,592],{"class":591},"sBMFI","git",[585,594,596],{"class":595},"sfazB"," clone",[585,598,599],{"class":595}," https:\u002F\u002Fgithub.com\u002Ftheredstonee\u002FTRS-Launcher.git\n",[585,601,603,607],{"class":587,"line":602},2,[585,604,606],{"class":605},"s2Zo4","cd",[585,608,609],{"class":595}," TRS-Launcher\n",[585,611,613,616],{"class":587,"line":612},3,[585,614,615],{"class":591},"pnpm",[585,617,618],{"class":595}," install\n",[571,620,622],{"id":621},"instala-las-partes-del-sdk-y-los-targets-de-rust","Instala las partes del SDK y los targets de Rust",[576,624,626],{"className":578,"code":625,"language":580,"meta":581,"style":581},"sdkmanager --install \"platform-tools\" \"ndk;28.2.13676358\" \"ndk;27.3.13750724\"\nrustup target add aarch64-linux-android x86_64-linux-android\n",[302,627,628,660],{"__ignoreMap":581},[585,629,630,633,636,640,642,645,647,650,652,654,657],{"class":587,"line":588},[585,631,632],{"class":591},"sdkmanager",[585,634,635],{"class":595}," --install",[585,637,639],{"class":638},"sMK4o"," \"",[585,641,488],{"class":595},[585,643,644],{"class":638},"\"",[585,646,639],{"class":638},[585,648,649],{"class":595},"ndk;28.2.13676358",[585,651,644],{"class":638},[585,653,639],{"class":638},[585,655,656],{"class":595},"ndk;27.3.13750724",[585,658,659],{"class":638},"\"\n",[585,661,662,664,667,670,673],{"class":587,"line":602},[585,663,454],{"class":591},[585,665,666],{"class":595}," target",[585,668,669],{"class":595}," add",[585,671,672],{"class":595}," aarch64-linux-android",[585,674,675],{"class":595}," x86_64-linux-android\n",[278,677,678,679,682,683,686],{},"También puedes instalar las dos versiones del NDK en Android Studio (",[289,680,681],{},"SDK Manager → SDK Tools → NDK (Side by side)",",\nmarcando ",[289,684,685],{},"Show Package Details",").",[571,688,690],{"id":689},"prepara-el-entorno","Prepara el entorno",[278,692,693],{},"En Windows (PowerShell) o Linux:",[695,696,697,746],"code-group",{},[576,698,702],{"className":699,"code":700,"filename":323,"language":701,"meta":581,"style":581},"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,703,704,720,734],{"__ignoreMap":581},[585,705,706,710,712,715,718],{"class":587,"line":588},[585,707,709],{"class":708},"sTEyZ","$env:ANDROID_HOME = ",[585,711,644],{"class":638},[585,713,714],{"class":708},"$env",[585,716,717],{"class":595},":LOCALAPPDATA\\Android\\Sdk",[585,719,659],{"class":638},[585,721,722,725,727,729,732],{"class":587,"line":602},[585,723,724],{"class":708},"$env:NDK_HOME     = ",[585,726,644],{"class":638},[585,728,714],{"class":708},[585,730,731],{"class":595},":ANDROID_HOME\\ndk\\28.2.13676358",[585,733,659],{"class":638},[585,735,736,739,741,744],{"class":587,"line":612},[585,737,738],{"class":708},"$env:JAVA_HOME    = ",[585,740,644],{"class":638},[585,742,743],{"class":595},"C:\\Program Files\\Android\\Android Studio\\jbr",[585,745,659],{"class":638},[576,747,749],{"className":578,"code":748,"filename":213,"language":580,"meta":581,"style":581},"export ANDROID_HOME=\"$HOME\u002FAndroid\u002FSdk\"          # donde esté tu SDK\nexport NDK_HOME=\"$ANDROID_HOME\u002Fndk\u002F28.2.13676358\"\nexport JAVA_HOME=\u002Fruta\u002Fal\u002Fjdk-21\n",[302,750,751,777,796],{"__ignoreMap":581},[585,752,753,757,760,763,765,768,771,773],{"class":587,"line":588},[585,754,756],{"class":755},"spNyl","export",[585,758,759],{"class":708}," ANDROID_HOME",[585,761,762],{"class":638},"=",[585,764,644],{"class":638},[585,766,767],{"class":708},"$HOME",[585,769,770],{"class":595},"\u002FAndroid\u002FSdk",[585,772,644],{"class":638},[585,774,776],{"class":775},"sHwdD","          # donde esté tu SDK\n",[585,778,779,781,784,786,788,791,794],{"class":587,"line":602},[585,780,756],{"class":755},[585,782,783],{"class":708}," NDK_HOME",[585,785,762],{"class":638},[585,787,644],{"class":638},[585,789,790],{"class":708},"$ANDROID_HOME",[585,792,793],{"class":595},"\u002Fndk\u002F28.2.13676358",[585,795,659],{"class":638},[585,797,798,800,803,805],{"class":587,"line":612},[585,799,756],{"class":755},[585,801,802],{"class":708}," JAVA_HOME",[585,804,762],{"class":638},[585,806,807],{"class":708},"\u002Fruta\u002Fal\u002Fjdk-21\n",[278,809,810,811,814,815,284],{},"En Windows, activa antes el ",[289,812,813],{},"modo de desarrollador",": mira ",[282,816,818],{"href":817},"#a-required-privilege-is-not-held-by-the-client","Problemas",[571,820,822],{"id":821},"compila","Compila",[576,824,826],{"className":578,"code":825,"language":580,"meta":581,"style":581},"pnpm tauri android build --apk --debug --target aarch64\n",[302,827,828],{"__ignoreMap":581},[585,829,830,832,835,838,841,844,847,850],{"class":587,"line":588},[585,831,615],{"class":591},[585,833,834],{"class":595}," tauri",[585,836,837],{"class":595}," android",[585,839,840],{"class":595}," build",[585,842,843],{"class":595}," --apk",[585,845,846],{"class":595}," --debug",[585,848,849],{"class":595}," --target",[585,851,852],{"class":595}," aarch64\n",[278,854,855,856,859,860,863,864,867],{},"Esto compila la interfaz (",[302,857,858],{},"pnpm generate","), la biblioteca de Rust para arm64 y luego el APK con Gradle. La primera vez,\nGradle descarga las partes del motor de ",[302,861,862],{},"prebuilt.lock"," (comprobadas con SHA-256 y guardadas en\n",[302,865,866],{},"~\u002F.gradle\u002Fcaches\u002Ftrs-engine-prebuilt","), así que necesita internet y tarda un rato.",[571,869,871],{"id":870},"busca-el-apk","Busca el APK",[278,873,874,875,878],{},"Los APK quedan en ",[302,876,877],{},"src-tauri\u002Fgen\u002Fandroid\u002Fapp\u002Fbuild\u002Foutputs\u002Fapk\u002F",", en una carpeta por ABI y tipo de build. La CI no depende\ndel nombre exacto de la carpeta, y tú tampoco tienes que hacerlo:",[695,880,881,906],{},[576,882,884],{"className":578,"code":883,"filename":213,"language":580,"meta":581,"style":581},"find src-tauri\u002Fgen\u002Fandroid\u002Fapp\u002Fbuild\u002Foutputs\u002Fapk -name '*.apk'\n",[302,885,886],{"__ignoreMap":581},[585,887,888,891,894,897,900,903],{"class":587,"line":588},[585,889,890],{"class":591},"find",[585,892,893],{"class":595}," src-tauri\u002Fgen\u002Fandroid\u002Fapp\u002Fbuild\u002Foutputs\u002Fapk",[585,895,896],{"class":595}," -name",[585,898,899],{"class":638}," '",[585,901,902],{"class":595},"*.apk",[585,904,905],{"class":638},"'\n",[576,907,909],{"className":699,"code":908,"filename":323,"language":701,"meta":581,"style":581},"Get-ChildItem -Recurse -Filter *.apk src-tauri\\gen\\android\\app\\build\\outputs\\apk\n",[302,910,911],{"__ignoreMap":581},[585,912,913,916,919,922,925,928,931,934,937,940,943,945,948,951,954,957,960,962],{"class":587,"line":588},[585,914,915],{"class":591},"Get-ChildItem",[585,917,918],{"class":595}," -Recurse",[585,920,921],{"class":595}," -Filter",[585,923,924],{"class":708}," *",[585,926,927],{"class":595},".apk",[585,929,930],{"class":595}," src-tauri",[585,932,933],{"class":708},"\\g",[585,935,936],{"class":595},"en",[585,938,939],{"class":708},"\\a",[585,941,942],{"class":595},"ndroid",[585,944,939],{"class":708},[585,946,947],{"class":595},"pp",[585,949,950],{"class":708},"\\b",[585,952,953],{"class":595},"uild",[585,955,956],{"class":708},"\\o",[585,958,959],{"class":595},"utputs",[585,961,939],{"class":708},[585,963,964],{"class":595},"pk\n",[571,966,968],{"id":967},"instálalo-en-tu-móvil","Instálalo en tu móvil",[278,970,971,972,975],{},"Activa la ",[289,973,974],{},"depuración USB"," en las opciones de desarrollador del móvil, conéctalo y ejecuta:",[576,977,979],{"className":578,"code":978,"language":580,"meta":581,"style":581},"adb install -r ruta\u002Fal.apk\n",[302,980,981],{"__ignoreMap":581},[585,982,983,986,989,992],{"class":587,"line":588},[585,984,985],{"class":591},"adb",[585,987,988],{"class":595}," install",[585,990,991],{"class":595}," -r",[585,993,994],{"class":595}," ruta\u002Fal.apk\n",[278,996,997,998,1000],{},"O copia el APK al móvil y ábrelo allí, como se explica en ",[282,999,29],{"href":30},". Un APK\ndebug está firmado con la clave debug de tu SDK de Android, así que se instala sin más.",[544,1002,1003,1004,1007,1008,686],{},"Un build debug y nuestra app oficial tienen ",[289,1005,1006],{},"el mismo nombre de paquete, pero claves distintas",". Android no instala uno\nencima del otro («App no instalada» \u002F «entra en conflicto con un paquete existente»). Desinstala antes el otro (eso borra\ntambién sus instancias y mundos) o dale a tu build su propio ID de app (mira ",[282,1009,1011],{"href":1010},"#hazla-tu-propia-app","más abajo",[571,1013,1015],{"id":1014},"para-el-emulador","Para el emulador",[576,1017,1019],{"className":578,"code":1018,"language":580,"meta":581,"style":581},"pnpm tauri android build --apk --debug --target x86_64\n",[302,1020,1021],{"__ignoreMap":581},[585,1022,1023,1025,1027,1029,1031,1033,1035,1037],{"class":587,"line":588},[585,1024,615],{"class":591},[585,1026,834],{"class":595},[585,1028,837],{"class":595},[585,1030,840],{"class":595},[585,1032,843],{"class":595},[585,1034,846],{"class":595},[585,1036,849],{"class":595},[585,1038,1039],{"class":595}," x86_64\n",[278,1041,1042,1043,1046,1047,1050],{},"Arranca el emulador con ",[302,1044,1045],{},"-gpu host",": con SwiftShader el renderizador se cuelga en su comprobación de Vulkan. Minecraft\n",[289,1048,1049],{},"26.x"," no se puede jugar en el emulador (a su Vulkan le faltan extensiones necesarias y OpenGL se bloquea allí);\nprueba esas versiones en un móvil real.",[326,1052,1054],{"id":1053},"compilar-un-apk-release","Compilar un APK release",[576,1056,1058],{"className":578,"code":1057,"language":580,"meta":581,"style":581},"pnpm tauri android build --apk --target aarch64\n",[302,1059,1060],{"__ignoreMap":581},[585,1061,1062,1064,1066,1068,1070,1072,1074],{"class":587,"line":588},[585,1063,615],{"class":591},[585,1065,834],{"class":595},[585,1067,837],{"class":595},[585,1069,840],{"class":595},[585,1071,843],{"class":595},[585,1073,849],{"class":595},[585,1075,852],{"class":595},[278,1077,1078,1079,1082,1083,436,1086,1089],{},"Es el comando de release de la CI sin ",[302,1080,1081],{},"--ci",". Los builds release se reducen con R8. Sin clave de firma sale un APK ",[289,1084,1085],{},"sin\nfirmar",[302,1087,1088],{},"…-unsigned.apk","), y Android no lo puede instalar. Fírmalo con tu propia clave:",[567,1091,1092,1096,1148,1153,1157,1171,1236,1242,1246,1299],{"level":569},[571,1093,1095],{"id":1094},"crea-un-keystore-una-vez","Crea un keystore una vez",[576,1097,1099],{"className":578,"code":1098,"language":580,"meta":581,"style":581},"keytool -genkeypair -v -keystore my-release.jks -alias my-key \\\n  -keyalg RSA -keysize 4096 -validity 10000\n",[302,1100,1101,1127],{"__ignoreMap":581},[585,1102,1103,1106,1109,1112,1115,1118,1121,1124],{"class":587,"line":588},[585,1104,1105],{"class":591},"keytool",[585,1107,1108],{"class":595}," -genkeypair",[585,1110,1111],{"class":595}," -v",[585,1113,1114],{"class":595}," -keystore",[585,1116,1117],{"class":595}," my-release.jks",[585,1119,1120],{"class":595}," -alias",[585,1122,1123],{"class":595}," my-key",[585,1125,1126],{"class":708}," \\\n",[585,1128,1129,1132,1135,1138,1142,1145],{"class":587,"line":602},[585,1130,1131],{"class":595},"  -keyalg",[585,1133,1134],{"class":595}," RSA",[585,1136,1137],{"class":595}," -keysize",[585,1139,1141],{"class":1140},"sbssI"," 4096",[585,1143,1144],{"class":595}," -validity",[585,1146,1147],{"class":1140}," 10000\n",[278,1149,1150,1152],{},[302,1151,1105],{}," viene con el JDK. Guarda bien el archivo y las contraseñas: Android solo instala actualizaciones de una app si\nestán firmadas con la misma clave.",[571,1154,1156],{"id":1155},"define-las-cuatro-variables","Define las cuatro variables",[278,1158,1159,1160,1163,1164,1166,1167,1170],{},"Gradle firma el APK release por sí mismo (",[302,1161,1162],{},"signingConfigs"," en ",[302,1165,366],{},") cuando\n",[302,1168,1169],{},"ANDROID_KEYSTORE_PATH"," apunta a un archivo que existe:",[576,1172,1174],{"className":578,"code":1173,"language":580,"meta":581,"style":581},"export ANDROID_KEYSTORE_PATH=\u002Fruta\u002Fa\u002Fmy-release.jks\nexport ANDROID_KEYSTORE_PASSWORD='…'\nexport ANDROID_KEY_ALIAS=my-key\nexport ANDROID_KEY_PASSWORD='…'      # igual que la del keystore si no elegiste otra\n",[302,1175,1176,1188,1205,1217],{"__ignoreMap":581},[585,1177,1178,1180,1183,1185],{"class":587,"line":588},[585,1179,756],{"class":755},[585,1181,1182],{"class":708}," ANDROID_KEYSTORE_PATH",[585,1184,762],{"class":638},[585,1186,1187],{"class":708},"\u002Fruta\u002Fa\u002Fmy-release.jks\n",[585,1189,1190,1192,1195,1197,1200,1203],{"class":587,"line":602},[585,1191,756],{"class":755},[585,1193,1194],{"class":708}," ANDROID_KEYSTORE_PASSWORD",[585,1196,762],{"class":638},[585,1198,1199],{"class":638},"'",[585,1201,1202],{"class":595},"…",[585,1204,905],{"class":638},[585,1206,1207,1209,1212,1214],{"class":587,"line":612},[585,1208,756],{"class":755},[585,1210,1211],{"class":708}," ANDROID_KEY_ALIAS",[585,1213,762],{"class":638},[585,1215,1216],{"class":708},"my-key\n",[585,1218,1220,1222,1225,1227,1229,1231,1233],{"class":587,"line":1219},4,[585,1221,756],{"class":755},[585,1223,1224],{"class":708}," ANDROID_KEY_PASSWORD",[585,1226,762],{"class":638},[585,1228,1199],{"class":638},[585,1230,1202],{"class":595},[585,1232,1199],{"class":638},[585,1234,1235],{"class":775},"      # igual que la del keystore si no elegiste otra\n",[278,1237,1238,1239,284],{},"En Windows se definen como arriba, con ",[302,1240,1241],{},"$env:NOMBRE = \"…\"",[571,1243,1245],{"id":1244},"compila-y-comprueba","Compila y comprueba",[576,1247,1249],{"className":578,"code":1248,"language":580,"meta":581,"style":581},"pnpm tauri android build --apk --target aarch64\n\"$ANDROID_HOME\"\u002Fbuild-tools\u002F\u003Cversión>\u002Fapksigner verify --print-certs \u003Cel.apk>\n",[302,1250,1251,1267],{"__ignoreMap":581},[585,1252,1253,1255,1257,1259,1261,1263,1265],{"class":587,"line":588},[585,1254,615],{"class":591},[585,1256,834],{"class":595},[585,1258,837],{"class":595},[585,1260,840],{"class":595},[585,1262,843],{"class":595},[585,1264,849],{"class":595},[585,1266,852],{"class":595},[585,1268,1269,1271,1273,1275,1278,1281,1284,1287,1290,1293,1296],{"class":587,"line":602},[585,1270,644],{"class":591},[585,1272,790],{"class":708},[585,1274,644],{"class":591},[585,1276,1277],{"class":591},"\u002Fbuild-tools\u002F",[585,1279,1280],{"class":708},"\u003Cversión>\u002Fapksigner ",[585,1282,1283],{"class":595},"verify",[585,1285,1286],{"class":595}," --print-certs",[585,1288,1289],{"class":638}," \u003C",[585,1291,1292],{"class":595},"el.ap",[585,1294,1295],{"class":708},"k",[585,1297,1298],{"class":638},">\n",[278,1300,1301,1304,1305,1308,1309,1313],{},[302,1302,1303],{},"apksigner"," muestra el SHA-256 de ",[289,1306,1307],{},"tu"," certificado, no el de la ",[282,1310,1312],{"href":1311},"\u002Fes\u002Fgetting-started\u002Fandroid#instalar","página de instalación",",\nque es el de nuestra clave oficial.",[298,1315,1316,1317,1320,1321,1324,1325,1328,1329,1332,1333,1336,1337,1340],{},"No necesitas ningún secreto del proyecto. La clave del actualizador de escritorio (",[302,1318,1319],{},"TAURI_SIGNING_PRIVATE_KEY",") solo\nfirma los archivos del canal de actualizaciones en el workflow de release, y los builds de Android no generan archivos\nde actualización (",[302,1322,1323],{},"tauri.android.conf.json","). La clave de ",[289,1326,1327],{},"CurseForge"," es opcional, igual que en escritorio: la\nvariable de entorno ",[302,1330,1331],{},"CURSEFORGE_API_KEY"," o el archivo ",[302,1334,1335],{},"~\u002F.tauri\u002Fcurseforge-api-key","\n(",[302,1338,1339],{},"%USERPROFILE%\\.tauri\\curseforge-api-key"," en Windows). Sin ella el build funciona y CurseForge simplemente se oculta.",[326,1342,1344],{"id":1343},"hazla-tu-propia-app","Hazla tu propia app",[278,1346,1347,1348,1351],{},"Si quieres instalar tu build ",[289,1349,1350],{},"junto a"," la app oficial o compartirlo con amigos, dale su propio ID de app y su propio\nnombre:",[331,1353,1354,1367],{},[334,1355,1356],{},[337,1357,1358,1361,1364],{},[340,1359,1360],{},"Qué",[340,1362,1363],{},"Dónde",[340,1365,1366],{},"Cambio",[347,1368,1369,1387,1405,1425],{},[337,1370,1371,1374,1378],{},[352,1372,1373],{},"ID de la app (nombre de paquete)",[352,1375,1376],{},[302,1377,366],{},[352,1379,1380,1383,1384],{},[302,1381,1382],{},"applicationId = \"dev.theredstonee.trslauncher\""," → por ejemplo ",[302,1385,1386],{},"\"io.github.tunombre.trslauncher\"",[337,1388,1389,1392,1397],{},[352,1390,1391],{},"Nombre en la pantalla de inicio",[352,1393,1394],{},[302,1395,1396],{},"src-tauri\u002Fgen\u002Fandroid\u002Fapp\u002Fsrc\u002Fmain\u002Fres\u002Fvalues\u002Fstrings.xml",[352,1398,1399,305,1402],{},[302,1400,1401],{},"app_name",[302,1403,1404],{},"main_activity_title",[337,1406,1407,1410,1415],{},[352,1408,1409],{},"Icono",[352,1411,1412],{},[302,1413,1414],{},"src-tauri\u002Fgen\u002Fandroid\u002Fapp\u002Fsrc\u002Fmain\u002Fres\u002Fmipmap-*\u002F",[352,1416,1417,1420,1421,1424],{},[302,1418,1419],{},"ic_launcher*.png"," (los archivos ",[302,1422,1423],{},"ic_launcher_halloween*"," son el icono de evento)",[337,1426,1427,1430,1433],{},[352,1428,1429],{},"Clave de firma",[352,1431,1432],{},"tu propio keystore",[352,1434,1435,1436],{},"mira ",[282,1437,1439],{"href":1438},"#compilar-un-apk-release","arriba",[544,1441,1442,1443,1449,1450,1453,1454,1163,1457,1460,1461,1464,1465,1468,1469,1472,1473,1468,1476,1479,1480,1482],{},"Cambia ",[289,1444,1445,1446],{},"solo ",[302,1447,1448],{},"applicationId",", no ",[302,1451,1452],{},"namespace"," en el mismo archivo ni ",[302,1455,1456],{},"identifier",[302,1458,1459],{},"src-tauri\u002Ftauri.conf.json",". El\npaquete de Kotlin ",[302,1462,1463],{},"dev.theredstonee.trslauncher"," está fijado en el código de Rust (",[302,1466,1467],{},"register_android_plugin"," en\n",[302,1470,1471],{},"src-tauri\u002Fsrc\u002Fmobile.rs",", la función JNI ",[302,1474,1475],{},"Java_dev_theredstonee_trslauncher_PushPollWorker_nativePoll",[302,1477,1478],{},"src-tauri\u002Fsrc\u002Fpush.rs","), y la CLI de Tauri detiene el build con «you have modified your \"identifier\" in the Tauri\nconfiguration» si el identificador ya no coincide con la carpeta de Kotlin. Los plugins del motor y de notificaciones\nleen el nombre de paquete en tiempo de ejecución, así que un ",[302,1481,1448],{}," nuevo no les afecta.",[278,1484,1485],{},"Lo que sigue funcionando en tu propio build, según el código:",[1487,1488,1489,1496,1502,1512],"ul",{},[1490,1491,1492,1495],"li",{},[289,1493,1494],{},"Inicio de sesión con Microsoft:"," la app usa el inicio de sesión con código de dispositivo (escribes un código en la\npágina de Microsoft). No depende del nombre de paquete ni de una redirección a la app.",[1490,1497,1498,1501],{},[289,1499,1500],{},"Servicios de TRS"," (amigos, chat, capas, API de TRS): la app habla con la misma API; no se comprueba ni el nombre de\npaquete ni la firma.",[1490,1503,1504,1507,1508,1511],{},[289,1505,1506],{},"Enlaces"," como ",[302,1509,1510],{},"trs-launcher:\u002F\u002Fpack\u002F\u003Ccode>"," usan el mismo esquema en todos los builds. Si tienes la app oficial y tu\nbuild instalados a la vez, Android te pregunta con cuál abrirlos.",[1490,1513,1514,1517],{},[289,1515,1516],{},"Actualizaciones:"," mira el principio de la página. El instalador de la app solo acepta un APK con su propio nombre de\npaquete, así que no puede sustituir tu build por la app oficial, y Android rechaza nuestro APK encima de un build con\ntu clave.",[278,1519,1520,1521,284],{},"Nosotros todavía no hemos probado un build con otro nombre; si algo falla, ",[282,1522,1523],{"href":224},"avísanos",[326,1525,1527],{"id":1526},"ejecutar-las-comprobaciones","Ejecutar las comprobaciones",[278,1529,1530,1531,1533],{},"Las mismas comprobaciones que el job ",[289,1532,312],{}," de la CI:",[576,1535,1537],{"className":578,"code":1536,"language":580,"meta":581,"style":581},"pnpm generate                       # generate_context! necesita la interfaz compilada\ncd src-tauri\ncargo clippy --workspace --target aarch64-linux-android -- -D warnings\ncd gen\u002Fandroid\n.\u002Fgradlew --no-daemon :tauri-plugin-trs-game:testDebugUnitTest   # capa táctil y lógica del motor, sin dispositivo\n",[302,1538,1539,1549,1556,1580,1587],{"__ignoreMap":581},[585,1540,1541,1543,1546],{"class":587,"line":588},[585,1542,615],{"class":591},[585,1544,1545],{"class":595}," generate",[585,1547,1548],{"class":775},"                       # generate_context! necesita la interfaz compilada\n",[585,1550,1551,1553],{"class":587,"line":602},[585,1552,606],{"class":605},[585,1554,1555],{"class":595}," src-tauri\n",[585,1557,1558,1561,1564,1567,1569,1571,1574,1577],{"class":587,"line":612},[585,1559,1560],{"class":591},"cargo",[585,1562,1563],{"class":595}," clippy",[585,1565,1566],{"class":595}," --workspace",[585,1568,849],{"class":595},[585,1570,672],{"class":595},[585,1572,1573],{"class":595}," --",[585,1575,1576],{"class":595}," -D",[585,1578,1579],{"class":595}," warnings\n",[585,1581,1582,1584],{"class":587,"line":1219},[585,1583,606],{"class":605},[585,1585,1586],{"class":595}," gen\u002Fandroid\n",[585,1588,1590,1593,1596,1599],{"class":587,"line":1589},5,[585,1591,1592],{"class":591},".\u002Fgradlew",[585,1594,1595],{"class":595}," --no-daemon",[585,1597,1598],{"class":595}," :tauri-plugin-trs-game:testDebugUnitTest",[585,1600,1601],{"class":775},"   # capa táctil y lógica del motor, sin dispositivo\n",[278,1603,1604,1605,1608],{},"Clippy se ejecuta fuera de ",[302,1606,1607],{},"tauri android build"," y necesita el compilador del NDK para las partes en C (SQLite, ring). La\nCI define en Linux:",[576,1610,1612],{"className":578,"code":1611,"language":580,"meta":581,"style":581},"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,1613,1614,1631,1650,1668],{"__ignoreMap":581},[585,1615,1616,1619,1621,1623,1626,1629],{"class":587,"line":588},[585,1617,1618],{"class":708},"bin",[585,1620,762],{"class":638},[585,1622,644],{"class":638},[585,1624,1625],{"class":708},"$NDK_HOME",[585,1627,1628],{"class":595},"\u002Ftoolchains\u002Fllvm\u002Fprebuilt\u002Flinux-x86_64\u002Fbin",[585,1630,659],{"class":638},[585,1632,1633,1635,1638,1640,1642,1645,1648],{"class":587,"line":602},[585,1634,756],{"class":755},[585,1636,1637],{"class":708}," CC_aarch64_linux_android",[585,1639,762],{"class":638},[585,1641,644],{"class":638},[585,1643,1644],{"class":708},"$bin",[585,1646,1647],{"class":595},"\u002Faarch64-linux-android26-clang",[585,1649,659],{"class":638},[585,1651,1652,1654,1657,1659,1661,1663,1666],{"class":587,"line":612},[585,1653,756],{"class":755},[585,1655,1656],{"class":708}," AR_aarch64_linux_android",[585,1658,762],{"class":638},[585,1660,644],{"class":638},[585,1662,1644],{"class":708},[585,1664,1665],{"class":595},"\u002Fllvm-ar",[585,1667,659],{"class":638},[585,1669,1670,1672,1675,1677,1679,1681,1683],{"class":587,"line":1219},[585,1671,756],{"class":755},[585,1673,1674],{"class":708}," CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER",[585,1676,762],{"class":638},[585,1678,644],{"class":638},[585,1680,1644],{"class":708},[585,1682,1647],{"class":595},[585,1684,659],{"class":638},[326,1686,818],{"id":1687},"problemas",[571,1689,1691],{"id":1690},"a-required-privilege-is-not-held-by-the-client","«A required privilege is not held by the client»",[278,1693,1694,1695,1697,1698,1701,1702,1704,1705,1708,1709,1712,1713,1715,1716,284],{},"En Windows, ",[302,1696,1607],{}," enlaza la biblioteca de Rust en ",[302,1699,1700],{},"gen\u002Fandroid\u002Fapp\u002Fsrc\u002Fmain\u002FjniLibs"," con un enlace\nsimbólico. Sin el ",[289,1703,813],{}," (o permisos de administrador) eso falla. Activa el modo de desarrollador en la\nconfiguración de Windows, o copia tú la biblioteca (",[302,1706,1707],{},"src-tauri\u002Ftarget\u002F\u003Ctriple>\u002Fdebug\u002Flibtrs_launcher_lib.so"," →\n",[302,1710,1711],{},"jniLibs\u002F\u003Cabi>\u002F",") y ejecuta la tarea de Gradle en ",[302,1714,521],{},"; para el emulador, ",[302,1717,1718],{},"gradlew assembleX86_64Debug",[571,1720,1722],{"id":1721},"no-encuentra-el-ndk-o-la-versión-del-ndk-es-otra","No encuentra el NDK o la versión del NDK es otra",[278,1724,1725,1727,1728,1730,1731,1733,1734,1737,1738,1163,1741,1744,1745,1748,1749,1751],{},[302,1726,502],{}," tiene que apuntar a ",[289,1729,498],{},", y ",[289,1732,509],{}," también tiene que estar en la carpeta ",[302,1735,1736],{},"ndk\u002F"," del SDK.\nSi tu r27d está en otro sitio, define ",[302,1739,1740],{},"android.ndkPath",[302,1742,1743],{},"src-tauri\u002Fgen\u002Fandroid\u002Flocal.properties"," o la variable\n",[302,1746,1747],{},"ANDROID_NDK_HOME"," (mira el comentario en el ",[302,1750,557],{}," del plugin).",[571,1753,1755],{"id":1754},"la-instalación-del-sdk-pide-el-paquete-tools","La instalación del SDK pide el paquete «tools»",[278,1757,1758,1759,1762,1763,1765,1766,1768,1769,1771],{},"El antiguo paquete ",[302,1760,1761],{},"tools"," del SDK ya no existe con las ",[302,1764,485],{}," actuales. Instala solo ",[302,1767,485],{},",\n",[302,1770,488],{}," y los dos NDK; la CI hace lo mismo.",[571,1773,1775],{"id":1774},"el-apk-release-no-se-instala","El APK release no se instala",[278,1777,1778,1779,1781],{},"Está sin firmar (",[302,1780,1088],{},"). Define las cuatro variables de firma y vuelve a compilar, o usa un build debug.",[571,1783,1785],{"id":1784},"app-no-instalada-o-entra-en-conflicto-con-un-paquete-existente","«App no instalada» o «entra en conflicto con un paquete existente»",[278,1787,1788,1789,284],{},"Ya hay instalado un build de la app con otra clave, a menudo nuestra app oficial. Desinstálalo antes (eso borra sus\ninstancias) o dale a tu build su propio ",[282,1790,1791],{"href":1010},"ID de app",[571,1793,1795],{"id":1794},"sha-256-stimmt-nicht-al-descargar-las-partes-del-motor","«SHA-256 stimmt nicht» al descargar las partes del motor",[278,1797,1798,1799,1801],{},"Una descarga de ",[302,1800,862],{}," no coincide con su suma de comprobación (por ejemplo, por una conexión cortada o un\nproxy). El archivo se descarta; vuelve a lanzar el build.",[571,1803,1805],{"id":1804},"el-juego-se-cierra-en-el-emulador-o-26x-no-arranca-allí","El juego se cierra en el emulador o 26.x no arranca allí",[278,1807,1808,1809,1811,1812,686],{},"Usa ",[302,1810,1045],{}," y prueba Minecraft 26.x en un móvil real (mira ",[282,1813,1015],{"href":1814},"#para-el-emulador",[571,1816,1818],{"id":1817},"la-app-no-se-instala-en-un-móvil-antiguo-o-de-32-bits","La app no se instala en un móvil antiguo o de 32 bits",[278,1820,1821,1822,305,1825,1828],{},"La app necesita Android 8.0 y un procesador de 64 bits: solo se empaquetan ",[302,1823,1824],{},"arm64-v8a",[302,1826,1827],{},"x86_64",", porque el motor de\njuego solo existe para 64 bits.",[571,1830,1832],{"id":1831},"falta-curseforge","Falta CurseForge",[278,1834,1835],{},"El build no tenía clave de API de CurseForge. En builds propios es normal; mira la nota sobre la clave más arriba.",[326,1837,1839],{"id":1838},"licencia-y-nombre","Licencia y nombre",[278,1841,1842,1843,436,1846,1849,1850,1853,1854,1857,1858,1860],{},"TRS Launcher es software libre bajo la ",[289,1844,1845],{},"GNU General Public License v3.0",[302,1847,1848],{},"LICENSE",", avisos de copyright en ",[302,1851,1852],{},"NOTICE",").\nPuedes compilar, cambiar y compartir la app. Si compartes un APK, la GPL exige que sea bajo la misma licencia y que\npongas a disposición el ",[289,1855,1856],{},"código fuente completo"," de ese build exacto, con tus cambios. El motor de juego incluye partes\nde terceros con sus propias licencias (Amethyst\u002FPojavLauncher bajo LGPL-3.0 y otras); están en ",[302,1859,1852],{}," y tienen que\nquedarse.",[278,1862,1863],{},"El repositorio no tiene reglas propias sobre la marca. Aun así: si repartes tu propio build, dale otro nombre y otro ID\nde app para que nadie lo confunda con el TRS Launcher oficial, y remite a tu código fuente, no a nuestro soporte.",[326,1865,1867],{"id":1866},"siguientes-pasos","Siguientes pasos",[1869,1870,1871,1876],"card-group",{},[1872,1873,1875],"card",{"icon":37,"title":1874,"to":265},"Compila tú mismo la app de iOS","Lo mismo para iPhone y iPad; necesitas un Mac con Xcode.",[1872,1877,1878],{"icon":243,"title":240,"to":241},"El launcher de escritorio, las comprobaciones y el mod TRS Client.",[1880,1881,1882],"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":581,"searchDepth":602,"depth":602,"links":1884},[1885,1886,1887,1896,1901,1902,1903,1914,1915],{"id":328,"depth":602,"text":329},{"id":406,"depth":602,"text":407},{"id":564,"depth":602,"text":565,"children":1888},[1889,1890,1891,1892,1893,1894,1895],{"id":573,"depth":612,"text":574},{"id":621,"depth":612,"text":622},{"id":689,"depth":612,"text":690},{"id":821,"depth":612,"text":822},{"id":870,"depth":612,"text":871},{"id":967,"depth":612,"text":968},{"id":1014,"depth":612,"text":1015},{"id":1053,"depth":602,"text":1054,"children":1897},[1898,1899,1900],{"id":1094,"depth":612,"text":1095},{"id":1155,"depth":612,"text":1156},{"id":1244,"depth":612,"text":1245},{"id":1343,"depth":602,"text":1344},{"id":1526,"depth":602,"text":1527},{"id":1687,"depth":602,"text":818,"children":1904},[1905,1906,1907,1908,1909,1910,1911,1912,1913],{"id":1690,"depth":612,"text":1691},{"id":1721,"depth":612,"text":1722},{"id":1754,"depth":612,"text":1755},{"id":1774,"depth":612,"text":1775},{"id":1784,"depth":612,"text":1785},{"id":1794,"depth":612,"text":1795},{"id":1804,"depth":612,"text":1805},{"id":1817,"depth":612,"text":1818},{"id":1831,"depth":612,"text":1832},{"id":1838,"depth":602,"text":1839},{"id":1866,"depth":602,"text":1867},"Compila el APK de TRS Launcher desde el código: SDK y NDK de Android, targets de Rust, builds debug y release, tu propia clave de firma y tu propio ID de app.","md",null,{},{"icon":32},{"title":260,"description":1916},"dpyppWboYBpB5YNnm-fzleIcnQhQhCjDuheM2atQW_w",[1924,1926],{"title":255,"path":256,"stem":257,"description":1925,"icon":258,"children":-1},"Endpoints de la API de TRS que puedes leer sin cuenta: estado, versiones, capas, circuitos, códigos de modpack, blog, incidencias, equipo y logros.",{"title":264,"path":265,"stem":266,"description":1927,"icon":37,"children":-1},"Compila el IPA de TRS Launcher para iPhone y iPad en un Mac: proyecto de Xcode, biblioteca de Rust, motor de juego, sideload y ejecución con tu propio Apple ID.",1792830337275]