Usage
-----

Step 1: compile the toolchain
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

If you want to compile the toolchain with only the kivy module::

    ./distribute.sh -m "kivy"

.. warning::
    Do not run the above command from `within a virtual enviroment <../faq/#too-many-levels-of-symbolic-links>`_.

After a long time, you'll get a "dist/default" directory containing
all the compiled libraries and a build.py script to package your
application using thoses libraries.

You can include other modules (or "recipes") to compile using `-m`::

    ./distribute.sh -m "openssl kivy"
    ./distribute.sh -m "pil ffmpeg kivy"

.. note::
    
    Recipes are instructions for compiling Python modules that require C extensions. 
    The list of recipes we currently have is at: 
    https://github.com/kivy/python-for-android/tree/master/recipes

You can also specify a specific version for each package. Please note
that the compilation might **break** if you don't use the default
version. Most recipes have patches to fix Android issues, and might
not apply if you specify a version. We also recommend to clean build
before changing version.::

    ./distribute.sh -m "openssl kivy==master"

Python modules that don't need C extensions don't need a recipe and
can be included this way.  From python-for-android 1.1 on, you can now
specify pure-python package into the distribution. It will use
virtualenv and pip to install pure-python modules into the
distribution. Please note that the compiler is deactivated, and will
break any module which tries to compile something. If compilation is
needed, write a recipe::

    ./distribute.sh -m "requests pygments kivy"

.. note::

   Recipes download a defined version of their needed package from the
   internet, and build from it. If you know what you are doing, and
   want to override that, you can export the env variable
   `P4A_recipe_name_DIR` and this directory will be copied and used
   instead.

Available options to `distribute.sh`::

    -d directory           Name of the distribution directory
    -h                     Show this help
    -l                     Show a list of available modules
    -m 'mod1 mod2'         Modules to include
    -f                     Restart from scratch (remove the current build)
    -u 'mod1 mod2'         Modules to update (if already compiled)

Step 2: package your application
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Go to your custom Python distribution::

    cd dist/default

Use the build.py for creating the APK::

    ./build.py --package org.test.touchtracer --name touchtracer \
    --version 1.0 --dir ~/code/kivy/examples/demo/touchtracer debug

Then, the Android package (APK) will be generated at:

    bin/touchtracer-1.0-debug.apk

.. warning::

    Some files and modules for python are blacklisted by default to
    save a few megabytes on the final APK file. In case your
    applications doesn't find a standard python module, check the
    src/blacklist.txt file, remove the module you need from the list,
    and try again.

Available options to `build.py`::

    -h, --help            show this help message and exit
    --package PACKAGE     The name of the java package the project will be
                          packaged under.
    --name NAME           The human-readable name of the project.
    --version VERSION     The version number of the project. This should consist
                          of numbers and dots, and should have the same number
                          of groups of numbers as previous versions.
    --numeric-version NUMERIC_VERSION
                          The numeric version number of the project. If not
                          given, this is automatically computed from the
                          version.
    --dir DIR             The directory containing public files for the project.
    --private PRIVATE     The directory containing additional private files for
                          the project.
    --launcher            Provide this argument to build a multi-app launcher,
                          rather than a single app.
    --icon-name ICON_NAME
                          The name of the project's launcher icon.
    --orientation ORIENTATION
                          The orientation that the game will display in. Usually
                          one of "landscape", "portrait" or "sensor".
    --permission PERMISSIONS
                          The permissions to give this app.
    --ignore-path IGNORE_PATH
                          Ignore path when building the app
    --icon ICON           A png file to use as the icon for the application.
    --presplash PRESPLASH
                          A jpeg file to use as a screen while the application
                          is loading.
    --install-location INSTALL_LOCATION
                          The default install location. Should be "auto",
                          "preferExternal" or "internalOnly".
    --compile-pyo         Compile all .py files to .pyo, and only distribute the
                          compiled bytecode.
    --intent-filters INTENT_FILTERS
                          Add intent-filters xml rules to AndroidManifest.xml
    --blacklist BLACKLIST
                          Use a blacklist file to match unwanted file in the
                          final APK
    --sdk SDK_VERSION     Android SDK version to use. Default to 8
    --minsdk MIN_SDK_VERSION
                          Minimum Android SDK version to use. Default to 8
    --window              Indicate if the application will be windowed

Meta-data
---------

.. versionadded:: 1.3

You can extend the `AndroidManifest.xml` with application meta-data. If you are
using external toolkits like Google Maps, you might want to set your API key in
the meta-data. You could do it like this::

    ./build.py ... --meta-data com.google.android.maps.v2.API_KEY=YOURAPIKEY

Some meta-data can be used to interact with the behavior of our internal
component.

.. list-table::
    :widths: 100 500
    :header-rows: 1

    * - Token
      - Description
    * - `surface.transparent`
      - If set to 1, the created surface will be transparent (can be used
        to add background Android widget in the background, or use accelerated
        widgets)
    * - `surface.depth`
      - Size of the depth component, default to 0. 0 means automatic, but you
        can force it to a specific value. Be warned, some old phone might not
        support the depth you want.
    * - `surface.stencil`
      - Size of the stencil component, default to 8.
    * - `android.background_color`
      - Color (32bits RGBA color), used for the background window. Usually, the
        background is covered by the OpenGL Background, unless
        `surface.transparent` is set.