

GitHub - t184256/nix-on-droid: Nix-enabled environment for your Android device.
source link: https://github.com/t184256/nix-on-droid
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Nix-on-Droid
Nix package manager on Android, in a single-click installable package. This is not full NixOS running inside Android, but you get easy access to nixpkgs' vast collection of (precompiled!) software and the best package manager under the sun. It's prototype-grade quality as of now, but hey, it works!
It does not require root, user namespaces support or disabling SELinux,
but it relies on proot
and other hacks instead.
It uses a fork
of Termux-the-terminal-emulator app,
but has no relation to Termux-the-distro.
Please do not pester Termux folks about Nix-on-Droid.
This repository contains:
- Nix expressions that generate a bootstrap zipball,
which is then used to install Nix package manager on Android
along with the
nix-on-droid
executable. - A module system for configuring the local Nix-on-Droid installation directly on the device.
It is only tested with aarch64 (64-bit ARM devices). It also used to compile for i686 devices, but the developers don't own any and nobody has reported whether it actually worked or not, so it's no longer built unless a user shows up. Sorry, it would not work on 32-bit ARM devices and it's not an easy feat to pull off.
Try it out
Install it from F-Droid, launch the app, press OK, expect many hundreds megabytes of downloads to happen.
nix-on-droid
and the module system
Config file
The Nix-on-Droid system can be managed through a custom config
file in ~/.config/nixpkgs/nix-on-droid.nix
as generated on first build,
for example:
{ pkgs, ... }:
{
environment.packages = [ pkgs.vim ];
system.stateVersion = "21.11";
}
An alternative location is ~/.config/nixpkgs/config.nix
with the key
nix-on-droid
, for example:
{
nix-on-droid =
{ pkgs, ... }:
{
environment.packages = [ pkgs.vim ];
system.stateVersion = "21.11";
};
}
Currently there is no complete list of all available options. Please have a
look inside the ./modules
directory for all modules.
home-manager
integration
To enable home-manager
you simply need to follow the instructions already provided in the example nix-on-droid.nix
:
- Add
home-manager
channel:nix-channel --add https://github.com/rycee/home-manager/archive/release-21.11.tar.gz home-manager nix-channel --update
- Configure
home-manager
:{ pkgs, ... }: { # Read nix-on-droid changelog before changing this value system.stateVersion = "21.11"; # insert nix-on-droid config home-manager.config = { pkgs, ... }: { # Read home-manager changelog before changing this value home.stateVersion = "21.11"; # insert home-manager config }; # or if you have a separate home.nix already present: home-manager.config = import ./home.nix; }
nix-on-droid
executable
This executable is responsible for activating new configurations:
Use nix-on-droid switch
to activate the current configuration and
nix-on-droid rollback
to rollback to the latest build.
For more information, please run nix-on-droid help
.
Build nix-on-droid
on your own
The terminal emulator part is probably not interesting for you, just download and use a prebuilt one. If you really want to rebuild it, you can just use Android Studio for that.
The zipball generation is probably what you are after. Get an x86_64 computer with Nix. Run
nix build -f ./pkgs --argstr arch aarch64 bootstrapZip
Put the zip file from result
on some HTTP server
and specify the parent directory URL during the installation.
To re-trigger the installation, you can use
'clear data' on the Android app (after backing stuff up, obviously).
If you want to change the nix-on-droid channel to your custom one,
you can do that either with nix-channel
after the installation,
or by using --argstr nixOnDroidChannelURL <URL>
.
Note: The proot
binary is not built on the android device
(NDK is required for building it, and it's not available on mobile platforms).
The way we work around it is to push proot derivation to cachix.
The current workaround is to hardcode the path to the wanted proot
nix store
path in modules/environment/login/default.nix
. During evaluation time on
the android device this store path will be downloaded from the binary cache
(https://nix-on-droid.cachix.org/). This in return means the proot
derivation has to be present there or in any other binary cache configured
in the nix.conf
on the device.
Obviously it's an annoyance if one wants to fork this repo and test something. To minimize the hassle with this scenario, proot derivation is also bundled with the bootstrap zipball. This way you only need your own binary cache if you are planning to maintain a long-term fork that users can update from. In case you only care about updates through wiping the data, or are forking to submit a one-off pull request, you shouldn't need a binary cache for that.
Nix flakes
Note: Nix flake support is still experimental at the moment and subject to change.
Do not run nix profile
because this will render your environment incompatible with nix-on-droid
as it relies on
nix-env
.
Minimal example
{
description = "nix-on-droid configuration";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/release-21.11";
nix-on-droid.url = "github:t184256/nix-on-droid";
nix-on-droid.inputs.nixpkgs.follows = "nixpkgs";
};
outputs = { nix-on-droid, ... }: {
nixOnDroidConfigurations = {
device = nix-on-droid.lib.nixOnDroidConfiguration {
config = ./nix-on-droid.nix;
system = "aarch64-linux";
};
};
};
}
Advanced example
{
description = "nix-on-droid configuration";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/release-21.11";
home-manager.url = "github:nix-community/home-manager/release-21.11";
nix-on-droid.url = "github:t184256/nix-on-droid";
nix-on-droid.inputs.nixpkgs.follows = "nixpkgs";
nix-on-droid.inputs.home-manager.follows = "home-manager";
};
outputs = { nix-on-droid, ... }: {
nixOnDroidConfigurations = {
device = nix-on-droid.lib.nixOnDroidConfiguration {
config = ./nix-on-droid.nix;
system = "aarch64-linux";
extraModules = [
# import source out-of-tree modules like:
# flake.nixOnDroidModules.module
];
extraSpecialArgs = {
# arguments to be available in every nix-on-droid module
};
# your own pkgs instance (see nix-on-droid.overlay for useful additions)
# pkgs = ...;
};
};
};
}
Usage with nix-on-droid
Use nix-on-droid switch --flake .#device
to build and activate your configuration (.#device
will expand to
.#nixOnDroidConfigurations.device
).
Note: Currently, nix-on-droid can not be built with an pure flake build because of hardcoded store paths for proot.
Therefore, every evaluation of a flake configuration will be executed with --impure
flag. (This behaviour will be
dropped as soon as the default setup does not require it anymore.)
- To grant the app access to the storage, use the toggle in the app settings (reachable from Android settings).
- If the terminal freezes, use 'Acquire wakelock' button in the notification and/or tone down your device's aggressive power saving measures.
- We have a wiki with tips and success stories, you're encouraged to add yours as well.
Technical overview
OK, real brief.
Developer's device:
proot
for the target platform is cross-compiled againstbionic
, (to fake file paths like/nix/store
; think 'userspacechroot
')- Target
nix
is taken from the original release tarball - Target
nix
database is initialized - Support scripts and config files are built with
nix
and the Nix-on-Droid module system - From these, a bootstrap zipball is built and published on an HTTP server
User's device:
- Android app is installed and launched, bootstrap URL is entered
- Bootstrap zipball gets downloaded and unpacked
- 'First boot' begins, Nix builds the environment (or, possibly, pulls it from Cachix)
- Nix installs the environment (login scripts, config files, etc.)
You can refer to a NixCon 2019 presentation talk for a more extensive overview of the subject.
Licensing and credits
Licensed under MIT License, see LICENSE. Copyright (c) 2019-2021 Alexander Sosedkin and other contributors, see AUTHORS.
Two rewrites ago it was based off the official Nix install script (https://nixos.org/nix/install), presumably written by Eelco Dolstra.
Is deployed and used with a fork of Termux-the-terminal-emulator app, but has no relation to Termux-the-distro.
Previous project that did use Termux-the-distro: https://github.com/t184256/nix-in-termux
Recommend
-
79
High quality alternative Android apps
-
77
F-Droid is a repository of verified free and open source Android apps, a client to access it, as well as a whole “app store kit”, providing all the tools nee...
-
24
F-Droid 是什么? F-Droid 是一个 Android 平台上 FOSS(Free and Open Source Software,自由开源软件)的目录,并提供下载安装支持。使用客户端可以更轻松地浏览、安装及跟进设备上的程序更新。
-
203
Jitterbug This app uses libimobiledevice and WiFi pairing to use one iOS device to launch apps with the debugger on another iOS device. This "tethered" launch allows JIT to work on the seco...
-
20
LibreTube Alternative YouTube frontend for Android buil...
-
8
📅 Dec 25, 2020 · ☕ 3 min read · ✍️ Syed Dawood IntroF-Droid is a community-maintained software repository for Android, similar to the Google Play store. The main repository, hosted by the project...
-
10
Shadowsocks A shadowsocks client A shado...
-
10
6 小时前更新:自动更新特性的相关细节补充我的上一篇文章中提到了
-
14
Emacs The extensible self-documenting text editor GNU...
-
6
Windows 11-lookalike Orange Pi (Droid) OS gets an improved Orange Pi 5B device...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK