Android: Difference between revisions
imported>ANicon111 Flutter developement environment instructions |
imported>ANicon111 Undid accidental grief |
||
Line 1: | Line 1: | ||
== | == adb setup == | ||
To | 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> {} }: | { | ||
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; [ | ||
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"; | |||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
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:
adb push
andadb pull
: see above.- via MTP, see the corresponding page
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";
}
- more information on that snippet
- A shell.nix to build LineageOS
- robotnix, building aosp roms (e.g. LineageOS) with nix.
- 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: