docs/Nixpkgs/Languages-And-Frameworks/android.section/index.html

3164 lines
73 KiB
HTML
Raw Permalink Normal View History

2024-07-24 19:14:02 +00:00
<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Aux Documentation">
<meta name="author" content="Nixpkgs Aux, and Lix Contributors">
<link rel="canonical" href="https://docs.auxolotl.org/Nixpkgs/Languages-And-Frameworks/android.section/">
<link rel="prev" href="../agda.section/">
<link rel="next" href="../beam.section/">
<link rel="icon" href="../../../assets/aux-logo.svg">
<meta name="generator" content="mkdocs-1.6.0, mkdocs-material-9.5.29">
<title>Android - Aux Docs</title>
<link rel="stylesheet" href="../../../assets/stylesheets/main.76a95c52.min.css">
<link rel="stylesheet" href="../../../assets/stylesheets/palette.06af60db.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.bunny.net/css?family=IBM+Plex+Sans:300,300i,400,400i,700,700i%7CIBM+Plex+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"IBM Plex Sans";--md-code-font:"IBM Plex Mono"}</style>
<script>__md_scope=new URL("../../..",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
<meta property="og:type" content="website" >
<meta property="og:title" content="Android {#android} - Aux Docs" >
<meta property="og:description" content="Aux Documentation" >
<meta property="og:image" content="https://docs.auxolotl.org/assets/images/social/Nixpkgs/Languages-And-Frameworks/android.section.png" >
<meta property="og:image:type" content="image/png" >
<meta property="og:image:width" content="1200" >
<meta property="og:image:height" content="630" >
<meta property="og:url" content="https://docs.auxolotl.org/Nixpkgs/Languages-And-Frameworks/android.section/" >
<meta name="twitter:card" content="summary_large_image" >
<meta name="twitter:title" content="Android {#android} - Aux Docs" >
<meta name="twitter:description" content="Aux Documentation" >
<meta name="twitter:image" content="https://docs.auxolotl.org/assets/images/social/Nixpkgs/Languages-And-Frameworks/android.section.png" >
</head>
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="blue">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#android" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../../.." title="Aux Docs" class="md-header__button md-logo" aria-label="Aux Docs" data-md-component="logo">
<img src="../../../assets/aux-logo.svg" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Aux Docs
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Android
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="blue" aria-label="Dark Mode" type="radio" name="__palette" id="__palette_0">
<label class="md-header__button md-icon" title="Dark Mode" for="__palette_1" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m17.75 4.09-2.53 1.94.91 3.06-2.63-1.81-2.63 1.81.91-3.06-2.53-1.94L12.44 4l1.06-3 1.06 3 3.19.09m3.5 6.91-1.64 1.25.59 1.98-1.7-1.17-1.7 1.17.59-1.98L15.75 11l2.06-.05L18.5 9l.69 1.95 2.06.05m-2.28 4.95c.83-.08 1.72 1.1 1.19 1.85-.32.45-.66.87-1.08 1.27C15.17 23 8.84 23 4.94 19.07c-3.91-3.9-3.91-10.24 0-14.14.4-.4.82-.76 1.27-1.08.75-.53 1.93.36 1.85 1.19-.27 2.86.69 5.83 2.89 8.02a9.96 9.96 0 0 0 8.02 2.89m-1.64 2.02a12.08 12.08 0 0 1-7.8-3.47c-2.17-2.19-3.33-5-3.49-7.82-2.81 3.14-2.7 7.96.31 10.98 3.02 3.01 7.84 3.12 10.98.31Z"/></svg>
</label>
<input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="indigo" data-md-color-accent="blue" aria-label="Light Mode" type="radio" name="__palette" id="__palette_1">
<label class="md-header__button md-icon" title="Light Mode" for="__palette_0" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 7a5 5 0 0 1 5 5 5 5 0 0 1-5 5 5 5 0 0 1-5-5 5 5 0 0 1 5-5m0 2a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3m0-7 2.39 3.42C13.65 5.15 12.84 5 12 5c-.84 0-1.65.15-2.39.42L12 2M3.34 7l4.16-.35A7.2 7.2 0 0 0 5.94 8.5c-.44.74-.69 1.5-.83 2.29L3.34 7m.02 10 1.76-3.77a7.131 7.131 0 0 0 2.38 4.14L3.36 17M20.65 7l-1.77 3.79a7.023 7.023 0 0 0-2.38-4.15l4.15.36m-.01 10-4.14.36c.59-.51 1.12-1.14 1.54-1.86.42-.73.69-1.5.83-2.29L20.64 17M12 22l-2.41-3.44c.74.27 1.55.44 2.41.44.82 0 1.63-.17 2.37-.44L12 22Z"/></svg>
</label>
</form>
<script>var media,input,key,value,palette=__md_get("__palette");if(palette&&palette.color){"(prefers-color-scheme)"===palette.color.media&&(media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']"),palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent"));for([key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
</button>
</nav>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://git.auxolotl.org/auxolotl/docs" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M16.777 0a2.9 2.9 0 1 1-2.529 4.322H12.91a4.266 4.266 0 0 0-4.265 4.195v2.118a7.076 7.076 0 0 1 4.147-1.42l.118-.002h1.338a2.9 2.9 0 0 1 5.43 1.422 2.9 2.9 0 0 1-5.43 1.422H12.91a4.266 4.266 0 0 0-4.265 4.195v2.319A2.9 2.9 0 0 1 7.222 24 2.9 2.9 0 0 1 5.8 18.57V8.589a7.109 7.109 0 0 1 6.991-7.108l.118-.001h1.338A2.9 2.9 0 0 1 16.778 0ZM7.223 19.905a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.389Zm9.554-10.464a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.39Zm0-7.735a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.389Z"/></svg>
</div>
<div class="md-source__repository">
auxolotl/docs
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../../.." class="md-tabs__link">
Aux Documentation Hub
</a>
</li>
<li class="md-tabs__item">
<a href="../../../TODO/" class="md-tabs__link">
TODO
</a>
</li>
<li class="md-tabs__item">
<a href="../../../Aux/" class="md-tabs__link">
Aux
</a>
</li>
<li class="md-tabs__item">
<a href="../../../Lix/" class="md-tabs__link">
Lix
</a>
</li>
<li class="md-tabs__item">
<a href="../../../NixOS/appstream/" class="md-tabs__link">
NixOS
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="../../" class="md-tabs__link">
Nixpkgs
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../../.." title="Aux Docs" class="md-nav__button md-logo" aria-label="Aux Docs" data-md-component="logo">
<img src="../../../assets/aux-logo.svg" alt="logo">
</a>
Aux Docs
</label>
<div class="md-nav__source">
<a href="https://git.auxolotl.org/auxolotl/docs" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M16.777 0a2.9 2.9 0 1 1-2.529 4.322H12.91a4.266 4.266 0 0 0-4.265 4.195v2.118a7.076 7.076 0 0 1 4.147-1.42l.118-.002h1.338a2.9 2.9 0 0 1 5.43 1.422 2.9 2.9 0 0 1-5.43 1.422H12.91a4.266 4.266 0 0 0-4.265 4.195v2.319A2.9 2.9 0 0 1 7.222 24 2.9 2.9 0 0 1 5.8 18.57V8.589a7.109 7.109 0 0 1 6.991-7.108l.118-.001h1.338A2.9 2.9 0 0 1 16.778 0ZM7.223 19.905a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.389Zm9.554-10.464a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.39Zm0-7.735a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.389Z"/></svg>
</div>
<div class="md-source__repository">
auxolotl/docs
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../.." class="md-nav__link">
<span class="md-ellipsis">
Aux Documentation Hub
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../TODO/" class="md-nav__link">
<span class="md-ellipsis">
TODO
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../../Aux/" class="md-nav__link">
<span class="md-ellipsis">
Aux
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../../Lix/" class="md-nav__link">
<span class="md-ellipsis">
Lix
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../../NixOS/appstream/" class="md-nav__link">
<span class="md-ellipsis">
NixOS
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" checked>
<div class="md-nav__link md-nav__container">
<a href="../../" class="md-nav__link ">
<span class="md-ellipsis">
Nixpkgs
</span>
</a>
<label class="md-nav__link " for="__nav_6" id="__nav_6_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_6">
<span class="md-nav__icon md-icon"></span>
Nixpkgs
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../options/" class="md-nav__link">
<span class="md-ellipsis">
Options
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../Build-Helpers/" class="md-nav__link">
<span class="md-ellipsis">
Build Helpers
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../Development/" class="md-nav__link">
<span class="md-ellipsis">
Development
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../Functions/" class="md-nav__link">
<span class="md-ellipsis">
Functions
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../Hooks/" class="md-nav__link">
<span class="md-ellipsis">
Hooks
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6_7" checked>
<div class="md-nav__link md-nav__container">
<a href="../" class="md-nav__link ">
<span class="md-ellipsis">
Languages And Frameworks
</span>
</a>
<label class="md-nav__link " for="__nav_6_7" id="__nav_6_7_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_6_7_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_6_7">
<span class="md-nav__icon md-icon"></span>
Languages And Frameworks
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../agda.section/" class="md-nav__link">
<span class="md-ellipsis">
Agda
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Android
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Android
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#using-androidenv-with-android-studio" class="md-nav__link">
<span class="md-ellipsis">
Using androidenv with Android Studio
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#deploying-an-android-sdk-installation-with-plugins" class="md-nav__link">
<span class="md-ellipsis">
Deploying an Android SDK installation with plugins
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#using-predefined-android-package-compositions" class="md-nav__link">
<span class="md-ellipsis">
Using predefined Android package compositions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#spawning-emulator-instances" class="md-nav__link">
<span class="md-ellipsis">
Spawning emulator instances
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#notes-on-environment-variables-in-android-projects" class="md-nav__link">
<span class="md-ellipsis">
Notes on environment variables in Android projects
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#notes-on-improving-build.gradle-compatibility" class="md-nav__link">
<span class="md-ellipsis">
Notes on improving build.gradle compatibility
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#querying-the-available-versions-of-each-plugin" class="md-nav__link">
<span class="md-ellipsis">
Querying the available versions of each plugin
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#updating-the-generated-expressions" class="md-nav__link">
<span class="md-ellipsis">
Updating the generated expressions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#building-an-android-application-with-ant" class="md-nav__link">
<span class="md-ellipsis">
Building an Android application with Ant
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../beam.section/" class="md-nav__link">
<span class="md-ellipsis">
BEAM Languages (Erlang, Elixir &amp; LFE)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../bower.section/" class="md-nav__link">
<span class="md-ellipsis">
Bower
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../chicken.section/" class="md-nav__link">
<span class="md-ellipsis">
CHICKEN
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../coq.section/" class="md-nav__link">
<span class="md-ellipsis">
Coq and coq packages
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../crystal.section/" class="md-nav__link">
<span class="md-ellipsis">
Crystal
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cuda.section/" class="md-nav__link">
<span class="md-ellipsis">
CUDA
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cuelang.section/" class="md-nav__link">
<span class="md-ellipsis">
Cue (Cuelang)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../dart.section/" class="md-nav__link">
<span class="md-ellipsis">
Dart
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../dhall.section/" class="md-nav__link">
<span class="md-ellipsis">
Dhall
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../dlang.section/" class="md-nav__link">
<span class="md-ellipsis">
D (Dlang)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../dotnet.section/" class="md-nav__link">
<span class="md-ellipsis">
Dotnet
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../emscripten.section/" class="md-nav__link">
<span class="md-ellipsis">
Emscripten
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../gnome.section/" class="md-nav__link">
<span class="md-ellipsis">
GNOME
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../go.section/" class="md-nav__link">
<span class="md-ellipsis">
Go
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../gradle.section/" class="md-nav__link">
<span class="md-ellipsis">
Gradle
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../hare.section/" class="md-nav__link">
<span class="md-ellipsis">
Hare
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../haskell.section/" class="md-nav__link">
<span class="md-ellipsis">
Haskell
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../hy.section/" class="md-nav__link">
<span class="md-ellipsis">
Hy
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../idris.section/" class="md-nav__link">
<span class="md-ellipsis">
Idris
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../idris2.section/" class="md-nav__link">
<span class="md-ellipsis">
Idris2
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ios.section/" class="md-nav__link">
<span class="md-ellipsis">
iOS
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../java.section/" class="md-nav__link">
<span class="md-ellipsis">
Java
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../javascript.section/" class="md-nav__link">
<span class="md-ellipsis">
Javascript
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../julia.section/" class="md-nav__link">
<span class="md-ellipsis">
Julia
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../lisp.section/" class="md-nav__link">
<span class="md-ellipsis">
lisp-modules
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../lua.section/" class="md-nav__link">
<span class="md-ellipsis">
Lua
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../maven.section/" class="md-nav__link">
<span class="md-ellipsis">
Maven
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../nim.section/" class="md-nav__link">
<span class="md-ellipsis">
Nim
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ocaml.section/" class="md-nav__link">
<span class="md-ellipsis">
OCaml
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../octave.section/" class="md-nav__link">
<span class="md-ellipsis">
Octave
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../perl.section/" class="md-nav__link">
<span class="md-ellipsis">
Perl
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../php.section/" class="md-nav__link">
<span class="md-ellipsis">
PHP
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../pkg-config.section/" class="md-nav__link">
<span class="md-ellipsis">
pkg-config
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../python.section/" class="md-nav__link">
<span class="md-ellipsis">
Python
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../qt.section/" class="md-nav__link">
<span class="md-ellipsis">
Qt
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../r.section/" class="md-nav__link">
<span class="md-ellipsis">
R
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ruby.section/" class="md-nav__link">
<span class="md-ellipsis">
Ruby
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../rust.section/" class="md-nav__link">
<span class="md-ellipsis">
Rust
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../scheme.section/" class="md-nav__link">
<span class="md-ellipsis">
Scheme
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../swift.section/" class="md-nav__link">
<span class="md-ellipsis">
Swift
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../texlive.section/" class="md-nav__link">
<span class="md-ellipsis">
TeX Live
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../titanium.section/" class="md-nav__link">
<span class="md-ellipsis">
Titanium
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../vim.section/" class="md-nav__link">
<span class="md-ellipsis">
Vim
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../Library-Reference/asserts/" class="md-nav__link">
<span class="md-ellipsis">
Library Reference
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../Module-System/module-system.chapter/" class="md-nav__link">
<span class="md-ellipsis">
Module System
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../Packages/" class="md-nav__link">
<span class="md-ellipsis">
Packages
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../Standard-Environment/" class="md-nav__link">
<span class="md-ellipsis">
Standard Environment
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../Using-Nixpkgs/" class="md-nav__link">
<span class="md-ellipsis">
Using Nixpkgs
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#using-androidenv-with-android-studio" class="md-nav__link">
<span class="md-ellipsis">
Using androidenv with Android Studio
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#deploying-an-android-sdk-installation-with-plugins" class="md-nav__link">
<span class="md-ellipsis">
Deploying an Android SDK installation with plugins
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#using-predefined-android-package-compositions" class="md-nav__link">
<span class="md-ellipsis">
Using predefined Android package compositions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#spawning-emulator-instances" class="md-nav__link">
<span class="md-ellipsis">
Spawning emulator instances
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#notes-on-environment-variables-in-android-projects" class="md-nav__link">
<span class="md-ellipsis">
Notes on environment variables in Android projects
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#notes-on-improving-build.gradle-compatibility" class="md-nav__link">
<span class="md-ellipsis">
Notes on improving build.gradle compatibility
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#querying-the-available-versions-of-each-plugin" class="md-nav__link">
<span class="md-ellipsis">
Querying the available versions of each plugin
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#updating-the-generated-expressions" class="md-nav__link">
<span class="md-ellipsis">
Updating the generated expressions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#building-an-android-application-with-ant" class="md-nav__link">
<span class="md-ellipsis">
Building an Android application with Ant
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="android">Android</h1>
<p>The Android build environment provides three major features and a number of
supporting features.</p>
<h2 id="using-androidenv-with-android-studio">Using androidenv with Android Studio</h2>
<p>Use the <code>android-studio-full</code> attribute for a very complete Android SDK, including system images:</p>
<div class="highlight"><pre><span></span><code><span class="ss">buildInputs</span> <span class="o">=</span> <span class="p">[</span> android-studio-full <span class="p">];</span>
</code></pre></div>
<p>This is identical to:</p>
<div class="highlight"><pre><span></span><code><span class="ss">buildInputs</span> <span class="o">=</span> <span class="p">[</span> androidStudioPackages<span class="o">.</span>stable<span class="o">.</span>full <span class="p">];</span>
</code></pre></div>
<p>Alternatively, you can pass composeAndroidPackages to the <code>withSdk</code> passthru:</p>
<div class="highlight"><pre><span></span><code><span class="ss">buildInputs</span> <span class="o">=</span> <span class="p">[</span>
<span class="p">(</span>android-studio<span class="o">.</span>withSdk <span class="p">(</span>androidenv<span class="o">.</span>composeAndroidPackages <span class="p">{</span>
<span class="ss">includeNDK</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span>
<span class="p">})</span><span class="o">.</span>androidsdk<span class="p">)</span>
<span class="p">];</span>
</code></pre></div>
<p>These will export ANDROID_SDK_ROOT and ANDROID_NDK_ROOT to the SDK and NDK directories
in the specified Android build environment.</p>
<h2 id="deploying-an-android-sdk-installation-with-plugins">Deploying an Android SDK installation with plugins</h2>
<p>Alternatively, you can deploy the SDK separately with a desired set of plugins, or subsets of an SDK.</p>
<div class="highlight"><pre><span></span><code><span class="k">with</span> <span class="nb">import</span> <span class="l">&lt;nixpkgs&gt;</span> <span class="p">{};</span>
<span class="k">let</span>
<span class="ss">androidComposition</span> <span class="o">=</span> androidenv<span class="o">.</span>composeAndroidPackages <span class="p">{</span>
<span class="ss">cmdLineToolsVersion</span> <span class="o">=</span> <span class="s2">&quot;8.0&quot;</span><span class="p">;</span>
<span class="ss">toolsVersion</span> <span class="o">=</span> <span class="s2">&quot;26.1.1&quot;</span><span class="p">;</span>
<span class="ss">platformToolsVersion</span> <span class="o">=</span> <span class="s2">&quot;30.0.5&quot;</span><span class="p">;</span>
<span class="ss">buildToolsVersions</span> <span class="o">=</span> <span class="p">[</span> <span class="s2">&quot;30.0.3&quot;</span> <span class="p">];</span>
<span class="ss">includeEmulator</span> <span class="o">=</span> <span class="no">false</span><span class="p">;</span>
<span class="ss">emulatorVersion</span> <span class="o">=</span> <span class="s2">&quot;30.3.4&quot;</span><span class="p">;</span>
<span class="ss">platformVersions</span> <span class="o">=</span> <span class="p">[</span> <span class="s2">&quot;28&quot;</span> <span class="s2">&quot;29&quot;</span> <span class="s2">&quot;30&quot;</span> <span class="p">];</span>
<span class="ss">includeSources</span> <span class="o">=</span> <span class="no">false</span><span class="p">;</span>
<span class="ss">includeSystemImages</span> <span class="o">=</span> <span class="no">false</span><span class="p">;</span>
<span class="ss">systemImageTypes</span> <span class="o">=</span> <span class="p">[</span> <span class="s2">&quot;google_apis_playstore&quot;</span> <span class="p">];</span>
<span class="ss">abiVersions</span> <span class="o">=</span> <span class="p">[</span> <span class="s2">&quot;armeabi-v7a&quot;</span> <span class="s2">&quot;arm64-v8a&quot;</span> <span class="p">];</span>
<span class="ss">cmakeVersions</span> <span class="o">=</span> <span class="p">[</span> <span class="s2">&quot;3.10.2&quot;</span> <span class="p">];</span>
<span class="ss">includeNDK</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span>
<span class="ss">ndkVersions</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;22.0.7026061&quot;</span><span class="p">];</span>
<span class="ss">useGoogleAPIs</span> <span class="o">=</span> <span class="no">false</span><span class="p">;</span>
<span class="ss">useGoogleTVAddOns</span> <span class="o">=</span> <span class="no">false</span><span class="p">;</span>
<span class="ss">includeExtras</span> <span class="o">=</span> <span class="p">[</span>
<span class="s2">&quot;extras;google;gcm&quot;</span>
<span class="p">];</span>
<span class="p">};</span>
<span class="k">in</span>
androidComposition<span class="o">.</span>androidsdk
</code></pre></div>
<p>The above function invocation states that we want an Android SDK with the above
specified plugin versions. By default, most plugins are disabled. Notable
exceptions are the tools, platform-tools and build-tools sub packages.</p>
<p>The following parameters are supported:</p>
<ul>
<li><code>cmdLineToolsVersion</code>, specifies the version of the <code>cmdline-tools</code> package to use</li>
<li><code>toolsVersion</code>, specifies the version of the <code>tools</code> package. Notice <code>tools</code> is
obsolete, and currently only <code>26.1.1</code> is available, so there's not a lot of
options here, however, you can set it as <code>null</code> if you don't want it.</li>
<li><code>platformsToolsVersion</code> specifies the version of the <code>platform-tools</code> plugin</li>
<li><code>buildToolsVersions</code> specifies the versions of the <code>build-tools</code> plugins to
use.</li>
<li><code>includeEmulator</code> specifies whether to deploy the emulator package (<code>false</code>
by default). When enabled, the version of the emulator to deploy can be
specified by setting the <code>emulatorVersion</code> parameter.</li>
<li><code>cmakeVersions</code> specifies which CMake versions should be deployed.</li>
<li><code>includeNDK</code> specifies that the Android NDK bundle should be included.
Defaults to: <code>false</code>.</li>
<li><code>ndkVersions</code> specifies the NDK versions that we want to use. These are linked
under the <code>ndk</code> directory of the SDK root, and the first is linked under the
<code>ndk-bundle</code> directory.</li>
<li><code>ndkVersion</code> is equivalent to specifying one entry in <code>ndkVersions</code>, and
<code>ndkVersions</code> overrides this parameter if provided.</li>
<li><code>includeExtras</code> is an array of identifier strings referring to arbitrary
add-on packages that should be installed.</li>
<li><code>platformVersions</code> specifies which platform SDK versions should be included.</li>
</ul>
<p>For each platform version that has been specified, we can apply the following
options:</p>
<ul>
<li><code>includeSystemImages</code> specifies whether a system image for each platform SDK
should be included.</li>
<li><code>includeSources</code> specifies whether the sources for each SDK version should be
included.</li>
<li><code>useGoogleAPIs</code> specifies that for each selected platform version the
Google API should be included.</li>
<li><code>useGoogleTVAddOns</code> specifies that for each selected platform version the
Google TV add-on should be included.</li>
</ul>
<p>For each requested system image we can specify the following options:</p>
<ul>
<li><code>systemImageTypes</code> specifies what kind of system images should be included.
Defaults to: <code>default</code>.</li>
<li><code>abiVersions</code> specifies what kind of ABI version of each system image should
be included. Defaults to: <code>armeabi-v7a</code>.</li>
</ul>
<p>Most of the function arguments have reasonable default settings.</p>
<p>You can specify license names:</p>
<ul>
<li><code>extraLicenses</code> is a list of license names.
You can get these names from repo.json or <code>querypackages.sh licenses</code>. The SDK
license (<code>android-sdk-license</code>) is accepted for you if you set accept_license
to true. If you are doing something like working with preview SDKs, you will
want to add <code>android-sdk-preview-license</code> or whichever license applies here.</li>
</ul>
<p>Additionally, you can override the repositories that composeAndroidPackages will
pull from:</p>
<ul>
<li><code>repoJson</code> specifies a path to a generated repo.json file. You can generate this
by running <code>generate.sh</code>, which in turn will call into <code>mkrepo.rb</code>.</li>
<li><code>repoXmls</code> is an attribute set containing paths to repo XML files. If specified,
it takes priority over <code>repoJson</code>, and will trigger a local build writing out a
repo.json to the Nix store based on the given repository XMLs.</li>
</ul>
<div class="highlight"><pre><span></span><code><span class="p">{</span>
<span class="ss">repoXmls</span> <span class="o">=</span> <span class="p">{</span>
<span class="ss">packages</span> <span class="o">=</span> <span class="p">[</span> <span class="l">./xml/repository2-1.xml</span> <span class="p">];</span>
<span class="ss">images</span> <span class="o">=</span> <span class="p">[</span>
<span class="l">./xml/android-sys-img2-1.xml</span>
<span class="l">./xml/android-tv-sys-img2-1.xml</span>
<span class="l">./xml/android-wear-sys-img2-1.xml</span>
<span class="l">./xml/android-wear-cn-sys-img2-1.xml</span>
<span class="l">./xml/google_apis-sys-img2-1.xml</span>
<span class="l">./xml/google_apis_playstore-sys-img2-1.xml</span>
<span class="p">];</span>
<span class="ss">addons</span> <span class="o">=</span> <span class="p">[</span> <span class="l">./xml/addon2-1.xml</span> <span class="p">];</span>
<span class="p">};</span>
<span class="p">}</span>
</code></pre></div>
<p>When building the above expression with:</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>nix-build
</code></pre></div>
<p>The Android SDK gets deployed with all desired plugin versions.</p>
<p>We can also deploy subsets of the Android SDK. For example, to only the
<code>platform-tools</code> package, you can evaluate the following expression:</p>
<div class="highlight"><pre><span></span><code><span class="k">with</span> <span class="nb">import</span> <span class="l">&lt;nixpkgs&gt;</span> <span class="p">{};</span>
<span class="k">let</span>
<span class="ss">androidComposition</span> <span class="o">=</span> androidenv<span class="o">.</span>composeAndroidPackages <span class="p">{</span>
<span class="c1"># ...</span>
<span class="p">};</span>
<span class="k">in</span>
androidComposition<span class="o">.</span>platform-tools
</code></pre></div>
<h2 id="using-predefined-android-package-compositions">Using predefined Android package compositions</h2>
<p>In addition to composing an Android package set manually, it is also possible
to use a predefined composition that contains a fairly complete set of Android packages:</p>
<p>The following Nix expression can be used to deploy the entire SDK:</p>
<div class="highlight"><pre><span></span><code><span class="k">with</span> <span class="nb">import</span> <span class="l">&lt;nixpkgs&gt;</span> <span class="p">{};</span>
androidenv<span class="o">.</span>androidPkgs<span class="o">.</span>androidsdk
</code></pre></div>
<p>It is also possible to use one plugin only:</p>
<div class="highlight"><pre><span></span><code><span class="k">with</span> <span class="nb">import</span> <span class="l">&lt;nixpkgs&gt;</span> <span class="p">{};</span>
androidenv<span class="o">.</span>androidPkgs<span class="o">.</span>platform-tools
</code></pre></div>
<h2 id="spawning-emulator-instances">Spawning emulator instances</h2>
<p>For testing purposes, it can also be quite convenient to automatically generate
scripts that spawn emulator instances with all desired configuration settings.</p>
<p>An emulator spawn script can be configured by invoking the <code>emulateApp {}</code>
function:</p>
<div class="highlight"><pre><span></span><code><span class="k">with</span> <span class="nb">import</span> <span class="l">&lt;nixpkgs&gt;</span> <span class="p">{};</span>
androidenv<span class="o">.</span>emulateApp <span class="p">{</span>
<span class="ss">name</span> <span class="o">=</span> <span class="s2">&quot;emulate-MyAndroidApp&quot;</span><span class="p">;</span>
<span class="ss">platformVersion</span> <span class="o">=</span> <span class="s2">&quot;28&quot;</span><span class="p">;</span>
<span class="ss">abiVersion</span> <span class="o">=</span> <span class="s2">&quot;x86&quot;</span><span class="p">;</span> <span class="c1"># armeabi-v7a, mips, x86_64</span>
<span class="ss">systemImageType</span> <span class="o">=</span> <span class="s2">&quot;google_apis_playstore&quot;</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p>Additional flags may be applied to the Android SDK's emulator through the runtime environment variable <code>$NIX_ANDROID_EMULATOR_FLAGS</code>.</p>
<p>It is also possible to specify an APK to deploy inside the emulator
and the package and activity names to launch it:</p>
<div class="highlight"><pre><span></span><code><span class="k">with</span> <span class="nb">import</span> <span class="l">&lt;nixpkgs&gt;</span> <span class="p">{};</span>
androidenv<span class="o">.</span>emulateApp <span class="p">{</span>
<span class="ss">name</span> <span class="o">=</span> <span class="s2">&quot;emulate-MyAndroidApp&quot;</span><span class="p">;</span>
<span class="ss">platformVersion</span> <span class="o">=</span> <span class="s2">&quot;24&quot;</span><span class="p">;</span>
<span class="ss">abiVersion</span> <span class="o">=</span> <span class="s2">&quot;armeabi-v7a&quot;</span><span class="p">;</span> <span class="c1"># mips, x86, x86_64</span>
<span class="ss">systemImageType</span> <span class="o">=</span> <span class="s2">&quot;default&quot;</span><span class="p">;</span>
<span class="ss">app</span> <span class="o">=</span> <span class="l">./MyApp.apk</span><span class="p">;</span>
<span class="ss">package</span> <span class="o">=</span> <span class="s2">&quot;MyApp&quot;</span><span class="p">;</span>
<span class="ss">activity</span> <span class="o">=</span> <span class="s2">&quot;MainActivity&quot;</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p>In addition to prebuilt APKs, you can also bind the APK parameter to a
<code>buildApp {}</code> function invocation shown in the previous example.</p>
<h2 id="notes-on-environment-variables-in-android-projects">Notes on environment variables in Android projects</h2>
<ul>
<li><code>ANDROID_HOME</code> should point to the Android SDK. In your Nix expressions, this should be
<code>${androidComposition.androidsdk}/libexec/android-sdk</code>. Note that <code>ANDROID_SDK_ROOT</code> is deprecated,
but if you rely on tools that need it, you can export it too.</li>
<li><code>ANDROID_NDK_ROOT</code> should point to the Android NDK, if you're doing NDK development.
In your Nix expressions, this should be <code>${ANDROID_HOME}/ndk-bundle</code>.</li>
</ul>
<p>If you are running the Android Gradle plugin, you need to export GRADLE_OPTS to override aapt2
to point to the aapt2 binary in the Nix store as well, or use a FHS environment so the packaged
aapt2 can run. If you don't want to use a FHS environment, something like this should work:</p>
<div class="highlight"><pre><span></span><code><span class="k">let</span>
<span class="ss">buildToolsVersion</span> <span class="o">=</span> <span class="s2">&quot;30.0.3&quot;</span><span class="p">;</span>
<span class="c1"># Use buildToolsVersion when you define androidComposition</span>
<span class="ss">androidComposition</span> <span class="o">=</span> <span class="l">&lt;...&gt;</span><span class="p">;</span>
<span class="k">in</span>
pkgs<span class="o">.</span>mkShell <span class="k">rec</span> <span class="p">{</span>
<span class="ss">ANDROID_HOME</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">${</span>androidComposition<span class="o">.</span>androidsdk<span class="si">}</span><span class="s2">/libexec/android-sdk&quot;</span><span class="p">;</span>
<span class="ss">ANDROID_NDK_ROOT</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">${</span>ANDROID_HOME<span class="si">}</span><span class="s2">/ndk-bundle&quot;</span><span class="p">;</span>
<span class="c1"># Use the same buildToolsVersion here</span>
<span class="ss">GRADLE_OPTS</span> <span class="o">=</span> <span class="s2">&quot;-Dorg.gradle.project.android.aapt2FromMavenOverride=</span><span class="si">${</span>ANDROID_HOME<span class="si">}</span><span class="s2">/build-tools/</span><span class="si">${</span>buildToolsVersion<span class="si">}</span><span class="s2">/aapt2&quot;</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p>If you are using cmake, you need to add it to PATH in a shell hook or FHS env profile.
The path is suffixed with a build number, but properly prefixed with the version.
So, something like this should suffice:</p>
<div class="highlight"><pre><span></span><code><span class="k">let</span>
<span class="ss">cmakeVersion</span> <span class="o">=</span> <span class="s2">&quot;3.10.2&quot;</span><span class="p">;</span>
<span class="c1"># Use cmakeVersion when you define androidComposition</span>
<span class="ss">androidComposition</span> <span class="o">=</span> <span class="l">&lt;...&gt;</span><span class="p">;</span>
<span class="k">in</span>
pkgs<span class="o">.</span>mkShell <span class="k">rec</span> <span class="p">{</span>
<span class="ss">ANDROID_HOME</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">${</span>androidComposition<span class="o">.</span>androidsdk<span class="si">}</span><span class="s2">/libexec/android-sdk&quot;</span><span class="p">;</span>
<span class="ss">ANDROID_NDK_ROOT</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">${</span>ANDROID_HOME<span class="si">}</span><span class="s2">/ndk-bundle&quot;</span><span class="p">;</span>
<span class="c1"># Use the same cmakeVersion here</span>
<span class="ss">shellHook</span> <span class="o">=</span> <span class="s s-Multiline">&#39;&#39;</span>
<span class="s s-Multiline"> export PATH=&quot;$(echo &quot;$ANDROID_HOME/cmake/</span><span class="si">${</span>cmakeVersion<span class="si">}</span><span class="s s-Multiline">&quot;.*/bin):$PATH&quot;</span>
<span class="s s-Multiline"> &#39;&#39;</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p>Note that running Android Studio with ANDROID_HOME set will automatically write a
<code>local.properties</code> file with <code>sdk.dir</code> set to $ANDROID_HOME if one does not already
exist. If you are using the NDK as well, you may have to add <code>ndk.dir</code> to this file.</p>
<p>An example shell.nix that does all this for you is provided in examples/shell.nix.
This shell.nix includes a shell hook that overwrites local.properties with the correct
sdk.dir and ndk.dir values. This will ensure that the SDK and NDK directories will
both be correct when you run Android Studio inside nix-shell.</p>
<h2 id="notes-on-improving-build.gradle-compatibility">Notes on improving build.gradle compatibility</h2>
<p>Ensure that your buildToolsVersion and ndkVersion match what is declared in androidenv.
If you are using cmake, make sure its declared version is correct too.</p>
<p>Otherwise, you may get cryptic errors from aapt2 and the Android Gradle plugin warning
that it cannot install the build tools because the SDK directory is not writeable.</p>
<div class="highlight"><pre><span></span><code>android {
buildToolsVersion &quot;30.0.3&quot;
ndkVersion = &quot;22.0.7026061&quot;
externalNativeBuild {
cmake {
version &quot;3.10.2&quot;
}
}
}
</code></pre></div>
<h2 id="querying-the-available-versions-of-each-plugin">Querying the available versions of each plugin</h2>
<p>repo.json provides all the options in one file now.</p>
<p>A shell script in the <code>pkgs/development/mobile/androidenv/</code> subdirectory can be used to retrieve all
possible options:</p>
<div class="highlight"><pre><span></span><code>./querypackages.sh<span class="w"> </span>packages
</code></pre></div>
<p>The above command-line instruction queries all package versions in repo.json.</p>
<h2 id="updating-the-generated-expressions">Updating the generated expressions</h2>
<p>repo.json is generated from XML files that the Android Studio package manager uses.
To update the expressions run the <code>generate.sh</code> script that is stored in the
<code>pkgs/development/mobile/androidenv/</code> subdirectory:</p>
<div class="highlight"><pre><span></span><code>./generate.sh
</code></pre></div>
<h2 id="building-an-android-application-with-ant">Building an Android application with Ant</h2>
<p>In addition to the SDK, it is also possible to build an Ant-based Android
project and automatically deploy all the Android plugins that a project
requires. Most newer Android projects use Gradle, and this is included for historical
purposes.</p>
<div class="highlight"><pre><span></span><code><span class="k">with</span> <span class="nb">import</span> <span class="l">&lt;nixpkgs&gt;</span> <span class="p">{};</span>
androidenv<span class="o">.</span>buildApp <span class="p">{</span>
<span class="ss">name</span> <span class="o">=</span> <span class="s2">&quot;MyAndroidApp&quot;</span><span class="p">;</span>
<span class="ss">src</span> <span class="o">=</span> <span class="l">./myappsources</span><span class="p">;</span>
<span class="ss">release</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span>
<span class="c1"># If release is set to true, you need to specify the following parameters</span>
<span class="ss">keyStore</span> <span class="o">=</span> <span class="l">./keystore</span><span class="p">;</span>
<span class="ss">keyAlias</span> <span class="o">=</span> <span class="s2">&quot;myfirstapp&quot;</span><span class="p">;</span>
<span class="ss">keyStorePassword</span> <span class="o">=</span> <span class="s2">&quot;mykeystore&quot;</span><span class="p">;</span>
<span class="ss">keyAliasPassword</span> <span class="o">=</span> <span class="s2">&quot;myfirstapp&quot;</span><span class="p">;</span>
<span class="c1"># Any Android SDK parameters that install all the relevant plugins that a</span>
<span class="c1"># build requires</span>
<span class="ss">platformVersions</span> <span class="o">=</span> <span class="p">[</span> <span class="s2">&quot;24&quot;</span> <span class="p">];</span>
<span class="c1"># When we include the NDK, then ndk-build is invoked before Ant gets invoked</span>
<span class="ss">includeNDK</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p>Aside from the app-specific build parameters (<code>name</code>, <code>src</code>, <code>release</code> and
keystore parameters), the <code>buildApp {}</code> function supports all the function
parameters that the SDK composition function (the function shown in the
previous section) supports.</p>
<p>This build function is particularly useful when it is desired to use
<a href="https://nixos.org/hydra">Hydra</a>: the Nix-based continuous integration solution
to build Android apps. An Android APK gets exposed as a build product and can be
installed on any Android device with a web browser by navigating to the build
result page.</p>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
<div class="md-copyright__highlight">
Licenced MIT
</div>
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
<div class="md-social">
<a href="https://git.auxolotl.org/auxolotl/docs" target="_blank" rel="noopener" title="Aux Docs Repo" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M16.777 0a2.9 2.9 0 1 1-2.529 4.322H12.91a4.266 4.266 0 0 0-4.265 4.195v2.118a7.076 7.076 0 0 1 4.147-1.42l.118-.002h1.338a2.9 2.9 0 0 1 5.43 1.422 2.9 2.9 0 0 1-5.43 1.422H12.91a4.266 4.266 0 0 0-4.265 4.195v2.319A2.9 2.9 0 0 1 7.222 24 2.9 2.9 0 0 1 5.8 18.57V8.589a7.109 7.109 0 0 1 6.991-7.108l.118-.001h1.338A2.9 2.9 0 0 1 16.778 0ZM7.223 19.905a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.389Zm9.554-10.464a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.39Zm0-7.735a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.389Z"/></svg>
</a>
<a href="https://forum.aux.computer/" target="_blank" rel="noopener" title="Aux Forum" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12.103 0C18.666 0 24 5.485 24 11.997c0 6.51-5.33 11.99-11.9 11.99L0 24V11.79C0 5.28 5.532 0 12.103 0zm.116 4.563a7.395 7.395 0 0 0-6.337 3.57 7.247 7.247 0 0 0-.148 7.22L4.4 19.61l4.794-1.074a7.424 7.424 0 0 0 8.136-1.39 7.256 7.256 0 0 0 1.737-7.997 7.375 7.375 0 0 0-6.84-4.585h-.008z"/></svg>
</a>
<a href="https://wiki.auxolotl.org/" target="_blank" rel="noopener" title="Aux Wiki" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17.801 13.557c.148.098.288.202.417.313 1.854 1.6 3.127 4.656 2.582 7.311-1.091-.255-5.747-1.055-7.638-3.383-.91-1.12-1.366-2.081-1.569-2.885a5.65 5.65 0 0 0 .034-.219c.089.198.197.35.313.466.24.24.521.335.766.372.304.046.594-.006.806-.068l.001.001c.05-.015.433-.116.86-.342.325-.173 2.008-.931 3.428-1.566Zm-7.384 1.435C9.156 16.597 6.6 18.939.614 18.417c.219-1.492 1.31-3.019 2.51-4.11.379-.345.906-.692 1.506-1.009.286.168.598.332.939.486 2.689 1.221 3.903 1.001 4.89.573a1.3 1.3 0 0 0 .054-.025 6.156 6.156 0 0 0-.096.66Zm4.152-.462c.38-.341.877-.916 1.383-1.559-.389-.15-.866-.371-1.319-.591-.598-.29-1.305-.283-2.073-.315a4.685 4.685 0 0 1-.804-.103c.014-.123.027-.246.038-.369.062.104.673.057.871.057.354 0 1.621.034 3.074-.574 1.452-.608 2.55-1.706 3.022-3.225.474-1.52.22-3.091-.168-3.952-.169.709-1.453 2.381-1.926 2.871-.473.489-2.381 2.296-2.972 2.921-.7.74-.688.793-1.332 1.302-.202.19-.499.402-.563.53.027-.338.039-.675.027-.997a7.653 7.653 0 0 0-.032-.523c.322-.059.567-.522.567-.861 0-.224-.106-.247-.271-.229.075-.894.382-3.923 1.254-4.281.218.109.831.068.649-.295-.182-.364-.825-.074-1.081.266-.28.374-.956 2.046-.92 4.324-.113.014-.174.033-.322.033-.171 0-.321-.04-.433-.05.034-2.275-.714-3.772-.84-4.169-.12-.375-.491-.596-.781-.596-.146 0-.272.056-.333.179-.182.363.459.417.677.308.706.321 1.156 3.519 1.254 4.277-.125-.006-.199.035-.199.233 0 .311.17.756.452.843a.442.442 0 0 0-.007.03s-.287.99-.413 2.189a4.665 4.665 0 0 1-.718-.225c-.714-.286-1.355-.583-2.019-.566-.664.018-1.366.023-1.804-.036-.438-.058-.649-.15-.649-.15s-.234.365.257 1.075c.42.607 1.055 1.047 1.644 1.18.589.134 1.972.18 2.785-.377.16-.109.317-.228.459-.34a8.717 8.717 0 0 0-.013.626c-.289.753-.571 1.993-.268 3.338 0-.001.701-.842.787-2.958.006-.144.009-.271.01-.383.052-.248.103-.518.148-.799.072.135.151.277.234.413.511.842 1.791 1.37 2.383 1.49.091.019.187.032.285.038Zm-1.12.745c-.188.055-.445.1-.713.059-.21-.031-.45-.11-.655-.316-.169-.168-.312-.419-.401-.789a9.837 9.837 0 0 0 .039-.82l.049-.243c.563.855 1.865 1.398 2.476 1.522.036.008.072.014.109.02l-.013.009c-.579.415-.76.503-.891.558Zm6.333-2.818c-.257.114-4.111 1.822-5.246 2.363.98-.775 3.017-3.59 3.699-4.774 1.062.661 1.468 1.109 1.623 1.441.101.217.09.38.096.515a.57.57 0 0 1-.172.455Zm-9.213 1.62a1.606 1.606 0 0 1-.19.096c-.954.414-2.126.61-4.728-.571-2.023-.918-3.024-2.157-3.371-2.666.476.161 1.471.473 2.157.524.282.021.703.068 1.167.125.021.209.109.486.345.829l.001.001c.451.651 1.134 1.119 1.765 1.262.622.141 2.083.182 2.942-.407a3.12 3.12 0 0 0 .132-.093l.001.179a6.052 6.052 0 0 0-.221.721Zm5.512-1.271a17.49 17.49 0 0 1-1.326-.589c.437.042 1.054.083 1.692.108-.121.162-.244.323-.366.481Zm.932-1.26c-.12.17-.245.343-.373.517-.241.018-.478.03-.709.038a29.05 29.05 0 0 1-.741-.048c.608-.065 1.228-.252 1.823-.507Zm.22-.315c-.809.382-1.679.648-2.507.648-.472 0-.833.018-1.139.039v.001c-.324-.031-.665-.039-1.019-.054a3.555 3.555 0 0 1-.152-.009c.102-.002.192-.006.249-.006.363 0 1.662.034 3.151-.589 1.508-.632 2.645-1.773 3.136-3.351.37-1.186.31-2.402.086-3.312.458-.336.86-.651 1.147-.91.501-.451.743-.733.848-.869.199.206.714.864.685 2.138-.036 1.611-.606 3.187-1.501 4.154a9.099 9.099 0 0 1-1.321 1.132 11.978 11.978 0 0 0-.644-.422l-.089-.055-.051.091c-.184.332-.5.825-.879 1.374ZM4.763 5.817c-.157 1.144.113 2.323.652 3.099.539.776 2.088 2.29 3.614 2.505.991.14 2.055.134 2.055.134s-.593-.576-1.114-1.66c-.521-1.085-.948-2.104-1.734-2.786-.785-.681-1.601-1.416-2.045-1.945-.444-.53-.59-.86-.59-.86s-.656.175-.838 1.513Zm14.301 4.549a9.162 9.162 0 0 0 1.3-1.12c.326-.352.611-.782.845-1.265 1.315.145 2.399.371 2.791.434 0 0-.679 1.971-3.945 3.022l-.016-.035c-.121-.26-.385-.594-.975-1.036Zm-11.634.859a8.537 8.537 0 0 1-.598-.224c-1.657-.693-2.91-1.944-3.449-3.678-.498-1.601-.292-3.251.091-4.269.225.544.758 1.34 1.262 2.01a3.58 3.58 0 0 0-.172.726c-.163 1.197.123 2.428.687 3.24.416.599 1.417 1.62 2.555 2.193-.128.002-.253.003-.376.002Zm-1.758-.077c-.958-.341-1.901-.787-2.697-1.368C-.07 7.559 0 6.827 0 6.827s1.558-.005 3.088.179c.03.126.065.
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "../../..", "features": ["content.tooltips", "search.highlight", "navigation.tabs", "navigation.indexes", "navigation.prune"], "search": "../../../assets/javascripts/workers/search.b8dbb3d2.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script>
<script src="../../../assets/javascripts/bundle.fe8b6f2b.min.js"></script>
</body>
</html>