196 lines
5.6 KiB
Bash
196 lines
5.6 KiB
Bash
#!/data/data/com.termux/files/usr/bin/bash
|
|
set -e
|
|
|
|
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
AB_HOME="${ANDROID_BUILDER_HOME:-$HOME/android-builder}"
|
|
SDK="$HOME/android-sdk"
|
|
PLATFORM="${ANDROID_BUILDER_PLATFORM:-android-33}"
|
|
GRADLE_VERSION="${ANDROID_BUILDER_GRADLE_VERSION:-8.7}"
|
|
AGP_VERSION="${ANDROID_BUILDER_AGP_VERSION:-8.5.2}"
|
|
GRADLE_DISTRIBUTION_SHA256="${ANDROID_BUILDER_GRADLE_DISTRIBUTION_SHA256:-544c35d6bd849ae8a5ed0bcea39ba677dc40f49df7d1835561582da2009b961d}"
|
|
TEMPLATE_DIR="$ROOT_DIR/templates/gradle-wrapper"
|
|
|
|
ensure_termux() {
|
|
if [ -z "${PREFIX:-}" ] || [ ! -d "/data/data/com.termux/files/usr" ]; then
|
|
echo "Error: this command must be run inside Termux."
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
set_gradle_wrapper_sha256() {
|
|
WRAPPER_PROPERTIES="$1"
|
|
|
|
if grep -q '^distributionSha256Sum=' "$WRAPPER_PROPERTIES"; then
|
|
sed -i "s/^distributionSha256Sum=.*/distributionSha256Sum=$GRADLE_DISTRIBUTION_SHA256/" "$WRAPPER_PROPERTIES"
|
|
else
|
|
printf '\ndistributionSha256Sum=%s\n' "$GRADLE_DISTRIBUTION_SHA256" >> "$WRAPPER_PROPERTIES"
|
|
fi
|
|
}
|
|
|
|
get_project_name() {
|
|
if [ -f settings.gradle ]; then
|
|
DETECTED_NAME="$(grep -E '^rootProject.name[[:space:]]*=' settings.gradle \
|
|
| sed -E 's/.*=[[:space:]]*["'\'']?([^"'\'' ]+)["'\'']?.*/\1/' \
|
|
| head -n 1)"
|
|
|
|
[ -n "$DETECTED_NAME" ] && echo "$DETECTED_NAME" && return
|
|
fi
|
|
|
|
basename "$PWD"
|
|
}
|
|
|
|
get_build_type() {
|
|
echo "${ANDROID_BUILDER_BUILD_TYPE:-debug}"
|
|
}
|
|
|
|
get_apk_path() {
|
|
case "$(get_build_type)" in
|
|
debug) echo "app/build/outputs/apk/debug/app-debug.apk" ;;
|
|
release) echo "app/build/outputs/apk/release/app-release.apk" ;;
|
|
*) return 1 ;;
|
|
esac
|
|
}
|
|
|
|
create_base_project() {
|
|
NAME="$1"
|
|
MESSAGE="$2"
|
|
PACKAGE="com.example.$(echo "$NAME" | tr '[:upper:]' '[:lower:]' | tr -cd 'a-z0-9')"
|
|
PACKAGE_PATH="$(echo "$PACKAGE" | tr '.' '/')"
|
|
|
|
mkdir -p "$NAME/app/src/main/java/$PACKAGE_PATH"
|
|
mkdir -p "$NAME/app/src/main/res/values"
|
|
|
|
cat > "$NAME/settings.gradle" <<EOF2
|
|
pluginManagement { repositories { google(); mavenCentral(); gradlePluginPortal() } }
|
|
dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS); repositories { google(); mavenCentral() } }
|
|
rootProject.name="$NAME"
|
|
include(":app")
|
|
EOF2
|
|
|
|
cat > "$NAME/build.gradle" <<'EOF2'
|
|
// Root build file intentionally minimal.
|
|
EOF2
|
|
|
|
cat > "$NAME/gradle.properties" <<EOF2
|
|
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
|
|
org.gradle.daemon=true
|
|
org.gradle.parallel=true
|
|
org.gradle.caching=true
|
|
android.aapt2FromMavenOverride=$PREFIX/bin/aapt2
|
|
EOF2
|
|
|
|
cat > "$NAME/local.properties" <<EOF2
|
|
sdk.dir=$SDK
|
|
EOF2
|
|
|
|
cat > "$NAME/app/build.gradle" <<EOF2
|
|
plugins {
|
|
id 'com.android.application' version '$AGP_VERSION'
|
|
}
|
|
|
|
android {
|
|
namespace '$PACKAGE'
|
|
compileSdk 33
|
|
|
|
defaultConfig {
|
|
applicationId "$PACKAGE"
|
|
minSdk 24
|
|
targetSdk 33
|
|
versionCode 1
|
|
versionName "1.0"
|
|
}
|
|
}
|
|
EOF2
|
|
|
|
cat > "$NAME/app/src/main/AndroidManifest.xml" <<'EOF2'
|
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
|
<application
|
|
android:label="@string/app_name"
|
|
android:theme="@style/AppTheme">
|
|
<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>
|
|
EOF2
|
|
|
|
cat > "$NAME/app/src/main/res/values/strings.xml" <<EOF2
|
|
<resources>
|
|
<string name="app_name">$NAME</string>
|
|
</resources>
|
|
EOF2
|
|
|
|
cat > "$NAME/app/src/main/res/values/styles.xml" <<'EOF2'
|
|
<resources>
|
|
<style name="AppTheme" parent="@android:style/Theme.Material.Light.NoActionBar">
|
|
<item name="android:windowLightStatusBar">true</item>
|
|
</style>
|
|
</resources>
|
|
EOF2
|
|
|
|
cat > "$NAME/app/src/main/java/$PACKAGE_PATH/MainActivity.java" <<EOF2
|
|
package $PACKAGE;
|
|
|
|
import android.app.Activity;
|
|
import android.os.Bundle;
|
|
import android.view.Gravity;
|
|
import android.widget.LinearLayout;
|
|
import android.widget.TextView;
|
|
|
|
public class MainActivity extends Activity {
|
|
@Override
|
|
protected void onCreate(Bundle savedInstanceState) {
|
|
super.onCreate(savedInstanceState);
|
|
|
|
LinearLayout layout = new LinearLayout(this);
|
|
layout.setGravity(Gravity.CENTER);
|
|
layout.setOrientation(LinearLayout.VERTICAL);
|
|
layout.setPadding(32, 32, 32, 32);
|
|
|
|
TextView title = new TextView(this);
|
|
title.setText("$NAME");
|
|
title.setTextSize(30);
|
|
title.setGravity(Gravity.CENTER);
|
|
|
|
TextView message = new TextView(this);
|
|
message.setText("$MESSAGE");
|
|
message.setTextSize(18);
|
|
message.setGravity(Gravity.CENTER);
|
|
|
|
layout.addView(title);
|
|
layout.addView(message);
|
|
|
|
setContentView(layout);
|
|
}
|
|
}
|
|
EOF2
|
|
|
|
mkdir -p "$NAME/gradle/wrapper"
|
|
cp "$TEMPLATE_DIR/gradle-wrapper.jar" "$NAME/gradle/wrapper/gradle-wrapper.jar"
|
|
cp "$TEMPLATE_DIR/gradlew" "$NAME/gradlew"
|
|
chmod +x "$NAME/gradlew"
|
|
|
|
cat > "$NAME/gradle/wrapper/gradle-wrapper.properties" <<EOF2
|
|
distributionBase=GRADLE_USER_HOME
|
|
distributionPath=wrapper/dists
|
|
distributionUrl=https\://services.gradle.org/distributions/gradle-$GRADLE_VERSION-bin.zip
|
|
distributionSha256Sum=$GRADLE_DISTRIBUTION_SHA256
|
|
zipStoreBase=GRADLE_USER_HOME
|
|
zipStorePath=wrapper/dists
|
|
EOF2
|
|
set_gradle_wrapper_sha256 "$NAME/gradle/wrapper/gradle-wrapper.properties"
|
|
|
|
echo "Created project: $NAME"
|
|
echo
|
|
echo "Next:"
|
|
echo " cd $NAME"
|
|
echo " android-builder build"
|
|
echo " android-builder export"
|
|
echo " ./gradlew assembleDebug"
|
|
}
|