Skip to content

Instantly share code, notes, and snippets.

@ricardoleme
Created April 26, 2023 13:06
Show Gist options
  • Select an option

  • Save ricardoleme/6fef4b2a32df9d33c3d7b91046ff9d17 to your computer and use it in GitHub Desktop.

Select an option

Save ricardoleme/6fef4b2a32df9d33c3d7b91046ff9d17 to your computer and use it in GitHub Desktop.
Gerando APK local com o novo EAS do Expo

Para gerar um APK local com o novo EAS do Expo:

  1. Instale o eas-cli de forma Global via npm (o Expo nΓ£o recomenda o uso do Yarn para pacotes globaisπŸ˜ͺ)
npm install -g eas-cli
  1. FaΓ§a o login na sua conta Expo
eas login
  1. Gere o arquivo de configuraΓ§Γ£o (eas.json)
eas build:configure
  1. Substitua o arquivo gerado pelo conteΓΊdo abaixo:
{
  "build": {
    "preview": {
      "android": {
        "buildType": "apk"
      }
    },
    "preview2": {
      "android": {
        "gradleCommand": ":app:assembleRelease"
      }
    },
    "preview3": {
      "developmentClient": true
    },
    "production": {}
  }
}
  1. Gere o APK
eas build -p android --profile preview
  1. Caso faΓ§a alguma alteraΓ§Γ£o no cΓ³digo fonte, basta repetir o passo 5 para gerar novamente a APK.
@fallsdevil
Copy link

oi, me tira uma dΓΊvida? sou novo nisso e queria saber como configuro o android studio pra fazer um apk em arm32?

@ricardoleme
Copy link
Author

como configuro o android studio pra fazer um apk em arm32?

Para configurar o Android Studio e gerar um APK para dispositivos com arquitetura ARM32 (armeabi-v7a), vocΓͺ pode seguir os passos abaixo:

Passo 1: Configurar o build.gradle

Primeiro, vocΓͺ precisa configurar o arquivo build.gradle da sua aplicaΓ§Γ£o para garantir que o APK seja compatΓ­vel com a arquitetura ARM32. VΓ‘ atΓ© o arquivo app/build.gradle e adicione a configuraΓ§Γ£o da seguinte maneira:

android {
    ...
    defaultConfig {
        ...
        ndk {
            abiFilters 'armeabi-v7a'
        }
    }
}

Essa linha (abiFilters 'armeabi-v7a') garante que o APK seja compilado especificamente para ARM32. Caso queira suportar mΓΊltiplas arquiteturas (por exemplo, ARM64 ou x86), vocΓͺ pode adicionar outros valores ao filtro, como 'arm64-v8a' ou 'x86', mas aqui estamos focando na ARM32.

Passo 2: Verificar dependΓͺncias nativas (opcional)

Se o seu aplicativo utiliza bibliotecas nativas (C/C++ via NDK), Γ© importante garantir que essas bibliotecas tambΓ©m estejam compiladas para ARM32. VocΓͺ pode checar isso no diretΓ³rio jniLibs do seu projeto, onde as bibliotecas nativas devem estar organizadas em pastas por arquitetura (por exemplo, jniLibs/armeabi-v7a).

Passo 3: Gerar o APK

Depois de configurar o build.gradle, vocΓͺ pode seguir os passos abaixo para gerar o APK:

  1. No Android Studio, vΓ‘ ao menu Build e selecione Build Bundle(s) / APK(s).
  2. Escolha a opΓ§Γ£o Build APK(s).
  3. Aguarde o Android Studio gerar o APK.
  4. Quando a compilaΓ§Γ£o terminar, uma notificaΓ§Γ£o aparecerΓ‘ com a opΓ§Γ£o de visualizar o APK gerado.

Passo 4: Verificar a arquitetura do APK

ApΓ³s a geraΓ§Γ£o do APK, Γ© uma boa prΓ‘tica verificar se ele foi realmente compilado para a arquitetura correta (ARM32). Isso pode ser feito usando o seguinte comando no terminal, dentro do diretΓ³rio onde o APK foi gerado:

aapt dump badging app-release.apk | grep native-code

Esse comando mostrarΓ‘ as arquiteturas suportadas pelo APK. Verifique se armeabi-v7a estΓ‘ listado.

Passo 5: Assinar e alinhar o APK (opcional)

Se vocΓͺ pretende distribuir o APK para produΓ§Γ£o, lembre-se de assinΓ‘-lo e usar o zipalign:

  1. No Android Studio, vΓ‘ atΓ© Build > Generate Signed Bundle / APK.
  2. Siga o assistente para assinar o APK com a chave privada.

Esses passos devem te permitir gerar um APK para ARM32 (armeabi-v7a). Se precisar gerar versΓ΅es para outras arquiteturas no futuro, basta ajustar o filtro de ABI no build.gradle.

@jbmsantos0398
Copy link

@gabrilh804-netizenh
Copy link

/
β”œβ”€ app/
β”‚ β”œβ”€ src/
β”‚ β”‚ β”œβ”€ main/
β”‚ β”‚ β”‚ β”œβ”€ java/com/kali/ai/MainActivity.java
β”‚ β”‚ β”‚ β”œβ”€ res/layout/activity_main.xml
β”‚ β”‚ β”‚ β”œβ”€ AndroidManifest.xml
β”‚ β”‚ β”‚ └─ assets/kali/index.htmlpackage com.kali.ai;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.speech.tts.TextToSpeech;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import java.util.Locale;

public class MainActivity extends AppCompatActivity {

private WebView webView;
private TextToSpeech tts;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    webView = findViewById(R.id.webview);

    WebSettings ws = webView.getSettings();
    ws.setJavaScriptEnabled(true);
    ws.setDomStorageEnabled(true);
    ws.setAllowFileAccess(true);
    ws.setAllowContentAccess(true);

    webView.setWebChromeClient(new WebChromeClient());
    webView.loadUrl("file:///android_asset/kali/index.html");

    pedirPermissaoMicrofone();

    tts = new TextToSpeech(this, status -> {
        if (status == TextToSpeech.SUCCESS) {
            tts.setLanguage(new Locale("pt","BR"));
        }
    });
}

private void pedirPermissaoMicrofone() {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO)
            != PackageManager.PERMISSION_GRANTED) {

        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.RECORD_AUDIO}, 200);
    }
}

public void falarTexto(String texto){
    tts.speak(texto, TextToSpeech.QUEUE_FLUSH, null, null);
}

@Override
protected void onDestroy() {
    if (tts != null){
        tts.stop();
        tts.shutdown();
    }
    super.onDestroy();
}

}

<WebView
    android:id="@+id/webview"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>

<application
    android:theme="@style/Theme.AppCompat.DayNight.NoActionBar"
    android:label="KALI IA">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>
</application>

<title>KALI IA</title> <style> body { background-color: #080014; color: #C9AFFF; font-family: Arial; } #caixa { width: 90%; height: 70vh; margin: auto; overflow-y: scroll; border: 1px solid #6611FF; padding: 10px; border-radius: 12px; box-shadow: 0px 0px 20px #6611FF; } #entrada { width: 90%; margin: auto; margin-top: 20px; } input { width: 80%; padding: 15px; border-radius: 10px; background-color: #1F0033; border: 1px solid #6611FF; color: #fff; font-size: 18px; } button { padding: 15px; border: none; background-color: #6611FF; color: white; border-radius: 10px; font-size: 16px; } </style>

πŸ”₯ KALI IA β€” Sistema Inteligente Completo πŸ”₯

Enviar
<script> function enviar() { let msg = document.getElementById("msg").value; if(msg.trim() === "") return; let caixa = document.getElementById("caixa"); caixa.innerHTML += "

VocΓͺ: " + msg + "

"; fetch("https://api.openai.com/v1/chat/completions", { method:"POST", headers:{ "Content-Type":"application/json", "Authorization":"Bearer SUA_CHAVE_AQUI" }, body:JSON.stringify({ model:"gpt-5.1", messages:[{role:"user",content:msg}] }) }) .then(r=>r.json()) .then(d=>{ let resposta = d.choices[0].message.content; caixa.innerHTML += "

KALI IA: " + resposta + "

"; }); } </script>

@gabrilh804-netizenh
Copy link

/
β”œβ”€ app/
β”‚ β”œβ”€ src/
β”‚ β”‚ β”œβ”€ main/
β”‚ β”‚ β”‚ β”œβ”€ java/com/kali/ai/MainActivity.java
β”‚ β”‚ β”‚ β”œβ”€ res/layout/activity_main.xml
β”‚ β”‚ β”‚ β”œβ”€ AndroidManifest.xml
β”‚ β”‚ β”‚ └─ assets/kali/index.htmlpackage com.kali.ai;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.speech.tts.TextToSpeech;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import java.util.Locale;

public class MainActivity extends AppCompatActivity {

private WebView webView;
private TextToSpeech tts;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    webView = findViewById(R.id.webview);

    WebSettings ws = webView.getSettings();
    ws.setJavaScriptEnabled(true);
    ws.setDomStorageEnabled(true);
    ws.setAllowFileAccess(true);
    ws.setAllowContentAccess(true);

    webView.setWebChromeClient(new WebChromeClient());
    webView.loadUrl("file:///android_asset/kali/index.html");

    pedirPermissaoMicrofone();

    tts = new TextToSpeech(this, status -> {
        if (status == TextToSpeech.SUCCESS) {
            tts.setLanguage(new Locale("pt","BR"));
        }
    });
}

private void pedirPermissaoMicrofone() {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO)
            != PackageManager.PERMISSION_GRANTED) {

        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.RECORD_AUDIO}, 200);
    }
}

public void falarTexto(String texto){
    tts.speak(texto, TextToSpeech.QUEUE_FLUSH, null, null);
}

@Override
protected void onDestroy() {
    if (tts != null){
        tts.stop();
        tts.shutdown();
    }
    super.onDestroy();
}

}

<WebView
    android:id="@+id/webview"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>

<application
    android:theme="@style/Theme.AppCompat.DayNight.NoActionBar"
    android:label="KALI IA">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>
</application>

<title>KALI IA</title> <style> body { background-color: #080014; color: #C9AFFF; font-family: Arial; } #caixa { width: 90%; height: 70vh; margin: auto; overflow-y: scroll; border: 1px solid #6611FF; padding: 10px; border-radius: 12px; box-shadow: 0px 0px 20px #6611FF; } #entrada { width: 90%; margin: auto; margin-top: 20px; } input { width: 80%; padding: 15px; border-radius: 10px; background-color: #1F0033; border: 1px solid #6611FF; color: #fff; font-size: 18px; } button { padding: 15px; border: none; background-color: #6611FF; color: white; border-radius: 10px; font-size: 16px; } </style>

πŸ”₯ KALI IA β€” Sistema Inteligente Completo πŸ”₯

Enviar
<script> function enviar() { let msg = document.getElementById("msg").value; if(msg.trim() === "") return; let caixa = document.getElementById("caixa"); caixa.innerHTML += "

VocΓͺ: " + msg + "

"; fetch("https://api.openai.com/v1/chat/completions", { method:"POST", headers:{ "Content-Type":"application/json", "Authorization":"Bearer SUA_CHAVE_AQUI" }, body:JSON.stringify({ model:"gpt-5.1", messages:[{role:"user",content:msg}] }) }) .then(r=>r.json()) .then(d=>{ let resposta = d.choices[0].message.content; caixa.innerHTML += "

KALI IA: " + resposta + "

"; }); } </script>

@gabrilh804-netizenh
Copy link

/ β”œβ”€ app/ β”‚ β”œβ”€ src/ β”‚ β”‚ β”œβ”€ main/ β”‚ β”‚ β”‚ β”œβ”€ java/com/kali/ai/MainActivity.java β”‚ β”‚ β”‚ β”œβ”€ res/layout/activity_main.xml β”‚ β”‚ β”‚ β”œβ”€ AndroidManifest.xml β”‚ β”‚ β”‚ └─ assets/kali/index.htmlpackage com.kali.ai;

import android.Manifest; import android.content.pm.PackageManager; import android.os.Bundle; import android.speech.tts.TextToSpeech; import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebView;

import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat;

import java.util.Locale;

public class MainActivity extends AppCompatActivity {

private WebView webView;
private TextToSpeech tts;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    webView = findViewById(R.id.webview);

    WebSettings ws = webView.getSettings();
    ws.setJavaScriptEnabled(true);
    ws.setDomStorageEnabled(true);
    ws.setAllowFileAccess(true);
    ws.setAllowContentAccess(true);

    webView.setWebChromeClient(new WebChromeClient());
    webView.loadUrl("file:///android_asset/kali/index.html");

    pedirPermissaoMicrofone();

    tts = new TextToSpeech(this, status -> {
        if (status == TextToSpeech.SUCCESS) {
            tts.setLanguage(new Locale("pt","BR"));
        }
    });
}

private void pedirPermissaoMicrofone() {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO)
            != PackageManager.PERMISSION_GRANTED) {

        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.RECORD_AUDIO}, 200);
    }
}

public void falarTexto(String texto){
    tts.speak(texto, TextToSpeech.QUEUE_FLUSH, null, null);
}

@Override
protected void onDestroy() {
    if (tts != null){
        tts.stop();
        tts.shutdown();
    }
    super.onDestroy();
}

}

<WebView
    android:id="@+id/webview"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>

<application
    android:theme="@style/Theme.AppCompat.DayNight.NoActionBar"
    android:label="KALI IA">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>
</application>
<title>KALI IA</title> <style> body { background-color: #080014; color: #C9AFFF; font-family: Arial; } #caixa { width: 90%; height: 70vh; margin: auto; overflow-y: scroll; border: 1px solid #6611FF; padding: 10px; border-radius: 12px; box-shadow: 0px 0px 20px #6611FF; } #entrada { width: 90%; margin: auto; margin-top: 20px; } input { width: 80%; padding: 15px; border-radius: 10px; background-color: #1F0033; border: 1px solid #6611FF; color: #fff; font-size: 18px; } button { padding: 15px; border: none; background-color: #6611FF; color: white; border-radius: 10px; font-size: 16px; } </style> ## πŸ”₯ KALI IA β€” Sistema Inteligente Completo πŸ”₯ Enviar <script> function enviar() { let msg = document.getElementById("msg").value; if(msg.trim() === "") return; let caixa = document.getElementById("caixa"); caixa.innerHTML += " VocΓͺ: " + msg + "

"; fetch("https://api.openai.com/v1/chat/completions", { method:"POST", headers:{ "Content-Type":"application/json", "Authorization":"Bearer SUA_CHAVE_AQUI" }, body:JSON.stringify({ model:"gpt-5.1", messages:[{role:"user",content:msg}] }) }) .then(r=>r.json()) .then(d=>{ let resposta = d.choices[0].message.content; caixa.innerHTML += "
KALI IA: " + resposta + "

"; }); } </script>

@gabrilh804-netizenh
Copy link

/ β”œβ”€ app/ β”‚ β”œβ”€ src/ β”‚ β”‚ β”œβ”€ main/ β”‚ β”‚ β”‚ β”œβ”€ java/com/kali/ai/MainActivity.java β”‚ β”‚ β”‚ β”œβ”€ res/layout/activity_main.xml β”‚ β”‚ β”‚ β”œβ”€ AndroidManifest.xml β”‚ β”‚ β”‚ └─ assets/kali/index.htmlpackage com.kali.ai;
import android.Manifest; import android.content.pm.PackageManager; import android.os.Bundle; import android.speech.tts.TextToSpeech; import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebView;
import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat;
import java.util.Locale;
public class MainActivity extends AppCompatActivity {

private WebView webView;
private TextToSpeech tts;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    webView = findViewById(R.id.webview);

    WebSettings ws = webView.getSettings();
    ws.setJavaScriptEnabled(true);
    ws.setDomStorageEnabled(true);
    ws.setAllowFileAccess(true);
    ws.setAllowContentAccess(true);

    webView.setWebChromeClient(new WebChromeClient());
    webView.loadUrl("file:///android_asset/kali/index.html");

    pedirPermissaoMicrofone();

    tts = new TextToSpeech(this, status -> {
        if (status == TextToSpeech.SUCCESS) {
            tts.setLanguage(new Locale("pt","BR"));
        }
    });
}

private void pedirPermissaoMicrofone() {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO)
            != PackageManager.PERMISSION_GRANTED) {

        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.RECORD_AUDIO}, 200);
    }
}

public void falarTexto(String texto){
    tts.speak(texto, TextToSpeech.QUEUE_FLUSH, null, null);
}

@Override
protected void onDestroy() {
    if (tts != null){
        tts.stop();
        tts.shutdown();
    }
    super.onDestroy();
}

}

<WebView
    android:id="@+id/webview"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>

<application
    android:theme="@style/Theme.AppCompat.DayNight.NoActionBar"
    android:label="KALI IA">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>
</application>
<title>KALI IA</title> <style> body { background-color: #080014; color: #C9AFFF; font-family: Arial; } #caixa { width: 90%; height: 70vh; margin: auto; overflow-y: scroll; border: 1px solid #6611FF; padding: 10px; border-radius: 12px; box-shadow: 0px 0px 20px #6611FF; } #entrada { width: 90%; margin: auto; margin-top: 20px; } input { width: 80%; padding: 15px; border-radius: 10px; background-color: #1F0033; border: 1px solid #6611FF; color: #fff; font-size: 18px; } button { padding: 15px; border: none; background-color: #6611FF; color: white; border-radius: 10px; font-size: 16px; } </style> ## πŸ”₯ KALI IA β€” Sistema Inteligente Completo πŸ”₯ Enviar <script> function enviar() { let msg = document.getElementById("msg").value; if(msg.trim() === "") return; let caixa = document.getElementById("caixa"); caixa.innerHTML += " VocΓͺ: " + msg + " "; fetch("https://api.openai.com/v1/chat/completions", { method:"POST", headers:{ "Content-Type":"application/json", "Authorization":"Bearer SUA_CHAVE_AQUI" }, body:JSON.stringify({ model:"gpt-5.1", messages:[{role:"user",content:msg}] }) }) .then(r=>r.json()) .then(d=>{ let resposta = d.choices[0].message.content; caixa.innerHTML += " KALI IA: " + resposta + " "; }); } </script>

Uploading Screenshot_20251205-163305.jpg…

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment