-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathsetup.sh
More file actions
executable file
·371 lines (316 loc) · 11.5 KB
/
Copy pathsetup.sh
File metadata and controls
executable file
·371 lines (316 loc) · 11.5 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
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
#!/bin/bash
# Flutter Mobile Dev Environment Setup for Arch Linux
# Idempotent - safe to rerun
set -euo pipefail
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
log() { echo -e "${GREEN}[+]${NC} $1"; }
warn() { echo -e "${YELLOW}[!]${NC} $1"; }
err() { echo -e "${RED}[x]${NC} $1"; }
ANDROID_SDK_ROOT="$HOME/Android/Sdk"
FLUTTER_ROOT="$HOME/.local/flutter"
CMDLINE_TOOLS_URL="https://dl.google.com/android/repository/commandlinetools-linux-13114758_latest.zip"
CMDLINE_TOOLS_SHA256="7ec965280a073311c339e571cd5de778b9975026cfcbe79f2b1cdcb1e15317ee"
# ============================================================
# STEP 1: System Dependencies
# ============================================================
step1_system_deps() {
log "Installing system dependencies via pacman..."
local packages=(
git curl unzip zip
base-devel clang cmake ninja
ripgrep fd fzf
jdk17-openjdk
android-tools android-udev
libvirt qemu-full dnsmasq bridge-utils
)
local available=()
local missing=()
for pkg in "${packages[@]}"; do
if pacman -Si "$pkg" >/dev/null 2>&1; then
available+=("$pkg")
else
missing+=("$pkg")
fi
done
if [ "${#missing[@]}" -gt 0 ]; then
warn "Skipping unavailable packages: ${missing[*]}"
fi
if [ "${#available[@]}" -eq 0 ]; then
err "No installable packages were found in configured pacman repos."
exit 1
fi
sudo pacman -S --needed --noconfirm "${available[@]}"
# Set JAVA_HOME for JDK 17
if ! grep -q "JAVA_HOME.*java-17-openjdk" ~/.zshrc 2>/dev/null; then
log "Adding JAVA_HOME to .zshrc..."
cat >> ~/.zshrc << 'EOF'
# Java 17 (for Android SDK)
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk
export PATH="$JAVA_HOME/bin:$PATH"
EOF
else
warn "JAVA_HOME already configured in .zshrc"
fi
log "System dependencies installed."
}
# ============================================================
# STEP 2: KVM/Libvirt Configuration
# ============================================================
step2_kvm_setup() {
log "Configuring KVM/libvirt for hardware acceleration..."
# Check virtualization support
if grep -qE 'vmx|svm' /proc/cpuinfo; then
log "CPU virtualization support detected."
else
err "No virtualization support detected in CPU. Emulator will be slow."
fi
# Check KVM modules
if lsmod | grep -q kvm; then
log "KVM modules loaded."
else
warn "KVM modules not loaded. Loading..."
sudo modprobe kvm
# AMD or Intel
if grep -q 'svm' /proc/cpuinfo; then
sudo modprobe kvm_amd
else
sudo modprobe kvm_intel
fi
fi
# Enable libvirtd
log "Enabling libvirtd service..."
sudo systemctl enable --now libvirtd
# Add user to groups
GROUPS_NEEDED="libvirt kvm"
RELOGIN_NEEDED=0
for grp in $GROUPS_NEEDED; do
if ! groups "$USER" | grep -qw "$grp"; then
log "Adding $USER to $grp group..."
sudo usermod -aG "$grp" "$USER"
RELOGIN_NEEDED=1
else
warn "User already in $grp group."
fi
done
# Check /dev/kvm permissions
if [ -c /dev/kvm ]; then
if [ -w /dev/kvm ]; then
log "/dev/kvm is writable."
else
warn "/dev/kvm exists but not writable. May need re-login or udev rules."
fi
else
err "/dev/kvm does not exist. KVM acceleration won't work."
fi
if [ "$RELOGIN_NEEDED" -eq 1 ]; then
warn ">>> YOU MUST LOG OUT AND LOG BACK IN for group changes to take effect! <<<"
warn ">>> After re-login, run this script again to continue setup. <<<"
fi
}
# ============================================================
# STEP 3: Android SDK (CLI-only)
# ============================================================
step3_android_sdk() {
log "Setting up Android SDK command-line tools..."
mkdir -p "$ANDROID_SDK_ROOT/cmdline-tools"
# Download if not present
if [ ! -d "$ANDROID_SDK_ROOT/cmdline-tools/latest/bin" ]; then
log "Downloading Android command-line tools..."
TMPZIP="/tmp/cmdline-tools.zip"
curl -L -o "$TMPZIP" "$CMDLINE_TOOLS_URL"
# Verify checksum
log "Verifying checksum..."
echo "$CMDLINE_TOOLS_SHA256 $TMPZIP" | sha256sum -c - || {
err "Checksum mismatch! Aborting."
exit 1
}
# Extract to temp, then move to correct location
log "Extracting..."
TMPDIR=$(mktemp -d)
unzip -q "$TMPZIP" -d "$TMPDIR"
rm -rf "$ANDROID_SDK_ROOT/cmdline-tools/latest"
mv "$TMPDIR/cmdline-tools" "$ANDROID_SDK_ROOT/cmdline-tools/latest"
rm -rf "$TMPDIR" "$TMPZIP"
log "Command-line tools installed."
else
warn "Command-line tools already installed."
fi
# Add to PATH in .zshrc (idempotent)
if ! grep -q "ANDROID_SDK_ROOT" ~/.zshrc 2>/dev/null; then
log "Adding Android SDK paths to .zshrc..."
cat >> ~/.zshrc << 'EOF'
# Android SDK
export ANDROID_SDK_ROOT="$HOME/Android/Sdk"
export ANDROID_HOME="$ANDROID_SDK_ROOT"
export PATH="$ANDROID_SDK_ROOT/cmdline-tools/latest/bin:$PATH"
export PATH="$ANDROID_SDK_ROOT/platform-tools:$PATH"
export PATH="$ANDROID_SDK_ROOT/emulator:$PATH"
EOF
else
warn "Android SDK paths already in .zshrc"
fi
# Export for current session
export ANDROID_SDK_ROOT="$HOME/Android/Sdk"
export ANDROID_HOME="$ANDROID_SDK_ROOT"
export PATH="$ANDROID_SDK_ROOT/cmdline-tools/latest/bin:$PATH"
export PATH="$ANDROID_SDK_ROOT/platform-tools:$PATH"
export PATH="$ANDROID_SDK_ROOT/emulator:$PATH"
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk
log "Android SDK paths configured."
}
# ============================================================
# STEP 4: SDK Components via sdkmanager
# ============================================================
step4_sdk_components() {
log "Installing SDK components via sdkmanager..."
# Ensure sdkmanager is available
export PATH="$ANDROID_SDK_ROOT/cmdline-tools/latest/bin:$PATH"
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk
if ! command -v sdkmanager &>/dev/null; then
err "sdkmanager not found. Run step 3 first."
exit 1
fi
# Accept licenses
log "Accepting Android SDK licenses..."
yes | sdkmanager --licenses || true
# Install components
log "Installing platform-tools, emulator, platform, build-tools, system-image..."
sdkmanager --install \
"platform-tools" \
"emulator" \
"platforms;android-36" \
"build-tools;36.0.0" \
"system-images;android-34;google_apis;x86_64"
# Verify installations
log "Verifying installations..."
export PATH="$ANDROID_SDK_ROOT/platform-tools:$ANDROID_SDK_ROOT/emulator:$PATH"
if command -v adb &>/dev/null; then
log "adb: $(adb --version | head -1)"
else
err "adb not found in PATH"
fi
if command -v emulator &>/dev/null; then
log "emulator: $(emulator -version 2>&1 | head -1)"
else
err "emulator not found in PATH"
fi
log "SDK components installed."
}
# ============================================================
# STEP 5: Create AVD
# ============================================================
step5_create_avd() {
log "Creating AVD pixel_api34..."
export PATH="$ANDROID_SDK_ROOT/cmdline-tools/latest/bin:$ANDROID_SDK_ROOT/emulator:$PATH"
export ANDROID_SDK_ROOT="$HOME/Android/Sdk"
export ANDROID_HOME="$ANDROID_SDK_ROOT"
# Check if AVD already exists
if avdmanager list avd 2>/dev/null | grep -q "pixel_api34"; then
warn "AVD pixel_api34 already exists."
else
log "Creating pixel_api34 AVD..."
echo "no" | avdmanager create avd \
-n pixel_api34 \
-k "system-images;android-34;google_apis;x86_64" \
-d "pixel" \
--force
log "AVD created."
fi
# Configure AVD for better performance
AVD_CONFIG="$HOME/.android/avd/pixel_api34.avd/config.ini"
if [ -f "$AVD_CONFIG" ]; then
log "Configuring AVD for optimal performance..."
# Set RAM and heap (idempotent)
grep -q "hw.ramSize" "$AVD_CONFIG" || echo "hw.ramSize=2048" >> "$AVD_CONFIG"
grep -q "hw.gpu.enabled" "$AVD_CONFIG" || echo "hw.gpu.enabled=yes" >> "$AVD_CONFIG"
grep -q "hw.gpu.mode" "$AVD_CONFIG" || echo "hw.gpu.mode=host" >> "$AVD_CONFIG"
fi
log "AVD configuration complete."
}
# ============================================================
# STEP 6: Flutter SDK
# ============================================================
step6_flutter() {
log "Installing Flutter SDK..."
if [ -d "$FLUTTER_ROOT" ] && [ -x "$FLUTTER_ROOT/bin/flutter" ]; then
warn "Flutter already installed at $FLUTTER_ROOT"
log "Updating Flutter..."
"$FLUTTER_ROOT/bin/flutter" upgrade || true
else
log "Cloning Flutter stable..."
rm -rf "$FLUTTER_ROOT"
git clone https://github.com/flutter/flutter.git -b stable "$FLUTTER_ROOT"
fi
# Add to PATH in .zshrc (idempotent)
if ! grep -q "FLUTTER_ROOT" ~/.zshrc 2>/dev/null; then
log "Adding Flutter to .zshrc..."
cat >> ~/.zshrc << 'EOF'
# Flutter SDK
export FLUTTER_ROOT="$HOME/.local/flutter"
export PATH="$FLUTTER_ROOT/bin:$PATH"
EOF
else
warn "Flutter paths already in .zshrc"
fi
# Export for current session
export PATH="$FLUTTER_ROOT/bin:$PATH"
# Pre-download Dart SDK
log "Running flutter precache..."
"$FLUTTER_ROOT/bin/flutter" precache
# Configure Flutter to use our Android SDK
log "Configuring Flutter Android SDK path..."
"$FLUTTER_ROOT/bin/flutter" config --android-sdk "$ANDROID_SDK_ROOT"
# Accept Android licenses through Flutter
log "Accepting Android licenses through Flutter..."
yes | "$FLUTTER_ROOT/bin/flutter" doctor --android-licenses || true
log "Flutter installed."
}
# ============================================================
# STEP 7: Run flutter doctor
# ============================================================
step7_doctor() {
log "Running flutter doctor..."
export PATH="$FLUTTER_ROOT/bin:$ANDROID_SDK_ROOT/cmdline-tools/latest/bin:$ANDROID_SDK_ROOT/platform-tools:$ANDROID_SDK_ROOT/emulator:$PATH"
export ANDROID_SDK_ROOT="$HOME/Android/Sdk"
export ANDROID_HOME="$ANDROID_SDK_ROOT"
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk
"$FLUTTER_ROOT/bin/flutter" doctor -v
}
# ============================================================
# Main
# ============================================================
main() {
echo "========================================"
echo " Flutter Dev Setup for Arch Linux"
echo " (No Android Studio)"
echo "========================================"
echo ""
step1_system_deps
step2_kvm_setup
step3_android_sdk
step4_sdk_components
step5_create_avd
step6_flutter
step7_doctor
echo ""
log "========================================"
log "Setup complete!"
log "========================================"
echo ""
warn "IMPORTANT: Source your shell config or open a new terminal:"
echo " source ~/.zshrc"
echo ""
log "To launch the emulator:"
echo " emulator @pixel_api34 &"
echo ""
log "To verify adb sees the emulator:"
echo " adb devices"
echo ""
}
# Run if executed directly
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
main "$@"
fi