|
|
Line 1: |
Line 1: |
− | == adb setup == | + | == Developement enviroment == |
| | | |
− | To enable <code>adb</code> in NixOS for unprivileged users | + | To be able to build flutter apps, you need to add the platform-specific dependencies to your environment. This may be done by running <code>nix-shell</code> using this shell.nix configuration: |
− | add these lines to your <code>configuration.nix</code>. | |
− | This is mandatory for all further interactions with your android device.
| |
| | | |
| <syntaxhighlight lang=nix> | | <syntaxhighlight lang=nix> |
− | { | + | { pkgs ? import <nixpkgs> {} }: |
− | programs.adb.enable = true;
| + | let android-nixpkgs = (pkgs.callPackage (import (builtins.fetchGit {url = "https://github.com/tadfisher/android-nixpkgs.git";})) {channel = "stable";}); |
− | users.users.<your-user>.extraGroups = ["adbusers"];
| |
− | }
| |
− | </syntaxhighlight>
| |
− | | |
− | This will add [https://github.com/M0Rf30/android-udev-rules additional udev rules] for unprivileged access as well as add adb to your <code>$PATH</code>.
| |
− | | |
− | Alternatively, if you don't want to install adb globally but do want to configure the udev rules, you can:
| |
− | | |
− | <syntaxhighlight lang=nix>
| |
− | {
| |
− | services.udev.packages = [
| |
− | pkgs.android-udev-rules
| |
− | ];
| |
− | }
| |
− | </syntaxhighlight>
| |
− | | |
− | === Use Older Platform Version ===
| |
− | If you would like to get older platform version, you can write the following.
| |
− | | |
− | <syntaxhighlight lang=nix>
| |
− | { pkgs ? import <nixpkgs> {
| |
− | config.android_sdk.accept_license = true;
| |
− | overlays = [
| |
− | (self: super: {
| |
− | androidPkgs_8_0 = super.androidenv.composeAndroidPackages {
| |
− | platformVersions = [ "26" ];
| |
− | abiVersions = [ "x86" "x86_64"];
| |
− | };
| |
− | })
| |
− | ];
| |
− | } }:
| |
− | | |
− | (pkgs.buildFHSUserEnv {
| |
− | name = "android-sdk-env";
| |
− | targetPkgs = pkgs: (with pkgs;
| |
− | [
| |
− | androidPkgs_8_0.androidsdk
| |
− | glibc
| |
− | ]);
| |
− | runScript = "bash";
| |
− | }).env | |
− | | |
− | </syntaxhighlight>
| |
− | | |
− | == Interaction with your Android device ==
| |
− | | |
− | === adb shell on device ===
| |
− | | |
− | First open a nix-shell with the platform tools and connect your device:
| |
− | | |
− | <syntaxhighlight lang=console>
| |
− | $ # For nixos < 19.03
| |
− | $ # nix-shell -p androidenv.platformTools
| |
− | $ nix-shell -p androidenv.androidPkgs_9_0.platform-tools
| |
− | % adb devices
| |
− | List of devices attached
| |
− | * daemon not running; starting now at tcp:5037
| |
− | * daemon started successfully
| |
− | BH90272JCU unauthorized
| |
− | </syntaxhighlight>
| |
− | | |
− | A popup appears on your phone to allow your computer access to it. After allowing, you can:
| |
− | | |
− | <syntaxhighlight lang=console>
| |
− | % adb devices
| |
− | List of devices attached
| |
− | BH90272JCU device
| |
− | % adb shell
| |
− | </syntaxhighlight>
| |
− | | |
− | You can also connect to an already-running adb server:
| |
− | | |
− | <syntaxhighlight lang=console>
| |
− | $ # For nixos < 19.03
| |
− | $ # nix-shell -p androidenv.platformTools
| |
− | $ nix-shell -p androidenv.androidPkgs_9_0.platform-tools
| |
− | % adb connect 192.168.1.10
| |
− | % adb shell
| |
− | </syntaxhighlight>
| |
− | | |
− | === Transferring files from/to an Android device ===
| |
− | | |
− | There are two main methods for newer devices:
| |
− | * <code>adb push</code> and <code>adb pull</code>: see above.
| |
− | * via [[MTP]], see [[MTP|the corresponding page]]
| |
− | | |
− | == Android Development ==
| |
− | | |
− | === Android Studio ===
| |
− | | |
− | To develop apps using [https://developer.android.com/studio/ Android Studio]
| |
− | | |
− | <syntaxhighlight lang=console>
| |
− | $ nix-shell -p android-studio --run android-studio
| |
− | </syntaxhighlight>
| |
− | | |
− | === gradlew ===
| |
− | | |
− | It's possible to create a build environment (shell.nix) to use with gradlew as a FHS environment:
| |
| | | |
− | <syntaxhighlight lang=nix>
| + | in pkgs.mkShell { |
− | { pkgs ? import <nixpkgs> {config.android_sdk.accept_license = true;} }:
| |
− | | |
− | (pkgs.buildFHSUserEnv {
| |
− | name = "android-sdk-env";
| |
− | targetPkgs = pkgs: (with pkgs;
| |
− | [
| |
− | androidenv.androidPkgs_9_0.androidsdk
| |
− | glibc
| |
− | ]);
| |
− | runScript = "bash";
| |
− | }).env
| |
− | </syntaxhighlight>
| |
− | | |
− | As an alternative, it's often enough to override just the aapt2 binary for the gradle build process:
| |
− | | |
− | <syntaxhighlight lang=nix>
| |
− | { pkgs ? import <nixpkgs> {config.android_sdk.accept_license = true;} }:
| |
− | | |
− | let
| |
− | androidSdk = pkgs.androidenv.androidPkgs_9_0.androidsdk;
| |
− | in | |
− | pkgs.mkShell { | |
| buildInputs = with pkgs; [ | | buildInputs = with pkgs; [ |
− | androidSdk | + | flutter |
− | glibc | + | #linux build |
| + | cmake clang ninja pkg-config pkgconfig gtk3 libepoxy |
| + | #android build |
| + | (android-nixpkgs.sdk (sdkPkgs: with sdkPkgs; [cmdline-tools-latest build-tools-32-0-0 platform-tools platforms-android-31 system-images-android-31-default-x86-64 emulator])) jdk |
| + | #web build |
| + | chromium |
| ]; | | ]; |
− | # override the aapt2 that gradle uses with the nix-shipped version | + | CHROME_EXECUTABLE = "${pkgs.chromium}"; |
− | GRADLE_OPTS = "-Dorg.gradle.project.android.aapt2FromMavenOverride=${androidSdk}/libexec/android-sdk/build-tools/28.0.3/aapt2";
| |
| } | | } |
| </syntaxhighlight> | | </syntaxhighlight> |
| | | |
− | See the [https://nixos.org/manual/nixpkgs/unstable/#android androidenv documentation] for full examples.
| + | This uses the tool android-nixpkgs made by tadfisher to get all the android dependencies (be sure to change the package versions/branch to your needs; they can be found here: https://github.com/tadfisher/android-nixpkgs/tree/main/channels ) |
− | | |
− | === Building Android on NixOS ===
| |
− | | |
− | It's possible to use nix-shell with buildFHSUserEnv to set up an environment in which it's viable to build Android without huge amounts of editing. This is an example shell.nix file.
| |
− | <syntaxhighlight lang="nix">
| |
− | { pkgs ? import <nixpkgs> {} }:
| |
− |
| |
− | let fhs = pkgs.buildFHSUserEnv {
| |
− | name = "android-env";
| |
− | targetPkgs = pkgs: with pkgs;
| |
− | [ git
| |
− | gitRepo
| |
− | gnupg
| |
− | python2
| |
− | curl
| |
− | procps
| |
− | openssl
| |
− | gnumake
| |
− | nettools
| |
− | # For nixos < 19.03, use `androidenv.platformTools`
| |
− | androidenv.androidPkgs_9_0.platform-tools
| |
− | jdk
| |
− | schedtool
| |
− | util-linux
| |
− | m4
| |
− | gperf
| |
− | perl
| |
− | libxml2
| |
− | zip
| |
− | unzip
| |
− | bison
| |
− | flex
| |
− | lzop
| |
− | python3
| |
− | ];
| |
− | multiPkgs = pkgs: with pkgs;
| |
− | [ zlib
| |
− | ncurses5
| |
− | ];
| |
− | runScript = "bash";
| |
− | profile = ''
| |
− | export ALLOW_NINJA_ENV=true
| |
− | export USE_CCACHE=1
| |
− | export ANDROID_JAVA_HOME=${pkgs.jdk.home}
| |
− | export LD_LIBRARY_PATH=/usr/lib:/usr/lib32
| |
− | '';
| |
− | };
| |
− | in pkgs.stdenv.mkDerivation {
| |
− | name = "android-env-shell";
| |
− | nativeBuildInputs = [ fhs ];
| |
− | shellHook = "exec android-env";
| |
− | | |
− | }
| |
− | </syntaxhighlight>
| |
− | | |
− | # [https://nixos.org/nix-dev/2015-April/016881.html more information on that snippet]
| |
− | # [https://gist.github.com/Nadrieril/d006c0d9784ba7eff0b092796d78eb2a A shell.nix to build LineageOS]
| |
− | # [https://github.com/danielfullmer/robotnix robotnix], building aosp roms (e.g. LineageOS) with nix.
| |
− | # [https://github.com/mrVanDalo/LineagoOS-build LineageOS build setup using terranix and hcloud], based on the [https://gist.github.com/Nadrieril/d006c0d9784ba7eff0b092796d78eb2a shell.nix to build LineageOS]. Useful if you are in a rush and don't have to much CPU power on your hand.
| |
− | | |
− | == Using the nixpkgs androidenv ==
| |
− | | |
− | User Sander van der Burg created two awesome blog posts as well as a number of test cases usable as examples on how to use the nixpkgs androidenv and the emulator provided:
| |
− | | |
− | # [https://nixos.org/manual/nixpkgs/unstable/#android androidenv documentation]
| |
− | # [https://sandervanderburg.blogspot.de/2012/11/building-android-applications-with-nix.html Building Android applications with the Nix package manager ]
| |
− | # [https://sandervanderburg.blogspot.de/2014/02/reproducing-android-app-deployments-or.html Reproducing Android app deployments (or playing Angry Birds on NixOS)]
| |
− | # [https://github.com/svanderburg/nix-androidenvtests A set of androidenv test cases]
| |