Android: Difference between revisions

Update n9ix-shell command for platform-tools
Axka (talk | contribs)
Tags: Mobile edit Mobile web edit Visual edit
 
(18 intermediate revisions by 14 users not shown)
Line 1: Line 1:
== Using the Android SDK ==
== Using the Android SDK ==
NixOS uses the androidenv package for building android SDKs and manually creating emulators without the use of Android Studio. Example android sdk is <code>androidenv.androidPkgs_9_0.androidsdk</code>. They also include all of the SDK tools such as sdkmanager and avdmanager needed to create emulators.
 
NixOS uses the androidenv package for building android SDKs and manually creating emulators without the use of Android Studio. Example android sdk is <code>androidenv.androidPkgs.androidsdk</code>. They also include all of the SDK tools such as sdkmanager and avdmanager needed to create emulators.
 
{{Note|<code><small>androidenv.androidPkgs_9_0</small></code> has been replaced with <code><u><small>androidenv.androidPkgs</small></u></code> in nixos 24.11, see [https://github.com/NixOS/nixpkgs/blob/master/nixos/doc/manual/release-notes/rl-2411.section.md#backward-incompatibilities-sec-release-2411-incompatibilities backward-incompatibilities-sec-release-2411-incompatibilities], so all the <code><small>androidPkgs</small></code> references below will be androidPkgs_9_0 if you are still using 24.05 or below.}}


The first link provides a guide for creating a custom android SDK, using a predefined SDK, and how to nixify an emulator. The second link is an extra guide that might have some helpful tips for improving your workflow.  
The first link provides a guide for creating a custom android SDK, using a predefined SDK, and how to nixify an emulator. The second link is an extra guide that might have some helpful tips for improving your workflow.  
Line 29: Line 32:
<syntaxhighlight lang=nix>
<syntaxhighlight lang=nix>
{
{
   users.users.<your-user>.extraGroups = ["kvm"];
   users.users.<your-user>.extraGroups = [ "kvm" ];
}
}
</syntaxhighlight>
</syntaxhighlight>


== adb setup ==
== ADB setup ==


To enable <code>adb</code> in NixOS for unprivileged users
To use <code>adb</code>, you can just [[Adding programs to PATH|run it from]] the <code>android-tools</code> package.
add these lines to your <code>configuration.nix</code>.
This is mandatory for all further interactions with your android device.


<syntaxhighlight lang=nix>
{{Note|1=Previously you would need use <code>programs.adb.enable = true;</code> and <code>users.users.<your-user>.extraGroups = [ "adbusers" ];</code> to add ADB to your PATH and configure access rules. This option is no longer needed as systemd 258 handles uaccess rules for ADB and fastboot automatically. See the Nixpkgs pull request {{pull|454366}}.}}
{
  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 ===
=== Use Older Platform Version ===
Line 93: Line 77:


<syntaxhighlight lang=console>
<syntaxhighlight lang=console>
$ # For nixos < 19.03
$ # nix-shell -p androidenv.platformTools
$ # for nixos <= 24.05
$ nix-shell -p androidenv.androidPkgs_9_0.platform-tools
$ # For nixos >= 24.11
$ nix-shell -p androidenv.androidPkgs.platform-tools
$ nix-shell -p androidenv.androidPkgs.platform-tools
% adb devices
% adb devices
Line 115: Line 104:


<syntaxhighlight lang=console>
<syntaxhighlight lang=console>
$ # For nixos < 19.03
$ nix-shell -p androidenv.androidPkgs.platform-tools
$ # nix-shell -p androidenv.platformTools
$ nix-shell -p androidenv.androidPkgs_9_0.platform-tools
% adb connect 192.168.1.10
% adb connect 192.168.1.10
% adb shell
% adb shell
Line 134: Line 121:
To develop apps using [https://developer.android.com/studio/ Android Studio], install it to your system.
To develop apps using [https://developer.android.com/studio/ Android Studio], install it to your system.


<syntaxhighlight lang=nix>
<syntaxhighlight lang="nix">
{
environment.systemPackages = [
   pkgs.android-studio
   pkgs.android-studio
}
]
</syntaxhighlight>
 
By default, Android Studio has a FHS environment and by using <code>pkgs.android-studio-full</code> you get the predefined Android SDK composition including (as of nixos-unstable on 2024-11-02) platforms 28-34, an emulator, many system images and the NDK.
 
Notice: to install Android Studio, you have to indicate accepting the EULA. If you don't, the rebuild fails and prints the EULA. The simplest way to acknowledge it is to add this line to your config: <syntaxhighlight lang="nix">
nixpkgs.config.android_sdk.accept_license = true;
</syntaxhighlight>
</syntaxhighlight>
To use the Android Emulator, you need to enable KVM virtualization (in your BIOS) and make sure your user has permission to use KVM (add yourself to the <code>kvm</code> group).


=== gradlew ===
=== gradlew ===
Line 151: Line 146:
   targetPkgs = pkgs: (with pkgs;
   targetPkgs = pkgs: (with pkgs;
     [
     [
       androidenv.androidPkgs_9_0.androidsdk
       androidenv.androidPkgs.androidsdk
       glibc
       glibc
     ]);
     ]);
Line 164: Line 159:


let
let
   androidSdk = pkgs.androidenv.androidPkgs_9_0.androidsdk;
   androidSdk = pkgs.androidenv.androidPkgs.androidsdk;
in
in
pkgs.mkShell {
pkgs.mkShell {
Line 180: Line 175:
=== Building Android on NixOS ===
=== 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.
It's possible to use nix-shell with buildFHSEnv 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">
<syntaxhighlight lang="nix">
{ pkgs ? import <nixpkgs> {} }:
{ pkgs ? import <nixpkgs> {} }:
   
   
let fhs = pkgs.buildFHSUserEnv {
let fhs = pkgs.buildFHSEnv {
   name = "android-env";
   name = "android-env";
   targetPkgs = pkgs: with pkgs;
   targetPkgs = pkgs: with pkgs;
     [ git
     [
      git
       gitRepo
       gitRepo
       gnupg
       gnupg
Line 196: Line 192:
       gnumake
       gnumake
       nettools
       nettools
       # For nixos < 19.03, use `androidenv.platformTools`, or for nixos > 24.05 use `androidenv.androidPkgs.platform-tools`
       androidenv.androidPkgs.platform-tools
      androidenv.androidPkgs_9_0.platform-tools
       jdk
       jdk
       schedtool
       schedtool
Line 229: Line 224:
   shellHook = "exec android-env";
   shellHook = "exec android-env";


}
</syntaxhighlight>
=== Android Debug Bridge ===
Run <code>nix-shell -p usbutils --run "lsusb"</code> on your terminal to get the list of USB devices connected to your computer. Sample output:<pre>
...
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 002 Device 007: ID 0fce:320d Sony Ericsson Mobile Communications AB Xperia 5 III
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
...
</pre>
<code>ID 0fce:320d</code> can be seen as: <code>idVendor = 0fce</code> and <code>idProduct = 320d</code>.
<syntaxhighlight lang="nix">
{
  programs.adb.enable = true;
  services.udev.extraRules =
    let
      # nix-shell -p usbutils --run "lsusb"
      idVendor = "0fce"; # Change according to the guide above
      idProduct = "320d"; # Change according to the guide above
    in
    ''
      SUBSYSTEM=="usb", ATTR{idVendor}=="${idVendor}", MODE="[]", GROUP="adbusers", TAG+="uaccess"
      SUBSYSTEM=="usb", ATTR{idVendor}=="${idVendor}", ATTR{idProduct}=="${idProduct}", SYMLINK+="android_adb"
      SUBSYSTEM=="usb", ATTR{idVendor}=="${idVendor}", ATTR{idProduct}=="${idProduct}", SYMLINK+="android_fastboot"
    '';
  # add user to adbusers group
  users.users.myUser = {
  isNormalUser = true;
  extraGroups = [ "adbusers" ];
  };
}
}
</syntaxhighlight>
</syntaxhighlight>
Line 236: Line 266:
# [https://github.com/danielfullmer/robotnix robotnix], building aosp roms (e.g. LineageOS) with nix.
# [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.
# [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.
# [https://wiki.archlinux.org/title/Android_Debug_Bridge Archlinux Wiki to Android_Debug_Bridge]
[[Category:Development]]