-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathandroid.sh
More file actions
executable file
·200 lines (167 loc) · 6.72 KB
/
android.sh
File metadata and controls
executable file
·200 lines (167 loc) · 6.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
#!/bin/bash
set -e
PERRY_DIR="$(cd "$(dirname "$0")/../perry" && pwd)"
MANGO_DIR="$(cd "$(dirname "$0")" && pwd)"
APP_NAME="mango-android"
PACKAGE_ID="com.perry.mango"
NDK_VERSION="28.0.12433566"
BUILD_DIR="$MANGO_DIR/${APP_NAME}-build"
export ANDROID_HOME="${ANDROID_HOME:-$HOME/Library/Android/sdk}"
export ANDROID_NDK_HOME="$ANDROID_HOME/ndk/$NDK_VERSION"
# NDK toolchain must be in PATH for ring/cc-rs cross-compilation
NDK_BIN="$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/darwin-x86_64/bin"
export PATH="$NDK_BIN:$PATH"
export CC_aarch64_linux_android="$NDK_BIN/aarch64-linux-android24-clang"
export AR_aarch64_linux_android="$NDK_BIN/llvm-ar"
echo "==> Building perry-stdlib + perry-ui-android for Android (aarch64)..."
cd "$PERRY_DIR"
# Build without email feature to avoid OpenSSL cross-compile dependency
cargo build --release \
-p perry-stdlib --no-default-features --features "http-server,http-client,database,compression,websocket,image,scheduler,ids,html-parser,rate-limit,validation" \
-p perry-ui-android \
--target aarch64-linux-android 2>&1 | grep -E '(Compiling|Finished|error)'
echo "==> Compiling mango for Android..."
cargo run --release -- compile --target android "$MANGO_DIR/src/app.ts" -o "$MANGO_DIR/$APP_NAME" 2>&1 | grep -v '^$'
echo "==> Setting up Gradle project..."
TEMPLATE_DIR="$PERRY_DIR/crates/perry-ui-android/template"
mkdir -p "$BUILD_DIR/app/src/main/java/com/perry/app"
mkdir -p "$BUILD_DIR/app/src/main/res/values"
mkdir -p "$BUILD_DIR/app/src/main/jniLibs/arm64-v8a"
mkdir -p "$BUILD_DIR/app/src/main/assets"
# Copy template structure
cp "$TEMPLATE_DIR/build.gradle.kts" "$BUILD_DIR/"
cp "$TEMPLATE_DIR/settings.gradle.kts" "$BUILD_DIR/"
cp "$TEMPLATE_DIR/gradle.properties" "$BUILD_DIR/"
cp "$TEMPLATE_DIR/app/src/main/java/com/perry/app/PerryActivity.kt" "$BUILD_DIR/app/src/main/java/com/perry/app/"
cp "$TEMPLATE_DIR/app/src/main/java/com/perry/app/PerryBridge.kt" "$BUILD_DIR/app/src/main/java/com/perry/app/"
cp "$TEMPLATE_DIR/app/src/main/java/com/perry/app/HoneEditorView.kt" "$BUILD_DIR/app/src/main/java/com/perry/app/"
cp "$TEMPLATE_DIR/app/src/main/res/values/themes.xml" "$BUILD_DIR/app/src/main/res/values/"
# Generate splash screen resources
mkdir -p "$BUILD_DIR/app/src/main/res/drawable"
cp "$MANGO_DIR/logo/mango-app-icon-256.png" "$BUILD_DIR/app/src/main/res/drawable/splash_image.png"
cat > "$BUILD_DIR/app/src/main/res/drawable/splash_background.xml" << 'SPLASH_DRAWABLE'
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item><color android:color="#FFF5EE"/></item>
<item>
<bitmap android:gravity="center" android:src="@drawable/splash_image"/>
</item>
</layer-list>
SPLASH_DRAWABLE
cat > "$BUILD_DIR/app/src/main/res/values/themes.xml" << 'THEMES'
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.Perry" parent="android:Theme.Material.Light.NoActionBar">
</style>
<style name="Theme.Perry.Splash" parent="android:Theme.Material.Light.NoActionBar">
<item name="android:windowBackground">@drawable/splash_background</item>
</style>
</resources>
THEMES
echo " Generated splash screen resources"
# Copy app assets (logo images, etc.) into APK assets directory
if [ -d "$MANGO_DIR/logo" ]; then
cp -r "$MANGO_DIR/logo" "$BUILD_DIR/app/src/main/assets/"
echo " Copied logo/ -> assets/logo/"
fi
# Write customized app/build.gradle.kts with mango package ID
cat > "$BUILD_DIR/app/build.gradle.kts" << 'GRADLE'
plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
}
android {
namespace = "com.perry.app"
compileSdk = 35
defaultConfig {
applicationId = "com.perry.mango"
minSdk = 24
targetSdk = 35
versionCode = 1
versionName = "1.0"
ndk {
abiFilters += "arm64-v8a"
}
}
buildTypes {
release {
isMinifyEnabled = false
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = "17"
}
sourceSets {
getByName("main") {
jniLibs.srcDirs("src/main/jniLibs")
}
}
}
dependencies {
implementation("androidx.core:core-ktx:1.12.0")
}
GRADLE
# Write AndroidManifest with mango branding + internet permission
cat > "$BUILD_DIR/app/src/main/AndroidManifest.xml" << 'MANIFEST'
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.perry.app">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
android:allowBackup="true"
android:label="Mango"
android:theme="@android:style/Theme.Material.Light.NoActionBar"
android:usesCleartextTraffic="true">
<activity
android:name=".PerryActivity"
android:exported="true"
android:theme="@style/Theme.Perry.Splash"
android:configChanges="orientation|screenSize|keyboardHidden">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
MANIFEST
# Copy the compiled .so into jniLibs (Perry outputs without .so extension)
SO_FILE="$MANGO_DIR/$APP_NAME"
if [ -f "$SO_FILE" ]; then
cp "$SO_FILE" "$BUILD_DIR/app/src/main/jniLibs/arm64-v8a/libperry_app.so"
echo " Copied $APP_NAME -> jniLibs/arm64-v8a/libperry_app.so"
else
echo "ERROR: $SO_FILE not found!"
exit 1
fi
# Copy any additional native library .so files needed by the app
# (e.g. hone-editor-android from @honeide/editor dependency)
HONE_SO="$PERRY_DIR/../hone/hone-editor/native/android/target/aarch64-linux-android/release/libhone_editor_android.so"
if [ -f "$HONE_SO" ]; then
cp "$HONE_SO" "$BUILD_DIR/app/src/main/jniLibs/arm64-v8a/"
echo " Copied libhone_editor_android.so"
fi
# Generate Gradle wrapper if missing
if [ ! -f "$BUILD_DIR/gradlew" ]; then
echo "==> Generating Gradle wrapper..."
cd "$BUILD_DIR"
gradle wrapper --gradle-version 8.10.2 2>&1 | tail -1
fi
echo "==> Building APK..."
cd "$BUILD_DIR"
./gradlew assembleDebug 2>&1 | grep -E '(BUILD|error|FAILED|Task)'
APK_PATH="$BUILD_DIR/app/build/outputs/apk/debug/app-debug.apk"
if [ ! -f "$APK_PATH" ]; then
echo "ERROR: APK not found at $APK_PATH"
exit 1
fi
echo "==> Installing on device/emulator..."
adb install -r "$APK_PATH"
echo "==> Launching..."
adb shell am start -n "$PACKAGE_ID/com.perry.app.PerryActivity"
echo "Done. Use 'adb logcat -s PerryDebug PerryJNI' to see logs."