Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- How to Create an Android App Without Android Studio (SDK 14–35, Manual Gradle Setup)
- ==============================
- ANDROID WEBVIEW APP (MANUAL)
- SDK 14 → 35 | NO ANDROID STUDIO
- GRADLE VIA SDKMAN
- ==============================
- 1. CREATE PROJECT DIRECTORY
- ---------------------------
- $ mkdir WebLinkApp
- $ cd WebLinkApp
- About:
- Root folder for the Android project.
- 2. INSTALL SDKMAN (FOR GRADLE)
- ------------------------------
- $ curl -s "https://get.sdkman.io" | bash
- About:
- SDKMAN is used to manage Gradle versions cleanly.
- 3. ENABLE SDKMAN
- ----------------
- $ nano ~/.profile
- $ nano ~/.bashrc
- Add at bottom (if missing):
- ---------------------------
- source "$HOME/.sdkman/bin/sdkman-init.sh"
- ---------------------------
- Apply:
- $ source ~/.bashrc
- Verify:
- $ sdk version
- About:
- Without this, `sdk` command will not work.
- 4. INSTALL GRADLE 8.4
- ---------------------
- $ sdk install gradle 8.4
- Verify:
- $ gradle -v
- About:
- Gradle 8.4 is compatible with modern Android plugins.
- 5. CREATE GRADLE WRAPPER
- -----------------------
- $ gradle wrapper
- About:
- Creates ./gradlew and gradle/wrapper files.
- 6. CREATE PROJECT STRUCTURE
- ---------------------------
- $ mkdir app
- $ mkdir -p app/src/main/java
- $ mkdir -p app/src/main/res/values
- $ mkdir -p app/src/main/res/layout
- About:
- Manual Android projects require this structure.
- 7. CREATE settings.gradle
- -------------------------
- $ nano settings.gradle
- Paste:
- -------------------------
- rootProject.name = "WebLinkApp"
- include(":app")
- -------------------------
- About:
- Registers the app module.
- 8. CREATE ROOT build.gradle
- ---------------------------
- $ nano build.gradle
- Paste:
- -------------------------
- buildscript {
- repositories {
- google()
- mavenCentral()
- }
- }
- allprojects {
- repositories {
- google()
- mavenCentral()
- }
- }
- -------------------------
- About:
- Defines dependency repositories.
- 9. CREATE gradle.properties
- ---------------------------
- $ nano gradle.properties
- Paste:
- -------------------------
- org.gradle.jvmargs=-Xmx2048m
- android.useAndroidX=true
- android.enableJetifier=true
- -------------------------
- About:
- Required for AndroidX and memory config.
- 10. CREATE app/build.gradle
- ---------------------------
- $ nano app/build.gradle
- Paste:
- -------------------------
- plugins {
- id 'com.android.application'
- }
- android {
- namespace "com.linktoapp.app"
- compileSdk 35
- defaultConfig {
- applicationId "com.linktoapp.app"
- minSdk 14
- targetSdk 35
- versionCode 1
- versionName "1.0"
- }
- buildTypes {
- release {
- minifyEnabled false
- }
- }
- compileOptions {
- sourceCompatibility JavaVersion.VERSION_17
- targetCompatibility JavaVersion.VERSION_17
- }
- }
- dependencies {
- implementation "androidx.appcompat:appcompat:1.6.1"
- }
- -------------------------
- About:
- Main Android build configuration.
- 11. CREATE AndroidManifest.xml
- ------------------------------
- $ nano app/src/main/AndroidManifest.xml
- Paste:
- -------------------------
- <manifest xmlns:android="http://schemas.android.com/apk/res/android">
- <application
- android:label="@string/app_name"
- android:theme="@style/Theme.AppCompat.NoActionBar">
- <activity
- android:name=".MainActivity"
- android:exported="true">
- <intent-filter>
- <action android:name="android.intent.action.MAIN"/>
- <category android:name="android.intent.category.LAUNCHER"/>
- </intent-filter>
- </activity>
- </application>
- </manifest>
- -------------------------
- About:
- Do NOT use package="" here.
- 12. CREATE strings.xml
- ----------------------
- $ nano app/src/main/res/values/strings.xml
- Paste:
- -------------------------
- <resources>
- <string name="app_name">Web Link App</string>
- </resources>
- -------------------------
- About:
- Fixes app_name resource error.
- 13. CREATE LAYOUT FILE
- ----------------------
- $ nano app/src/main/res/layout/activity_main.xml
- Paste:
- -------------------------
- <?xml version="1.0" encoding="utf-8"?>
- <WebView xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/webview"
- android:layout_width="match_parent"
- android:layout_height="match_parent"/>
- -------------------------
- About:
- Fullscreen WebView.
- 14. CREATE JAVA PACKAGE
- -----------------------
- $ mkdir -p app/src/main/java/com/linktoapp/app
- $ nano app/src/main/java/com/linktoapp/app/MainActivity.java
- Paste:
- -------------------------
- package com.linktoapp.app;
- import android.os.Bundle;
- import android.webkit.WebView;
- import android.webkit.WebViewClient;
- import androidx.appcompat.app.AppCompatActivity;
- public class MainActivity extends AppCompatActivity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- WebView webView = new WebView(this);
- setContentView(webView);
- webView.getSettings().setJavaScriptEnabled(true);
- webView.setWebViewClient(new WebViewClient());
- webView.loadUrl("https://example.com");
- }
- }
- -------------------------
- About:
- Change URL here to change the loaded link.
- 15. BUILD RELEASE APK
- ---------------------
- $ ./gradlew clean assembleRelease
- Output:
- -------------------------
- app/build/outputs/apk/release/
- -------------------------
- 16. CREATE KEYSTORE
- -------------------
- $ keytool -genkeypair -v \
- -keystore mykey.jks \
- -keyalg RSA \
- -keysize 2048 \
- -validity 10000 \
- -alias mykey
- About:
- Used for manual APK signing.
- 17. SIGN APK (NO GRADLE)
- -----------------------
- $ apksigner sign \
- --ks mykey.jks \
- --ks-key-alias mykey \
- --out app-release-signed.apk \
- app-release-unsigned.apk
- 18. ZIPALIGN APK
- ----------------
- $ $ANDROID_SDK_ROOT/build-tools/34.0.0/zipalign -v 4 \
- app-release-signed.apk \
- app-release-final.apk
- 19. INSTALL APK
- ---------------
- $ adb install app-release-final.apk
- 20. CHANGE WEBSITE LINK
- ----------------------
- Edit:
- MainActivity.java
- Change:
- webView.loadUrl("https://yourlink.com");
- 21. CHANGE APP NAME
- ------------------
- Edit:
- app/src/main/res/values/strings.xml
- 22. CHANGE PACKAGE NAME
- ----------------------
- Edit:
- - namespace in app/build.gradle
- - applicationId in app/build.gradle
- - Java folder path
- - package line in MainActivity.java
- ==============================
- END OF GUIDE
- =====================================================================
- =====================================================================
- BASH SCRIPT TO CREATE PROJECT (copy it to app.sh) run to see help
- =====================================================================
- #!/usr/bin/env bash
- set -e
- clear='\033[0m'
- IGreen='\033[0;92m'
- IYellow='\033[0;93m'
- IRed='\033[0;91m'
- # -----------------------------
- # Arguments
- # -----------------------------
- PACKAGE_NAME="$1"
- APP_NAME="$2"
- SDK_VERSION="$3"
- JAVA_INPUT="$4"
- if [ $# -ne 4 ]; then
- echo
- echo -e "${IGreen}=======================================================${clear}"
- echo -e "${IGreen}==========${IYellow} CREATE CUSTOM ANDROID PROJECT ${IGreen}==========${clear}"
- echo -e "${IGreen}=======================================================${clear}"
- echo
- echo -e "Usage : ./app.sh <package> <appname> <sdk> <java>"
- echo -e "Example: ./app.sh com.abcd.game mygame 35 java17"
- echo -e "JAVA : java8 | java11 | java17 | java21"
- echo -e "SDK : 21+ (recommended 31–36)"
- echo
- exit 1
- fi
- # -----------------------------
- # Java version mapping
- # -----------------------------
- case "$JAVA_INPUT" in
- java8) JAVA_VERSION="1_8" ;;
- java11) JAVA_VERSION="11" ;;
- java17) JAVA_VERSION="17" ;;
- java21) JAVA_VERSION="21" ;;
- *)
- echo -e "${IRed}❌ Invalid Java version: $JAVA_INPUT${clear}"
- exit 1
- ;;
- esac
- # -----------------------------
- # Derived values
- # -----------------------------
- PACKAGE_PATH=$(echo "$PACKAGE_NAME" | tr '.' '/')
- PROJECT_ROOT="$APP_NAME"
- APP_MAIN="$PROJECT_ROOT/app/src/main"
- # -----------------------------
- # Create directories
- # -----------------------------
- mkdir -p "$APP_MAIN/java/$PACKAGE_PATH"
- mkdir -p "$APP_MAIN/res/values"
- mkdir -p "$PROJECT_ROOT/app"
- # -----------------------------
- # settings.gradle
- # -----------------------------
- cat > "$PROJECT_ROOT/settings.gradle" <<EOF
- rootProject.name = "$APP_NAME"
- include(":app")
- EOF
- # -----------------------------
- # Root build.gradle
- # -----------------------------
- cat > "$PROJECT_ROOT/build.gradle" <<EOF
- buildscript {
- repositories {
- google()
- mavenCentral()
- }
- dependencies {
- classpath "com.android.tools.build:gradle:8.3.2"
- }
- }
- allprojects {
- repositories {
- google()
- mavenCentral()
- }
- }
- EOF
- # -----------------------------
- # gradle.properties
- # -----------------------------
- cat > "$PROJECT_ROOT/gradle.properties" <<EOF
- org.gradle.jvmargs=-Xmx2g
- android.useAndroidX=true
- android.enableJetifier=true
- android.suppressUnsupportedCompileSdk=$SDK_VERSION
- EOF
- # -----------------------------
- # app/build.gradle
- # -----------------------------
- cat > "$PROJECT_ROOT/app/build.gradle" <<EOF
- plugins {
- id "com.android.application"
- }
- android {
- namespace "$PACKAGE_NAME"
- compileSdk $SDK_VERSION
- defaultConfig {
- applicationId "$PACKAGE_NAME"
- minSdk 21
- targetSdk $SDK_VERSION
- versionCode 1
- versionName "1.0"
- }
- compileOptions {
- sourceCompatibility JavaVersion.VERSION_$JAVA_VERSION
- targetCompatibility JavaVersion.VERSION_$JAVA_VERSION
- }
- }
- dependencies {
- }
- EOF
- # -----------------------------
- # AndroidManifest.xml (FIXED)
- # -----------------------------
- cat > "$APP_MAIN/AndroidManifest.xml" <<EOF
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="$PACKAGE_NAME">
- <application
- android:allowBackup="true"
- android:label="@string/app_name"
- android:theme="@style/Theme.App">
- <activity
- android:name=".MainActivity"
- android:exported="true">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- </application>
- </manifest>
- EOF
- # -----------------------------
- # MainActivity.java
- # -----------------------------
- cat > "$APP_MAIN/java/$PACKAGE_PATH/MainActivity.java" <<EOF
- package $PACKAGE_NAME;
- import android.app.Activity;
- import android.os.Bundle;
- import android.widget.TextView;
- public class MainActivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- TextView tv = new TextView(this);
- tv.setText("Hello from $APP_NAME");
- tv.setTextSize(20);
- setContentView(tv);
- }
- }
- EOF
- # -----------------------------
- # strings.xml
- # -----------------------------
- cat > "$APP_MAIN/res/values/strings.xml" <<EOF
- <resources>
- <string name="app_name">$APP_NAME</string>
- </resources>
- EOF
- # -----------------------------
- # themes.xml
- # -----------------------------
- cat > "$APP_MAIN/res/values/themes.xml" <<EOF
- <resources>
- <style name="Theme.App" parent="android:Theme.Material.Light.NoActionBar"/>
- </resources>
- EOF
- # -----------------------------
- # Done
- # -----------------------------
- echo
- echo -e "${IGreen}✔ Android project created successfully${clear}"
- echo -e "${IGreen}✔ Project : $APP_NAME${clear}"
- echo -e "${IGreen}✔ Package : $PACKAGE_NAME${clear}"
- echo -e "${IGreen}✔ SDK : $SDK_VERSION${clear}"
- echo -e "${IGreen}✔ Java : $JAVA_INPUT${clear}"
- echo
- =====================================================================
- BASH SCRIPT ENDS HERE!
- =====================================================================
Advertisement
Comments
-
- Please do not click on any link in the comment box. We may not be responsible for any kind of damage.
Add Comment
Please, Sign In to add comment