You've already forked KernelSU
mirror of
https://github.com/tiann/KernelSU.git
synced 2025-08-27 23:46:34 +00:00
172 lines
38 KiB
JavaScript
172 lines
38 KiB
JavaScript
import{_ as e,o as s,c as a,Q as o}from"./chunks/framework.ec8f7e8e.js";const v=JSON.parse('{"title":"Guias de módulo","description":"","frontmatter":{},"headers":[],"relativePath":"pt_BR/guide/module.md","filePath":"pt_BR/guide/module.md"}'),n={name:"pt_BR/guide/module.md"},l=o(`<h1 id="guias-de-modulo" tabindex="-1">Guias de módulo <a class="header-anchor" href="#guias-de-modulo" aria-label="Permalink to "Guias de módulo""></a></h1><p>O KernelSU fornece um mecanismo de módulo que consegue modificar o diretório do sistema enquanto mantém a integridade da partição do sistema. Este mecanismo é conhecido como "sem sistema".</p><p>O mecanismo de módulo do KernelSU é quase o mesmo do Magisk. Se você está familiarizado com o desenvolvimento de módulos Magisk, o desenvolvimento de módulos KernelSU é muito semelhante. Você pode pular a introdução dos módulos abaixo e só precisa ler <a href="./difference-with-magisk.html">Diferença com Magisk</a>.</p><h2 id="busybox" tabindex="-1">BusyBox <a class="header-anchor" href="#busybox" aria-label="Permalink to "BusyBox""></a></h2><p>O KernelSU vem com um recurso binário BusyBox completo (incluindo suporte completo ao SELinux). O executável está localizado em <code>/data/adb/ksu/bin/busybox</code>. O BusyBox do KernelSU suporta o "ASH Standalone Shell Mode" alternável em tempo de execução. O que este Modo Autônomo significa é que ao executar no shell <code>ash</code> do BusyBox, cada comando usará diretamente o miniaplicativo dentro do BusyBox, independentemente do que estiver definido como <code>PATH</code>. Por exemplo, comandos como <code>ls</code>, <code>rm</code>, <code>chmod</code> <strong>NÃO</strong> usarão o que está em <code>PATH</code> (no caso do Android por padrão será <code>/system/bin/ls</code>, <code>/system/bin/rm</code> e <code>/system/bin/chmod</code> respectivamente), mas em vez disso chamará diretamente os miniaplicativos internos do BusyBox. Isso garante que os scripts sempre sejam executados em um ambiente previsível e sempre tenham o conjunto completo de comandos, independentemente da versão do Android em que estão sendo executados. Para forçar um comando a <strong>NÃO</strong> usar o BusyBox, você deve chamar o executável com caminhos completos.</p><p>Cada script shell executado no contexto do KernelSU será executado no shell <code>ash</code> do BusyBox com o Modo Autônomo ativado. Para o que é relevante para desenvolvedores terceirizados, isso inclui todos os scripts de inicialização e scripts de instalação de módulos.</p><p>Para aqueles que desejam usar o recurso “Modo Autônomo” fora do KernelSU, existem 2 maneiras de ativá-los:</p><ol><li>Defina a variável de ambiente <code>ASH_STANDALONE</code> como <code>1</code><br>Exemplo: <code>ASH_STANDALONE=1 /data/adb/ksu/bin/busybox sh <script></code></li><li>Alternar com opções de linha de comando:<br><code>/data/adb/ksu/bin/busybox sh -o standalone <script></code></li></ol><p>Para garantir que todos os shells <code>sh</code> subsequentes executados também sejam executados no Modo Autônomo, a opção 1 é o método preferido (e é isso que o KernelSU e o gerenciador KernelSU usam internamente), pois as variáveis de ambiente são herdadas para os subprocesso.</p><div class="tip custom-block"><p class="custom-block-title">DIFERENÇA COM MAGISK</p><p>O BusyBox do KernelSU agora está usando o arquivo binário compilado diretamente do projeto Magisk. <strong>Obrigado ao Magisk!</strong> Portanto, você não precisa se preocupar com problemas de compatibilidade entre scripts BusyBox no Magisk e KernelSU porque eles são exatamente iguais!</p></div><h2 id="modulos-kernelsu" tabindex="-1">Módulos KernelSU <a class="header-anchor" href="#modulos-kernelsu" aria-label="Permalink to "Módulos KernelSU""></a></h2><p>Um módulo KernelSU é uma pasta colocada em <code>/data/adb/modules</code> com a estrutura abaixo:</p><div class="language-txt vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">txt</span><pre class="shiki github-dark vp-code-dark"><code><span class="line"><span style="color:#e1e4e8;">/data/adb/modules</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">├── .</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">├── .</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">|</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">├── $MODID <--- A pasta é nomeada com o ID do módulo</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">│ │</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">│ │ *** Identidade do Módulo ***</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">│ │</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">│ ├── module.prop <--- Este arquivo armazena os metadados do módulo</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">│ │</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">│ │ *** Conteúdo Principal ***</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">│ │</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">│ ├── system <--- Esta pasta será montada se skip_mount não existir</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">│ │ ├── ...</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">│ │ ├── ...</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">│ │ └── ...</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">│ │</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">│ │ *** Sinalizadores de Status ***</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">│ │</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">│ ├── skip_mount <--- Se existir, o KernelSU NÃO montará sua pasta de sistema</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">│ ├── disable <--- Se existir, o módulo será desabilitado</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">│ ├── remove <--- Se existir, o módulo será removido na próxima reinicialização</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">│ │</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">│ │ *** Arquivos Opcionais ***</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">│ │</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">│ ├── post-fs-data.sh <--- Este script será executado em post-fs-data</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">│ ├── post-mount.sh <--- Este script será executado em post-mount</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">│ ├── service.sh <--- Este script será executado no late_start service</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">│ ├── boot-completed.sh <--- Este script será executado na inicialização concluída</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">| ├── uninstall.sh <--- Este script será executado quando o KernelSU remover seu módulo</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">│ ├── system.prop <--- As propriedades neste arquivo serão carregadas como propriedades do sistema por resetprop</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">│ ├── sepolicy.rule <--- Regras adicionais de sepolicy personalizadas</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">│ │</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">│ │ *** Gerado Automaticamente, NÃO CRIE OU MODIFIQUE MANUALMENTE ***</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">│ │</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">│ ├── vendor <--- Um link simbólico para $MODID/system/vendor</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">│ ├── product <--- Um link simbólico para $MODID/system/product</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">│ ├── system_ext <--- Um link simbólico para $MODID/system/system_ext</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">│ │</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">│ │ *** Quaisquer arquivos/pastas adicionais são permitidos ***</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">│ │</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">│ ├── ...</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">│ └── ...</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">|</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">├── another_module</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">│ ├── .</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">│ └── .</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">├── .</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">├── .</span></span></code></pre><pre class="shiki github-light vp-code-light"><code><span class="line"><span style="color:#24292e;">/data/adb/modules</span></span>
|
||
<span class="line"><span style="color:#24292e;">├── .</span></span>
|
||
<span class="line"><span style="color:#24292e;">├── .</span></span>
|
||
<span class="line"><span style="color:#24292e;">|</span></span>
|
||
<span class="line"><span style="color:#24292e;">├── $MODID <--- A pasta é nomeada com o ID do módulo</span></span>
|
||
<span class="line"><span style="color:#24292e;">│ │</span></span>
|
||
<span class="line"><span style="color:#24292e;">│ │ *** Identidade do Módulo ***</span></span>
|
||
<span class="line"><span style="color:#24292e;">│ │</span></span>
|
||
<span class="line"><span style="color:#24292e;">│ ├── module.prop <--- Este arquivo armazena os metadados do módulo</span></span>
|
||
<span class="line"><span style="color:#24292e;">│ │</span></span>
|
||
<span class="line"><span style="color:#24292e;">│ │ *** Conteúdo Principal ***</span></span>
|
||
<span class="line"><span style="color:#24292e;">│ │</span></span>
|
||
<span class="line"><span style="color:#24292e;">│ ├── system <--- Esta pasta será montada se skip_mount não existir</span></span>
|
||
<span class="line"><span style="color:#24292e;">│ │ ├── ...</span></span>
|
||
<span class="line"><span style="color:#24292e;">│ │ ├── ...</span></span>
|
||
<span class="line"><span style="color:#24292e;">│ │ └── ...</span></span>
|
||
<span class="line"><span style="color:#24292e;">│ │</span></span>
|
||
<span class="line"><span style="color:#24292e;">│ │ *** Sinalizadores de Status ***</span></span>
|
||
<span class="line"><span style="color:#24292e;">│ │</span></span>
|
||
<span class="line"><span style="color:#24292e;">│ ├── skip_mount <--- Se existir, o KernelSU NÃO montará sua pasta de sistema</span></span>
|
||
<span class="line"><span style="color:#24292e;">│ ├── disable <--- Se existir, o módulo será desabilitado</span></span>
|
||
<span class="line"><span style="color:#24292e;">│ ├── remove <--- Se existir, o módulo será removido na próxima reinicialização</span></span>
|
||
<span class="line"><span style="color:#24292e;">│ │</span></span>
|
||
<span class="line"><span style="color:#24292e;">│ │ *** Arquivos Opcionais ***</span></span>
|
||
<span class="line"><span style="color:#24292e;">│ │</span></span>
|
||
<span class="line"><span style="color:#24292e;">│ ├── post-fs-data.sh <--- Este script será executado em post-fs-data</span></span>
|
||
<span class="line"><span style="color:#24292e;">│ ├── post-mount.sh <--- Este script será executado em post-mount</span></span>
|
||
<span class="line"><span style="color:#24292e;">│ ├── service.sh <--- Este script será executado no late_start service</span></span>
|
||
<span class="line"><span style="color:#24292e;">│ ├── boot-completed.sh <--- Este script será executado na inicialização concluída</span></span>
|
||
<span class="line"><span style="color:#24292e;">| ├── uninstall.sh <--- Este script será executado quando o KernelSU remover seu módulo</span></span>
|
||
<span class="line"><span style="color:#24292e;">│ ├── system.prop <--- As propriedades neste arquivo serão carregadas como propriedades do sistema por resetprop</span></span>
|
||
<span class="line"><span style="color:#24292e;">│ ├── sepolicy.rule <--- Regras adicionais de sepolicy personalizadas</span></span>
|
||
<span class="line"><span style="color:#24292e;">│ │</span></span>
|
||
<span class="line"><span style="color:#24292e;">│ │ *** Gerado Automaticamente, NÃO CRIE OU MODIFIQUE MANUALMENTE ***</span></span>
|
||
<span class="line"><span style="color:#24292e;">│ │</span></span>
|
||
<span class="line"><span style="color:#24292e;">│ ├── vendor <--- Um link simbólico para $MODID/system/vendor</span></span>
|
||
<span class="line"><span style="color:#24292e;">│ ├── product <--- Um link simbólico para $MODID/system/product</span></span>
|
||
<span class="line"><span style="color:#24292e;">│ ├── system_ext <--- Um link simbólico para $MODID/system/system_ext</span></span>
|
||
<span class="line"><span style="color:#24292e;">│ │</span></span>
|
||
<span class="line"><span style="color:#24292e;">│ │ *** Quaisquer arquivos/pastas adicionais são permitidos ***</span></span>
|
||
<span class="line"><span style="color:#24292e;">│ │</span></span>
|
||
<span class="line"><span style="color:#24292e;">│ ├── ...</span></span>
|
||
<span class="line"><span style="color:#24292e;">│ └── ...</span></span>
|
||
<span class="line"><span style="color:#24292e;">|</span></span>
|
||
<span class="line"><span style="color:#24292e;">├── another_module</span></span>
|
||
<span class="line"><span style="color:#24292e;">│ ├── .</span></span>
|
||
<span class="line"><span style="color:#24292e;">│ └── .</span></span>
|
||
<span class="line"><span style="color:#24292e;">├── .</span></span>
|
||
<span class="line"><span style="color:#24292e;">├── .</span></span></code></pre></div><div class="tip custom-block"><p class="custom-block-title">DIFERENÇA COM MAGISK</p><p>O KernelSU não possui suporte integrado para o Zygisk, portanto não há conteúdo relacionado ao Zygisk no módulo. No entanto, você pode usar <a href="https://github.com/Dr-TSNG/ZygiskNext" target="_blank" rel="noreferrer">ZygiskNext</a> para suportar módulos Zygisk. Neste caso, o conteúdo do módulo Zygisk é idêntico ao suportado pelo Magisk.</p></div><h3 id="module-prop" tabindex="-1">module.prop <a class="header-anchor" href="#module-prop" aria-label="Permalink to "module.prop""></a></h3><p><code>module.prop</code> é um arquivo de configuração para um módulo. No KernelSU, se um módulo não contiver este arquivo, ele não será reconhecido como um módulo. O formato deste arquivo é o seguinte:</p><div class="language-txt vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">txt</span><pre class="shiki github-dark vp-code-dark"><code><span class="line"><span style="color:#e1e4e8;">id=<string></span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">name=<string></span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">version=<string></span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">versionCode=<int></span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">author=<string></span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">description=<string></span></span></code></pre><pre class="shiki github-light vp-code-light"><code><span class="line"><span style="color:#24292e;">id=<string></span></span>
|
||
<span class="line"><span style="color:#24292e;">name=<string></span></span>
|
||
<span class="line"><span style="color:#24292e;">version=<string></span></span>
|
||
<span class="line"><span style="color:#24292e;">versionCode=<int></span></span>
|
||
<span class="line"><span style="color:#24292e;">author=<string></span></span>
|
||
<span class="line"><span style="color:#24292e;">description=<string></span></span></code></pre></div><ul><li><code>id</code> deve corresponder a esta expressão regular: <code>^[a-zA-Z][a-zA-Z0-9._-]+$</code><br> Exemplo: ✓ <code>a_module</code>, ✓ <code>a.module</code>, ✓ <code>module-101</code>, ✗ <code>a module</code>, ✗ <code>1_module</code>, ✗ <code>-a-module</code><br> Este é o <strong>identificador exclusivo</strong> do seu módulo. Você não deve alterá-lo depois de publicado.</li><li><code>versionCode</code> deve ser um <strong>inteiro</strong>. Isso é usado para comparar versões</li><li>Outros que não foram mencionados acima podem ser qualquer string de <strong>linha única</strong>.</li><li>Certifique-se de usar o tipo de quebra de linha <code>UNIX (LF)</code> e não o <code>Windows (CR+LF)</code> ou <code>Macintosh (CR)</code>.</li></ul><h3 id="shell-scripts" tabindex="-1">Shell scripts <a class="header-anchor" href="#shell-scripts" aria-label="Permalink to "Shell scripts""></a></h3><p>Por favor, leia a seção <a href="#scripts-de-inicializacao">Scripts de inicialização</a> para entender a diferença entre <code>post-fs-data.sh</code> e <code>service.sh</code>. Para a maioria dos desenvolvedores de módulos, <code>service.sh</code> deve ser bom o suficiente se você precisar apenas executar um script de inicialização. Se precisar executar o script após a inicialização ser concluída, use <code>boot-completed.sh</code>. Se você quiser fazer algo após montar overlayfs, use <code>post-mount.sh</code>.</p><p>Em todos os scripts do seu módulo, use <code>MODDIR=\${0%/*}</code> para obter o caminho do diretório base do seu módulo, <strong>NÃO</strong> codifique o caminho do seu módulo em scripts.</p><div class="tip custom-block"><p class="custom-block-title">DIFERENÇA COM MAGISK</p><p>Você pode usar a variável de ambiente <code>KSU</code> para determinar se um script está sendo executado no KernelSU ou Magisk. Se estiver executando no KernelSU, esse valor será definido como <code>true</code>.</p></div><h3 id="diretorio-system" tabindex="-1">Diretório <code>system</code> <a class="header-anchor" href="#diretorio-system" aria-label="Permalink to "Diretório \`system\`""></a></h3><p>O conteúdo deste diretório será sobreposto à partição /system do sistema usando overlayfs após a inicialização do sistema. Isso significa que:</p><ol><li>Arquivos com o mesmo nome daqueles no diretório correspondente no sistema serão substituídos pelos arquivos deste diretório.</li><li>Pastas com o mesmo nome daquelas no diretório correspondente no sistema serão mescladas com as pastas neste diretório.</li></ol><p>Se você deseja excluir um arquivo ou pasta no diretório original do sistema, você precisa criar um arquivo com o mesmo nome do arquivo/pasta no diretório do módulo usando <code>mknod filename c 0 0</code>. Dessa forma, o sistema overlayfs irá automaticamente "branquear" este arquivo como se ele tivesse sido excluído (a partição /system não foi realmente alterada).</p><p>Você também pode declarar uma variável chamada <code>REMOVE</code> contendo uma lista de diretórios em <code>customize.sh</code> para executar operações de remoção, e o KernelSU executará automaticamente <code>mknod <TARGET> c 0 0</code> nos diretórios correspondentes do módulo. Por exemplo:</p><div class="language-sh vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki github-dark vp-code-dark"><code><span class="line"><span style="color:#E1E4E8;">REMOVE</span><span style="color:#F97583;">=</span><span style="color:#9ECBFF;">"</span></span>
|
||
<span class="line"><span style="color:#9ECBFF;">/system/app/YouTube</span></span>
|
||
<span class="line"><span style="color:#9ECBFF;">/system/app/Bloatware</span></span>
|
||
<span class="line"><span style="color:#9ECBFF;">"</span></span></code></pre><pre class="shiki github-light vp-code-light"><code><span class="line"><span style="color:#24292E;">REMOVE</span><span style="color:#D73A49;">=</span><span style="color:#032F62;">"</span></span>
|
||
<span class="line"><span style="color:#032F62;">/system/app/YouTube</span></span>
|
||
<span class="line"><span style="color:#032F62;">/system/app/Bloatware</span></span>
|
||
<span class="line"><span style="color:#032F62;">"</span></span></code></pre></div><p>A lista acima irá executar <code>mknod $MODPATH/system/app/YouTube c 0 0</code> e <code>mknod $MODPATH/system/app/Bloatware c 0 0</code>; e <code>/system/app/YouTube</code> e <code>/system/app/Bloatware</code> serão removidos após o módulo entrar em vigor.</p><p>Se você deseja substituir um diretório no sistema, você precisa criar um diretório com o mesmo caminho no diretório do módulo e, em seguida, definir o atributo <code>setfattr -n trusted.overlay.opaque -v y <TARGET></code> para este diretório. Desta forma, o sistema overlayfs substituirá automaticamente o diretório correspondente no sistema (sem alterar a partição /system).</p><p>Você pode declarar uma variável chamada <code>REPLACE</code> em seu arquivo <code>customize.sh</code>, que inclui uma lista de diretórios a serem substituídos, e o KernelSU executará automaticamente as operações correspondentes em seu diretório de módulo. Por exemplo:</p><div class="language-sh vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki github-dark vp-code-dark"><code><span class="line"><span style="color:#E1E4E8;">REPLACE</span><span style="color:#F97583;">=</span><span style="color:#9ECBFF;">"</span></span>
|
||
<span class="line"><span style="color:#9ECBFF;">/system/app/YouTube</span></span>
|
||
<span class="line"><span style="color:#9ECBFF;">/system/app/Bloatware</span></span>
|
||
<span class="line"><span style="color:#9ECBFF;">"</span></span></code></pre><pre class="shiki github-light vp-code-light"><code><span class="line"><span style="color:#24292E;">REPLACE</span><span style="color:#D73A49;">=</span><span style="color:#032F62;">"</span></span>
|
||
<span class="line"><span style="color:#032F62;">/system/app/YouTube</span></span>
|
||
<span class="line"><span style="color:#032F62;">/system/app/Bloatware</span></span>
|
||
<span class="line"><span style="color:#032F62;">"</span></span></code></pre></div><p>Esta lista criará automaticamente os diretórios <code>$MODPATH/system/app/YouTube</code> e <code>$MODPATH/system/app/Bloatware</code> e, em seguida, executará <code>setfattr -n trusted.overlay.opaque -v y $MODPATH/system/app/YouTube</code> e <code>setfattr -n trusted.overlay.opaque -v y $MODPATH/system/app/Bloatware</code>. Após o módulo entrar em vigor, <code>/system/app/YouTube</code> e <code>/system/app/Bloatware</code> serão substituídos por diretórios vazios.</p><div class="tip custom-block"><p class="custom-block-title">DIFERENÇA COM MAGISK</p><p>O mecanismo sem sistema do KernelSU é implementado através do overlayfs do kernel, enquanto o Magisk atualmente usa montagem mágica (montagem de ligação). Os dois métodos de implementação têm diferenças significativas, mas o objetivo final é o mesmo: modificar os arquivos /system sem modificar fisicamente a partição /system.</p></div><p>Se você estiver interessado em overlayfs, é recomendável ler a <a href="https://docs.kernel.org/filesystems/overlayfs.html" target="_blank" rel="noreferrer">documentação sobre overlayfs</a> do Kernel Linux.</p><h3 id="system-prop" tabindex="-1">system.prop <a class="header-anchor" href="#system-prop" aria-label="Permalink to "system.prop""></a></h3><p>Este arquivo segue o mesmo formato de <code>build.prop</code>. Cada linha é composta por <code>[key]=[value]</code>.</p><h3 id="sepolicy-rule" tabindex="-1">sepolicy.rule <a class="header-anchor" href="#sepolicy-rule" aria-label="Permalink to "sepolicy.rule""></a></h3><p>Se o seu módulo exigir alguns patches adicionais de sepolicy, adicione essas regras a este arquivo. Cada linha neste arquivo será tratada como uma declaração de política.</p><h2 id="instalador-do-modulo" tabindex="-1">Instalador do módulo <a class="header-anchor" href="#instalador-do-modulo" aria-label="Permalink to "Instalador do módulo""></a></h2><p>Um instalador do módulo KernelSU é um módulo KernelSU empacotado em um arquivo zip que pode ser atualizado no app gerenciador KernelSU. O instalador do módulo KernelSU mais simples é apenas um módulo KernelSU compactado como um arquivo zip.</p><div class="language-txt vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">txt</span><pre class="shiki github-dark vp-code-dark"><code><span class="line"><span style="color:#e1e4e8;">module.zip</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">│</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">├── customize.sh <--- (Opcional, mais detalhes posteriormente)</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">│ Este script será fornecido por update-binary</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">├── ...</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">├── ... /* O resto dos arquivos do módulo */</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">│</span></span></code></pre><pre class="shiki github-light vp-code-light"><code><span class="line"><span style="color:#24292e;">module.zip</span></span>
|
||
<span class="line"><span style="color:#24292e;">│</span></span>
|
||
<span class="line"><span style="color:#24292e;">├── customize.sh <--- (Opcional, mais detalhes posteriormente)</span></span>
|
||
<span class="line"><span style="color:#24292e;">│ Este script será fornecido por update-binary</span></span>
|
||
<span class="line"><span style="color:#24292e;">├── ...</span></span>
|
||
<span class="line"><span style="color:#24292e;">├── ... /* O resto dos arquivos do módulo */</span></span>
|
||
<span class="line"><span style="color:#24292e;">│</span></span></code></pre></div><div class="warning custom-block"><p class="custom-block-title">AVISO</p><p>O módulo KernelSU <strong>NÃO</strong> é compatível para instalação no Recovery personalizado!</p></div><h3 id="personalizacao" tabindex="-1">Personalização <a class="header-anchor" href="#personalizacao" aria-label="Permalink to "Personalização""></a></h3><p>Se você precisar personalizar o processo de instalação do módulo, opcionalmente você pode criar um script no instalador chamado <code>customize.sh</code>. Este script será <strong>sourced</strong> (não executado!) pelo script do instalador do módulo depois que todos os arquivos forem extraídos e as permissões padrão e o contexto secundário forem aplicados. Isso é muito útil se o seu módulo exigir configuração adicional com base na API do dispositivo ou se você precisar definir permissões/secontext especiais para alguns dos arquivos do seu módulo.</p><p>Se você quiser controlar e personalizar totalmente o processo de instalação, declare <code>SKIPUNZIP=1</code> em <code>customize.sh</code> para pular todas as etapas de instalação padrão. Ao fazer isso, seu <code>customize.sh</code> será responsável por instalar tudo sozinho.</p><p>O script <code>customize.sh</code> é executado no shell BusyBox <code>ash</code> do KernelSU com o "Modo Autônomo" ativado. As seguintes variáveis e funções estão disponíveis:</p><h4 id="variaveis" tabindex="-1">Variáveis <a class="header-anchor" href="#variaveis" aria-label="Permalink to "Variáveis""></a></h4><ul><li><code>KSU</code> (bool): uma variável para marcar que o script está sendo executado no ambiente KernelSU, e o valor desta variável sempre será <code>true</code>. Você pode usá-lo para distinguir entre KernelSU e Magisk.</li><li><code>KSU_VER</code> (string): a string da versão do KernelSU atualmente instalado (por exemplo, <code>v0.4.0</code>).</li><li><code>KSU_VER_CODE</code> (int): o código da versão do KernelSU atualmente instalado no espaço do usuário (por exemplo: <code>10672</code>).</li><li><code>KSU_KERNEL_VER_CODE</code> (int): o código da versão do KernelSU atualmente instalado no espaço do kernel (por exemplo: <code>10672</code>).</li><li><code>BOOTMODE</code> (bool): sempre seja <code>true</code> no KernelSU.</li><li><code>MODPATH</code> (path): o caminho onde os arquivos do seu módulo devem ser instalados.</li><li><code>TMPDIR</code> (path): um lugar onde você pode armazenar arquivos temporariamente.</li><li><code>ZIPFILE</code> (path): zip de instalação do seu módulo.</li><li><code>ARCH</code> (string): a arquitetura da CPU do dispositivo. O valor é <code>arm</code>, <code>arm64</code>, <code>x86</code> ou <code>x64</code>.</li><li><code>IS64BIT</code> (bool): <code>true</code> se <code>$ARCH</code> for <code>arm64</code> ou <code>x64</code>.</li><li><code>API</code> (int): o nível da API (versão do Android) do dispositivo (por exemplo: <code>23</code> para Android 6.0).</li></ul><div class="warning custom-block"><p class="custom-block-title">AVISO</p><p>No KernelSU, <code>MAGISK_VER_CODE</code> é sempre <code>25200</code> e <code>MAGISK_VER</code> é sempre <code>v25.2</code>. Por favor, não use essas duas variáveis para determinar se ele está sendo executado no KernelSU ou não.</p></div><h4 id="funcoes" tabindex="-1">Funções <a class="header-anchor" href="#funcoes" aria-label="Permalink to "Funções""></a></h4><div class="language-txt vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">txt</span><pre class="shiki github-dark vp-code-dark"><code><span class="line"><span style="color:#e1e4e8;">ui_print <msg></span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> imprima <msg> no console</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> Evite usar 'echo', pois ele não será exibido no console de recuperação personalizado</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"></span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">abort <msg></span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> imprima mensagem de erro <msg> para consolar e encerrar a instalação</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> Evite usar 'exit', pois isso irá pular as etapas de limpeza de encerramento</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"></span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">set_perm <target> <owner> <group> <permission> [context]</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> se [context] não estiver definido, o padrão é "u:object_r:system_file:s0"</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> esta função é uma abreviação para os seguintes comandos:</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> chown owner.group target</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> chmod permission target</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> chcon context target</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"></span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">set_perm_recursive <directory> <owner> <group> <dirpermission> <filepermission> [context]</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> se [context] não está definido, o padrão é "u:object_r:system_file:s0"</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> para todos os arquivos em <directory>, ele chamará:</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> contexto de permissão de arquivo do grupo proprietário do arquivo set_perm</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> para todos os diretórios em <directory> (including itself), ele vai ligar:</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> set_perm dir owner group dirpermission context</span></span></code></pre><pre class="shiki github-light vp-code-light"><code><span class="line"><span style="color:#24292e;">ui_print <msg></span></span>
|
||
<span class="line"><span style="color:#24292e;"> imprima <msg> no console</span></span>
|
||
<span class="line"><span style="color:#24292e;"> Evite usar 'echo', pois ele não será exibido no console de recuperação personalizado</span></span>
|
||
<span class="line"><span style="color:#24292e;"></span></span>
|
||
<span class="line"><span style="color:#24292e;">abort <msg></span></span>
|
||
<span class="line"><span style="color:#24292e;"> imprima mensagem de erro <msg> para consolar e encerrar a instalação</span></span>
|
||
<span class="line"><span style="color:#24292e;"> Evite usar 'exit', pois isso irá pular as etapas de limpeza de encerramento</span></span>
|
||
<span class="line"><span style="color:#24292e;"></span></span>
|
||
<span class="line"><span style="color:#24292e;">set_perm <target> <owner> <group> <permission> [context]</span></span>
|
||
<span class="line"><span style="color:#24292e;"> se [context] não estiver definido, o padrão é "u:object_r:system_file:s0"</span></span>
|
||
<span class="line"><span style="color:#24292e;"> esta função é uma abreviação para os seguintes comandos:</span></span>
|
||
<span class="line"><span style="color:#24292e;"> chown owner.group target</span></span>
|
||
<span class="line"><span style="color:#24292e;"> chmod permission target</span></span>
|
||
<span class="line"><span style="color:#24292e;"> chcon context target</span></span>
|
||
<span class="line"><span style="color:#24292e;"></span></span>
|
||
<span class="line"><span style="color:#24292e;">set_perm_recursive <directory> <owner> <group> <dirpermission> <filepermission> [context]</span></span>
|
||
<span class="line"><span style="color:#24292e;"> se [context] não está definido, o padrão é "u:object_r:system_file:s0"</span></span>
|
||
<span class="line"><span style="color:#24292e;"> para todos os arquivos em <directory>, ele chamará:</span></span>
|
||
<span class="line"><span style="color:#24292e;"> contexto de permissão de arquivo do grupo proprietário do arquivo set_perm</span></span>
|
||
<span class="line"><span style="color:#24292e;"> para todos os diretórios em <directory> (including itself), ele vai ligar:</span></span>
|
||
<span class="line"><span style="color:#24292e;"> set_perm dir owner group dirpermission context</span></span></code></pre></div><h2 id="scripts-de-inicializacao" tabindex="-1">Scripts de inicialização <a class="header-anchor" href="#scripts-de-inicializacao" aria-label="Permalink to "Scripts de inicialização""></a></h2><p>No KernelSU, os scripts são divididos em dois tipos com base em seu modo de execução: modo post-fs-data e modo de serviço late_start:</p><ul><li>modo post-fs-data <ul><li>Esta etapa está BLOQUEANDO. O processo de inicialização é pausado antes da execução ser concluída ou 10 segundos se passaram.</li><li>Os scripts são executados antes de qualquer módulo ser montado. Isso permite que um desenvolvedor de módulo ajuste dinamicamente seus módulos antes de serem montados.</li><li>Este estágio acontece antes do início do Zygote, o que significa praticamente tudo no Android.</li><li><strong>AVISO:</strong> Usar <code>setprop</code> irá bloquear o processo de inicialização! Por favor, use <code>resetprop -n <prop_name> <prop_value></code> em vez disso.</li><li><strong>Execute scripts neste modo apenas se necessário.</strong></li></ul></li><li>modo de serviço late_start <ul><li>Esta etapa é SEM BLOQUEIO. Seu script é executado em paralelo com o restante do processo de inicialização.</li><li><strong>Este é o estágio recomendado para executar a maioria dos scripts</strong>.</li></ul></li></ul><p>No KernelSU, os scripts de inicialização são divididos em dois tipos com base no local de armazenamento: scripts gerais e scripts de módulo:</p><ul><li>Scripts gerais <ul><li>Colocado em <code>/data/adb/post-fs-data.d</code>, <code>/data/adb/service.d</code>, <code>/data/adb/post-mount.d</code> ou <code>/data/adb/boot-completed.d</code>.</li><li>Somente executado se o script estiver definido como executável (<code>chmod +x script.sh</code>).</li><li>Os scripts em <code>post-fs-data.d</code> são executados no modo post-fs-data e os scripts em <code>service.d</code> são executados no modo de serviço late_start.</li><li>Os módulos <strong>NÃO</strong> devem adicionar scripts gerais durante a instalação.</li></ul></li><li>Scripts de módulo <ul><li>Colocado na própria pasta do módulo.</li><li>Executado apenas se o módulo estiver ativado.</li><li><code>post-fs-data.sh</code> é executado no modo post-fs-data, <code>service.sh</code> é executado no modo de serviço late_start, <code>boot-completed.sh</code> é executado na inicialização concluída e <code>post-mount.sh</code> é executado em overlayfs montado.</li></ul></li></ul><p>Todos os scripts de inicialização serão executados no shell BusyBox <code>ash</code> do KernelSU com o "Modo Autônomo" ativado.</p>`,58),t=[l];function p(i,r,c,d,u,m){return s(),a("div",null,t)}const g=e(n,[["render",p]]);export{v as __pageData,g as default};
|