Android: Difference between revisions

From NixOS Wiki
imported>ANicon111
Flutter developement environment instructions
imported>ANicon111
Undid accidental grief
Line 1: Line 1:
== Developement enviroment ==
== adb setup ==


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:
To enable <code>adb</code> in NixOS for unprivileged users
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> {} }:
{
let android-nixpkgs = (pkgs.callPackage (import (builtins.fetchGit {url = "https://github.com/tadfisher/android-nixpkgs.git";})) {channel = "stable";});
  programs.adb.enable = true;
  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>
{ 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;} }:


in pkgs.mkShell {
let
  androidSdk = pkgs.androidenv.androidPkgs_9_0.androidsdk;
in
pkgs.mkShell {
   buildInputs = with pkgs; [
   buildInputs = with pkgs; [
     flutter
     androidSdk
     #linux build
     glibc
    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
   ];
   ];
   CHROME_EXECUTABLE = "${pkgs.chromium}";
   # override the aapt2 that gradle uses with the nix-shipped version
  GRADLE_OPTS = "-Dorg.gradle.project.android.aapt2FromMavenOverride=${androidSdk}/libexec/android-sdk/build-tools/28.0.3/aapt2";
}
}
</syntaxhighlight>
</syntaxhighlight>


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 )
See the [https://nixos.org/manual/nixpkgs/unstable/#android androidenv documentation] for full examples.
 
=== 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]

Revision as of 20:45, 28 January 2023

adb setup

To enable adb in NixOS for unprivileged users add these lines to your configuration.nix. This is mandatory for all further interactions with your android device.

{
  programs.adb.enable = true;
  users.users.<your-user>.extraGroups = ["adbusers"];
}

This will add additional udev rules for unprivileged access as well as add adb to your $PATH.

Alternatively, if you don't want to install adb globally but do want to configure the udev rules, you can:

{
  services.udev.packages = [
    pkgs.android-udev-rules
  ];
}

Use Older Platform Version

If you would like to get older platform version, you can write the following.

{ 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

Interaction with your Android device

adb shell on device

First open a nix-shell with the platform tools and connect your device:

$ # 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

A popup appears on your phone to allow your computer access to it. After allowing, you can:

% adb devices
List of devices attached
BH90272JCU	device
% adb shell

You can also connect to an already-running adb server:

$ # 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

Transferring files from/to an Android device

There are two main methods for newer devices:

Android Development

Android Studio

To develop apps using Android Studio

$ nix-shell -p android-studio --run android-studio

gradlew

It's possible to create a build environment (shell.nix) to use with gradlew as a FHS environment:

{ 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

As an alternative, it's often enough to override just the aapt2 binary for the gradle build process:

{ pkgs ? import <nixpkgs> {config.android_sdk.accept_license = true;} }:

let
  androidSdk = pkgs.androidenv.androidPkgs_9_0.androidsdk;
in
pkgs.mkShell {
  buildInputs = with pkgs; [
    androidSdk
    glibc
  ];
  # override the aapt2 that gradle uses with the nix-shipped version
  GRADLE_OPTS = "-Dorg.gradle.project.android.aapt2FromMavenOverride=${androidSdk}/libexec/android-sdk/build-tools/28.0.3/aapt2";
}

See the androidenv documentation for full examples.

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.

{ 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";

}
  1. more information on that snippet
  2. A shell.nix to build LineageOS
  3. robotnix, building aosp roms (e.g. LineageOS) with nix.
  4. LineageOS build setup using terranix and hcloud, based on the 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:

  1. androidenv documentation
  2. Building Android applications with the Nix package manager
  3. Reproducing Android app deployments (or playing Angry Birds on NixOS)
  4. A set of androidenv test cases