\n

Hang up… please wait, we're loading

Stage 6 of 7

Android App

Turn your website into a real Android app — 4 different methods for 2026. From zero-code TWA to full React Native.

~5 hours
Intermediate → Advanced
Play Store Ready
Device Mode Active Nexray Stage 6: Android & Mobile Apps — your interactive learning companion
Pro Tip

Web skills translate directly to mobile — same languages, new canvas.

4 Ways to Build an Android App in 2026

React Nativeor Capacitor

Web to Android: The Methods

There are multiple paths from web to mobile app — Progressive Web Apps, TWA wrappers, Capacitor hybrid apps, and full React Native. Choose the right one for your project.

  • PWA: zero app store, instant install
  • TWA: Chrome wrapper on Play Store
  • Capacitor: web app with native APIs
  • React Native: full native experience

You don't need to learn Kotlin or Java to build an Android app as a web developer. Here are your options ranked from easiest to most powerful:

Method Difficulty Native Features Best For
TWA Very Easy Limited PWA websites, content sites
PWA + Bubblewrap Easy Moderate Existing PWA → Play Store
Capacitor Medium Full access Web apps needing native APIs
React Native Hard Full native Complex apps, best performance

Method 1: TWA (Trusted Web Activity)

TWA wraps your website in an Android app shell. The user sees your website — no fake UI. If you have a PWA with 90+ Lighthouse score, this is the fastest path to the Play Store.

Requirements for TWA
Your website must: (1) Be served over HTTPS, (2) Have a valid web manifest, (3) Have a service worker, (4) Score 80+ on Lighthouse, (5) Add a /.well-known/assetlinks.json file linking the app to your domain.
BASH — Bubblewrap CLI (Google's official TWA tool)
# Install Bubblewrap (requires Java 8+ and Android SDK)
npm install -g @bubblewrap/cli

# Initialize from your PWA's manifest URL
bubblewrap init --manifest https://yoursite.com/manifest.json

# This creates an Android project. Build it:
bubblewrap build

# Output: app-release-bundle.aab (upload to Play Store)
#         app-release-signed.apk (install directly)

# Update after making changes to your PWA:
bubblewrap update
bubblewrap build
JSON — /.well-known/assetlinks.json
// Host this file at: https://yourdomain.com/.well-known/assetlinks.json
// Replace YOUR_SHA_CERT with the fingerprint from your keystore
[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.yourcompany.yourapp",
    "sha256_cert_fingerprints": [
      "AA:BB:CC:DD:EE:FF:..."
    ]
  }
}]

📲 Method 2: PWA to Android

Modern Android (Chrome 94+) lets users "Install" your PWA directly to their home screen — it looks and feels like a real app. No Play Store needed for distribution!

JavaScript — PWA Install Prompt
// Capture the install prompt event
let deferredPrompt;

window.addEventListener('beforeinstallprompt', (e) => {
  e.preventDefault();
  deferredPrompt = e;

  // Show your custom install button
  document.getElementById('install-btn').style.display = 'block';
});

document.getElementById('install-btn')
  .addEventListener('click', async () => {
    if (!deferredPrompt) return;
    deferredPrompt.prompt(); // show install dialog
    const { outcome } = await deferredPrompt.userChoice;
    console.log('User choice:', outcome); // 'accepted' or 'dismissed'
    deferredPrompt = null;
  });

// Detect if already installed
window.addEventListener('appinstalled', () => {
  console.log('App installed!');
  document.getElementById('install-btn').style.display = 'none';
});

Method 3: Capacitor (Recommended for Web Devs)

Capacitor (by Ionic) wraps your web app in a native shell with access to device APIs — camera, GPS, notifications, file system, contacts, and more. Write web code, get native features.

BASH — Capacitor Setup
# Install Capacitor in your existing web project
npm install @capacitor/core @capacitor/cli

# Initialize (sets up capacitor.config.ts)
npx cap init "My App" "com.mycompany.myapp" --web-dir=dist

# Add Android platform
npm install @capacitor/android
npx cap add android

# Build your web app first
npm run build

# Sync web files to Android project
npx cap sync android

# Open in Android Studio
npx cap open android

# (In Android Studio: Run → connected device or emulator)

# After changes: sync + refresh
npm run build && npx cap sync android
JavaScript — Capacitor Native APIs
// Install plugins as needed:
// npm install @capacitor/camera @capacitor/geolocation @capacitor/push-notifications

import { Camera, CameraResultType, CameraSource } from '@capacitor/camera';
import { Geolocation } from '@capacitor/geolocation';
import { PushNotifications } from '@capacitor/push-notifications';

// Take a photo with the camera
async function takePhoto() {
  const photo = await Camera.getPhoto({
    quality: 90,
    allowEditing: false,
    resultType: CameraResultType.DataUrl,
    source: CameraSource.Camera
  });

  // photo.dataUrl is a base64 image string
  document.getElementById('preview').src = photo.dataUrl;
}

// Get user's GPS location
async function getLocation() {
  const position = await Geolocation.getCurrentPosition();
  return {
    lat: position.coords.latitude,
    lng: position.coords.longitude,
  };
}

// Push notifications setup
async function setupPushNotifications() {
  const permission = await PushNotifications.requestPermissions();
  if (permission.receive === 'granted') {
    await PushNotifications.register();
  }

  PushNotifications.addListener('registration', (token) => {
    console.log('FCM Token:', token.value);
    // Save this token to your backend to send notifications
  });
}

// Check if running as native app vs browser
import { Capacitor } from '@capacitor/core';
if (Capacitor.isNativePlatform()) {
  console.log('Running as native app');
  console.log('Platform:', Capacitor.getPlatform()); // 'android' | 'ios' | 'web'
}

⚛️ Method 4: React Native (Full Native)

React Native compiles to actual native Android components — not a WebView. Maximum performance, maximum native access. Uses React syntax but different components.

BASH — React Native Setup (Expo)
# Expo is the recommended way to start in 2026
npx create-expo-app@latest MyApp
cd MyApp

# Run on Android emulator or physical device
npx expo run:android

# Or use Expo Go app (fastest for dev)
npx expo start
# → Scan QR code with Expo Go app on your phone

# Build production APK/AAB
eas build --platform android --profile production
JSX — React Native Components
import React, { useState } from 'react';
import {
  View, Text, StyleSheet, TouchableOpacity,
  FlatList, TextInput, Image, ScrollView
} from 'react-native';

export default function HomeScreen() {
  const [text, setText] = useState('');

  return (
    <ScrollView style={styles.container}>
      <Text style={styles.title}>My App </Text>

      <TextInput
        style={styles.input}
        placeholder="Type something..."
        value={text}
        onChangeText={setText}
      />

      <TouchableOpacity
        style={styles.btn}
        onPress={() => alert(`You typed: ${text}`)}
      >
        <Text style={styles.btnText}>Submit</Text>
      </TouchableOpacity>
    </ScrollView>
  );
}

const styles = StyleSheet.create({
  container: { flex: 1, backgroundColor: '#0a0a0f', padding: 24 },
  title:     { fontSize: 32, fontWeight: '900', color: '#f8fafc' },
  input:     { backgroundColor: '#1a1a2e', color: '#fff', padding: 12, borderRadius: 8, marginTop: 16 },
  btn:       { backgroundColor: '#0038FF', padding: 14, borderRadius: 8, marginTop: 12 },
  btnText:   { color: '#fff', fontWeight: '700', textAlign: 'center' },
});

🏪 Google Play Store Submission

1

Create Google Play Developer Account

Go to play.google.com/console → Pay $25 one-time registration fee → Complete account details.

2

Create New App

Play Console → "Create app" → Fill: app name, category, free/paid, content ratings. This creates your app's listing.

3

Build Release AAB

Build a signed Android App Bundle (.aab). For Capacitor: in Android Studio → Build → Generate Signed Bundle. For Expo: eas build --platform android.

4

Upload to Internal Testing

Play Console → Testing → Internal testing → Create release → Upload .aab → Add testers. Test before going public.

5

Complete Store Listing

Add: app description, screenshots (min 2, at least 1080px), feature graphic (1024x500), short description, full description, privacy policy URL (required).

6

Submit for Review

Play Console → Production → Create release → Upload → Review → Submit. Review takes 1-7 days for new apps.

🔐 App Signing & Release

BASH — Generate Keystore (required for signing)
# Generate a keystore (save this file SECURELY — you need it forever)
keytool -genkey -v \
  -keystore my-release-key.jks \
  -keyalg RSA \
  -keysize 2048 \
  -validity 10000 \
  -alias my-key-alias

# You'll be asked for a password and your identity info
# NEVER lose this file or its password - you can't update your app without it

# Get SHA-256 fingerprint (for assetlinks.json)
keytool -list -v -keystore my-release-key.jks -alias my-key-alias
⚠️
Use Google Play App Signing
Enable "Google Play App Signing" in Play Console — Google stores your production key securely. You only need to keep your upload key. This prevents catastrophic data loss if your local keystore is lost.

Deep links let you open your app from URLs — e.g., clicking a link in an email opens directly in the app, not the browser.

React Native — Deep Links with Expo
// app.json — configure URL scheme
{
  "expo": {
    "scheme": "myapp",  // opens app via myapp://
    "intentFilters": [{  // Android App Links (https://)
      "action": "VIEW",
      "autoVerify": true,
      "data": [{ "scheme": "https", "host": "yoursite.com" }],
      "category": ["BROWSABLE", "DEFAULT"]
    }]
  }
}

// Handle deep link in app (React Navigation)
const linking = {
  prefixes: ['myapp://', 'https://yoursite.com'],
  config: {
    screens: {
      Home: '',
      Profile: 'profile/:userId',
      Product: 'products/:id',
    }
  }
};

Stage 6 Project: App Store Published App

Take your Stage 3 blog and convert it using Capacitor
Add camera functionality (profile picture upload)
Add push notifications for new posts
Set up deep links from web → app
Build signed APK and install on a real device
(Bonus) Submit to Internal Testing on Play Console
PreviousStage 5 — Pro Secrets