272 lines
5.9 KiB
Markdown
272 lines
5.9 KiB
Markdown
# Android Development Module for NixOS
|
|
|
|
This module provides Android development environment setup using NixOS-specific approaches that respect the immutable filesystem while maintaining full functionality.
|
|
|
|
## Features
|
|
|
|
- **Android Studio Full** - Includes FHS environment for compatibility
|
|
- **androidenv** - Declarative Android SDK management (reproducible)
|
|
- **Android Emulator** - Optimized for NixOS with GPU acceleration
|
|
- **Flutter SDK** - Optional Dart and Flutter support
|
|
- **Build Tools** - Gradle, Maven, Kotlin, Java
|
|
- **Additional Tools** - scrcpy for device screen sharing, APK signing utilities
|
|
|
|
## Configuration
|
|
|
|
Add to your `home.nix`:
|
|
|
|
```nix
|
|
modules.android = {
|
|
enable = true;
|
|
enableEmulator = true;
|
|
apiLevel = 34;
|
|
enableFlutterSupport = true;
|
|
};
|
|
```
|
|
|
|
## Configuration Options
|
|
|
|
- **enable** - Master switch for the module
|
|
- **enableEmulator** - Include Android emulator (default: true)
|
|
- **apiLevel** - Default Android API level (default: 34)
|
|
- **enableFlutterSupport** - Install Flutter SDK (default: true)
|
|
|
|
## Why This Approach is Better for NixOS
|
|
|
|
### Problem with Standard Android Tools on NixOS
|
|
|
|
NixOS uses an immutable filesystem and unique file structure that standard Android tools struggle with:
|
|
- Expected `/system`, `/data`, `/cache` paths don't exist
|
|
- SDK expects mutable `/opt` directories
|
|
- Dynamic library linking issues
|
|
|
|
### Solution: NixOS-Specific Tools
|
|
|
|
**android-studio-full** - The recommended approach for NixOS
|
|
- Provides FHS (Filesystem Hierarchy Standard) environment
|
|
- Works out-of-the-box with proper file hierarchy
|
|
- Pre-configured with SDK, emulator, and build tools
|
|
- Manages mutable state in `~/.android` directory
|
|
- No immutability conflicts
|
|
|
|
## Initial Setup
|
|
|
|
After applying the module:
|
|
|
|
```bash
|
|
# Accept Android licenses
|
|
android-setup
|
|
|
|
# Or manually
|
|
yes | sdkmanager --licenses
|
|
|
|
# Create and start emulator
|
|
android-emulator
|
|
|
|
# Verify Flutter setup
|
|
flutter doctor
|
|
```
|
|
|
|
## Usage
|
|
|
|
### Launch Emulator
|
|
|
|
```bash
|
|
# Default emulator (flutter-dev, API 34)
|
|
android-emulator
|
|
|
|
# Custom name
|
|
android-emulator my-device
|
|
|
|
# Custom name and API level
|
|
android-emulator my-device 33
|
|
```
|
|
|
|
### Launch Android Studio
|
|
|
|
```bash
|
|
android-studio
|
|
```
|
|
|
|
### Flutter Development
|
|
|
|
```bash
|
|
# Create new project
|
|
flutter create my_app
|
|
|
|
# Run on emulator
|
|
cd my_app
|
|
flutter run
|
|
|
|
# Run with verbose output
|
|
flutter run -v
|
|
```
|
|
|
|
### Physical Device Development
|
|
|
|
```bash
|
|
# Check connected devices
|
|
adb devices
|
|
|
|
# Screen sharing (requires scrcpy)
|
|
scrcpy
|
|
|
|
# View logs
|
|
adb logcat
|
|
```
|
|
|
|
## Available API Levels
|
|
|
|
The module includes these Android API levels by default:
|
|
- API 28 (Android 9)
|
|
- API 31 (Android 12)
|
|
- API 33 (Android 13)
|
|
- API 34 (Android 14)
|
|
- API 35 (Android 15)
|
|
|
|
To use a specific API level:
|
|
|
|
```bash
|
|
android-emulator test-device 31
|
|
android-emulator latest 35
|
|
```
|
|
|
|
## Build Tools
|
|
|
|
Included by default:
|
|
- Gradle (build system)
|
|
- Maven (alternative build system)
|
|
- Kotlin compiler
|
|
- Java JDK (11 and 21)
|
|
- CMake, Ninja, GNU Make
|
|
|
|
## Hyprland Keybind
|
|
|
|
The module includes a Hyprland keybind:
|
|
|
|
```
|
|
SUPER + ALT + A → Launch Android emulator
|
|
```
|
|
|
|
Edit `modules/hyprland/config.nix` to customize.
|
|
|
|
## Troubleshooting
|
|
|
|
### "avdmanager: command not found"
|
|
|
|
Ensure the module is properly enabled and rebuilt:
|
|
|
|
```bash
|
|
home-manager switch --flake .#cody@nixos
|
|
```
|
|
|
|
Then source environment:
|
|
|
|
```bash
|
|
exec $SHELL
|
|
```
|
|
|
|
### Emulator won't start
|
|
|
|
Check that the system image is available:
|
|
|
|
```bash
|
|
avdmanager list all
|
|
```
|
|
|
|
If the API level isn't listed, it may not be in the androidenv configuration. Edit the module to add it.
|
|
|
|
### Flutter doctor shows issues
|
|
|
|
```bash
|
|
flutter doctor --verbose
|
|
|
|
# Accept licenses
|
|
yes | flutter doctor --android-licenses
|
|
|
|
# Clean cache
|
|
flutter clean
|
|
rm -rf pubspec.lock
|
|
flutter pub get
|
|
```
|
|
|
|
### Physical device not detected
|
|
|
|
```bash
|
|
# Check ADB sees the device
|
|
adb devices
|
|
|
|
# Reload udev rules if you added a new device
|
|
sudo udevadm control --reload-rules
|
|
sudo udevadm trigger
|
|
|
|
# Ensure user is in correct group
|
|
groups # Check for adbusers
|
|
```
|
|
|
|
## Environment Variables
|
|
|
|
Automatically configured:
|
|
|
|
```bash
|
|
ANDROID_HOME # Points to androidenv SDK
|
|
ANDROID_SDK_ROOT # Points to androidenv SDK
|
|
ANDROID_USER_HOME # $HOME/.android
|
|
JAVA_HOME # JDK path
|
|
ANDROID_JAVA_HOME # JDK for Android tools
|
|
```
|
|
|
|
## Nix-Specific Notes
|
|
|
|
**android-studio-full** provides:
|
|
- Complete Android SDK with tools
|
|
- Emulator with hardware acceleration
|
|
- System images for multiple API levels
|
|
- Proper FHS environment for compatibility with standard Android tools
|
|
|
|
The module automatically configures:
|
|
- `ANDROID_HOME` environment variable
|
|
- `ANDROID_SDK_ROOT` for SDK location
|
|
- `JAVA_HOME` for Java toolchain
|
|
- All necessary PATH entries
|
|
|
|
### Adding More API Levels
|
|
|
|
Android Studio's SDK Manager handles API level management. After installation:
|
|
|
|
1. Open Android Studio
|
|
2. Go to SDK Manager (Tools → SDK Manager)
|
|
3. Select additional API levels and download system images
|
|
4. Use `android-emulator my-device 31` for the new level
|
|
|
|
## Advanced: Manual SDK Management
|
|
|
|
If you prefer not to use Android Studio, you can manage the SDK manually using `android-tools`:
|
|
|
|
```bash
|
|
# List available SDK components
|
|
sdkmanager --list
|
|
|
|
# Install specific SDK component
|
|
sdkmanager "system-images;android-34;google_apis;x86_64"
|
|
|
|
# Create AVD
|
|
avdmanager create avd --name test --package "system-images;android-34;google_apis;x86_64"
|
|
```
|
|
|
|
## Additional Resources
|
|
|
|
- [NixOS Android Environment](https://search.nixos.org/packages?channel=unstable&query=androidenv)
|
|
- [Android Studio on NixOS](https://github.com/NixOS/nixpkgs/blob/master/pkgs/applications/editors/android-studio)
|
|
- [Android Developer Docs](https://developer.android.com/)
|
|
- [Flutter Documentation](https://flutter.dev/docs)
|
|
|
|
## Module Implementation Details
|
|
|
|
The module uses:
|
|
- `android-studio-full` for complete Android SDK with FHS environment
|
|
- `android-tools` for command-line utilities
|
|
- Standard Nix packages for build tools (Gradle, Maven, CMake)
|
|
- Environment variable configuration for automatic tool discovery
|
|
- Helper scripts for emulator management
|