Skip to content

Commit

Permalink
Merge pull request #1909 from kivy/release-2019.07.08
Browse files Browse the repository at this point in the history
Release 2019.07.08
  • Loading branch information
inclement authored Jul 14, 2019
2 parents 0415720 + 745dc67 commit ce9b571
Show file tree
Hide file tree
Showing 37 changed files with 1,883 additions and 467 deletions.
49 changes: 32 additions & 17 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,8 @@ services:
- docker

before_install:
- travis_retry sudo apt update -qq
# to successfully send the coveralls reports we need pyOpenSSL
- travis_retry sudo apt install -qq --no-install-recommends
python2.7 python3 python3-venv python3-virtualenv python3-pip
python3-setuptools python3-openssl
# (venv/virtualenv are both used by tests/test_pythonpackage.py)
- sudo pip install tox>=2.0
- sudo pip3 install coveralls
# https://github.com/travis-ci/travis-ci/issues/6069#issuecomment-266546552
- git remote set-branches --add origin master
- git remote set-branches --add origin develop
- git fetch

env:
Expand All @@ -31,13 +23,36 @@ env:

jobs:
include:
- stage: lint
name: "Tox tests and coverage"
- &linting
stage: lint
language: python
python: 3.7
before_script:
# We need to escape virtualenv for `test_pythonpackage_basic.test_virtualenv`
# See also: https://github.com/travis-ci/travis-ci/issues/8589
- type -t deactivate && deactivate || true
- export PATH=/opt/python/3.7/bin:$PATH
# Install tox & virtualenv
# Note: venv/virtualenv are both used by tests/test_pythonpackage.py
- pip3.7 install -U virtualenv
- pip3.7 install tox>=2.0
# Install coveralls & dependencies
# Note: pyOpenSSL needed to send the coveralls reports
- pip3.7 install pyOpenSSL
- pip3.7 install coveralls
script:
# we want to fail fast on tox errors without having to `docker build` first
- tox -- tests/ --ignore tests/test_pythonpackage.py
# (we ignore test_pythonpackage.py since these run way too long!!
# test_pythonpackage_basic.py will still be run.)
name: "Tox Pep8"
env: TOXENV=pep8
- <<: *linting
name: "Tox Python 2"
env: TOXENV=py27
- <<: *linting
name: "Tox Python 3 & Coverage"
env: TOXENV=py3
after_success:
- coveralls

Expand All @@ -54,16 +69,16 @@ jobs:
after_script:
# kill the background process started before run docker
- kill %1
name: Python 3 basic
name: Python 3 armeabi-v7a
# overrides requirements to skip `peewee` pure python module, see:
# https://github.com/kivy/python-for-android/issues/1263#issuecomment-390421054
env: COMMAND='. venv/bin/activate && cd testapps/ && python setup_testapp_python3_sqlite_openssl.py apk --sdk-dir $ANDROID_SDK_HOME --ndk-dir $ANDROID_NDK_HOME --requirements libffi,sdl2,pyjnius,kivy,python3,openssl,requests,sqlite3,setuptools'
env: COMMAND='. venv/bin/activate && cd testapps/ && python setup_testapp_python3_sqlite_openssl.py apk --sdk-dir $ANDROID_SDK_HOME --ndk-dir $ANDROID_NDK_HOME --requirements libffi,sdl2,pyjnius,kivy,python3,openssl,requests,sqlite3,setuptools' --arch=armeabi-v7a
- <<: *testing
name: Python 2 basic
env: COMMAND='. venv/bin/activate && cd testapps/ && python setup_testapp_python2_sqlite_openssl.py apk --sdk-dir $ANDROID_SDK_HOME --ndk-dir $ANDROID_NDK_HOME --requirements sdl2,pyjnius,kivy,python2,openssl,requests,sqlite3,setuptools'
name: Python 3 arm64-v8a
env: COMMAND='. venv/bin/activate && cd testapps/ && python setup_testapp_python3_sqlite_openssl.py apk --sdk-dir $ANDROID_SDK_HOME --ndk-dir $ANDROID_NDK_HOME --requirements libffi,sdl2,pyjnius,kivy,python3,openssl,requests,sqlite3,setuptools' --arch=arm64-v8a
- <<: *testing
name: Python 2 numpy
env: COMMAND='. venv/bin/activate && cd testapps/ && python setup_testapp_python2.py apk --sdk-dir $ANDROID_SDK_HOME --ndk-dir $ANDROID_NDK_HOME --bootstrap sdl2 --requirements python2,numpy'
name: Python 2 basic
env: COMMAND='. venv/bin/activate && cd testapps/ && python setup_testapp_python2_sqlite_openssl.py apk --sdk-dir $ANDROID_SDK_HOME --ndk-dir $ANDROID_NDK_HOME --requirements sdl2,pyjnius,kivy,python2,openssl,requests,sqlite3,setuptools,numpy'
- <<: *testing
name: Rebuild updated recipes
env: COMMAND='. venv/bin/activate && ./ci/rebuild_updated_recipes.py'
28 changes: 13 additions & 15 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ python-for-android
[![Backers on Open Collective](https://opencollective.com/kivy/backers/badge.svg)](#backers)
[![Sponsors on Open Collective](https://opencollective.com/kivy/sponsors/badge.svg)](#sponsors)

python-for-android is a packager for Python apps on Android. You can
python-for-android is a packaging tool for Python apps on Android. You can
create your own Python distribution including the modules and
dependencies you want, and bundle it in an APK along with your own code.

Expand All @@ -33,29 +33,27 @@ Follow the [quickstart
instructions](<https://python-for-android.readthedocs.org/en/latest/quickstart/>)
to install and begin creating APKs.

Quick instructions to start would be:
**Quick instructions**: install python-for-android with:

pip install python-for-android

or to test the master branch:
(for the develop branch: `pip install git+https://github.com/kivy/python-for-android.git`)

pip install git+https://github.com/kivy/python-for-android.git
Test that the install works with:

The executable is called ``python-for-android`` or ``p4a`` (both are
equivalent). To test that the installation worked, try::
p4a --version

python-for-android recipes
To build any actual apps, **set up the Android SDK and NDK**
as described in the [quickstart](
<https://python-for-android.readthedocs.org/en/latest/quickstart/#installing-android-sdk>).
**Use the SDK/NDK API level & NDK version as in the quickstart,**
other API levels may not work.

This should return a list of recipes available to be built.
With everything installed, build an APK with SDL2 with e.g.:

To build any distributions, you need to set up the Android SDK and NDK
as described in the documentation linked above.
p4a apk --requirements=kivy --private /home/username/devel/planewave_frozen/ --package=net.inclem.planewavessdl2 --name="planewavessdl2" --version=0.5 --bootstrap=sdl2

If you did this, to build an APK with SDL2 you can try e.g.:

p4a apk --requirements=kivy --private /home/asandy/devel/planewave_frozen/ --package=net.inclem.planewavessdl2 --name="planewavessdl2" --version=0.5 --bootstrap=sdl2

For full instructions and parameter options, see [the
**For full instructions and parameter options,** see [the
documentation](https://python-for-android.readthedocs.io/en/latest/quickstart/#usage).

## Support
Expand Down
2 changes: 2 additions & 0 deletions ci/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ class TargetPython(Enum):
'websocket-client',
'zeroconf',
'zope',
'matplotlib', # https://github.com/kivy/python-for-android/issues/1900
])
BROKEN_RECIPES_PYTHON3 = set([
'brokenrecipe',
Expand All @@ -77,6 +78,7 @@ class TargetPython(Enum):
# mpmath package with a version >= 0.19 required
'sympy',
'vlc',
'matplotlib', # https://github.com/kivy/python-for-android/issues/1900
])

BROKEN_RECIPES = {
Expand Down
18 changes: 11 additions & 7 deletions doc/source/contribute.rst
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ and we'll deal with the rest.
Development model
-----------------

python-for-android is developed using the following model::
python-for-android is developed using the following model:

- The ``master`` branch always represents the latest stable release.
- The ``develop`` branch is the most up to date with new contributions.
Expand Down Expand Up @@ -44,20 +44,24 @@ Creating a new release

New releases follow these steps:

- Create a new branch ``release/YYYY.MM.DD`` based on the ``develop`` branch.
- ``git checkout -b release/YYYY.MM.DD develop``
- Create a Github pull request to merge ``release/YYYY.MM.DD`` into ``master``.
- Create a new branch ``release-YYYY.MM.DD`` based on the ``develop`` branch.
- ``git checkout -b release-YYYY.MM.DD develop``
- Create a Github pull request to merge ``release-YYYY.MM.DD`` into ``master``.
- Complete all steps in the `release checklist <release_checklist_>`_,
and document this in the pull request (copy the checklist into the PR text)

At this point, wait for reviewer approval and conclude any discussion that arises. To complete the release:

- Merge the release branch to the ``master`` branch.
- Also merge the release branch to the ``develop`` branch.
- Tag the release commit in ``master``. Include a short summary of the changes.
- Create the release distributions: ``python3 setup.py sdist``
- Tag the release commit in ``master``, with tag ``vYYYY.MM.DD``. Include a short summary of the changes.
- Create the release distributions: ``python3 setup.py sdist bdist_wheel``
- Upload the release to pypi: ``python3 -m twine upload``.
- Upload the release ``.tar.gz`` to the Github tag.
- Add to the Github release page (see e.g. `this example <https://github.com/kivy/python-for-android/releases/tag/v2019.06.06>`__):
- The python-for-android README summary
- A short list of major changes in this release, if any
- A changelog summarising merge commits since the last release
- The release sdist and wheel(s)

.. _release_checklist:

Expand Down
97 changes: 53 additions & 44 deletions doc/source/quickstart.rst
Original file line number Diff line number Diff line change
Expand Up @@ -9,27 +9,37 @@ for android as p4a in this documentation.
Concepts
--------

- requirements: For p4a, your applications dependencies are
requirements similar to the standard `requirements.txt`, but with
one difference: p4a will search for a recipe first instead of
installing requirements with pip.
*Basic:*

- recipe: A recipe is a file that defines how to compile a
requirement. Any libraries that have a Python extension *must* have
a recipe in p4a, or compilation will fail. If there is no recipe for
a requirement, it will be downloaded using pip.
- **requirements:** For p4a, all your app's dependencies must be specified
via ``--requirements`` similar to the standard `requirements.txt`.
(Unless you specify them via a `setup.py`/`install_requires`)
All dependencies will be mapped to "recipes" if any exist, so that
many common libraries will just work. See "recipe" below for details.

- build: A build refers to a compiled recipe.
- **distribution:** A distribution is the final "build" of your
compiled project + requirements, as an Android project assembled by
p4a that can be turned directly into an APK. p4a can contain multiple
distributions with different sets of requirements.

- distribution: A distribution is the final "build" of all your
compiled requirements, as an Android project that can be turned
directly into an APK. p4a can contain multiple distributions with
different sets of requirements.
- **build:** A build refers to a compiled recipe or distribution.

- bootstrap: A bootstrap is the app backend that will start your
application. Your application could use SDL2 as a base,
or a web backend like Flask with a WebView bootstrap. Different
bootstraps can have different build options.
- **bootstrap:** A bootstrap is the app backend that will start your
application. The default for graphical applications is SDL2.
You can also use e.g. the webview for web apps, or service_only for
background services. Different bootstraps have different additional
build options.

*Advanced:*

- **recipe:**
A recipe is a file telling p4a how to install a requirement
that isn't by default fully Android compatible.
This is often necessary for Cython or C/C++-using python extensions.
p4a has recipes for many common libraries already included, and any
dependency you specified will be automatically mapped to its recipe.
If a dependency doesn't work and has no recipe included in p4a,
then it may need one to work.


Installation
Expand Down Expand Up @@ -75,14 +85,20 @@ install most of these with::
On Arch Linux (64 bit) you should be able to run the following to
install most of the dependencies (note: this list may not be
complete). gcc-multilib will conflict with (and replace) gcc if not
already installed. If your installation is already 32-bit, install the
same packages but without ``lib32-`` or ``-multilib``::
already installed::

sudo pacman -S jdk7-openjdk python2 python2-pip python2-kivy mesa-libgl lib32-mesa-libgl lib32-sdl2 lib32-sdl2_image lib32-sdl2_mixer sdl2_ttf unzip gcc-multilib gcc-libs-multilib

Installing Android SDK
~~~~~~~~~~~~~~~~~~~~~~

.. warning::
python-for-android is often picky about the **SDK/NDK versions.**
Pick the recommended ones from below to avoid problems.

Basic SDK install
`````````````````

You need to download and unpack the Android SDK and NDK to a directory (let's say $HOME/Documents/):

- `Android SDK <https://developer.android.com/studio/index.html>`_
Expand All @@ -94,31 +110,22 @@ named ``tools``, and you will need to run extra commands to install
the SDK packages needed.

For Android NDK, note that modern releases will only work on a 64-bit
operating system. The minimal, and recommended, NDK version to use is r17c:
operating system. **The minimal, and recommended, NDK version to use is r17c:**

- `Go to ndk downloads page <https://developer.android.com/ndk/downloads/>`_
- Windows users should create a virtual machine with an GNU Linux os
installed, and then you can follow the described instructions from within
your virtual machine.

If you are using a 32-bit distribution (or hardware),
the latest usable NDK version is r10e, which can be downloaded here:

- `Legacy 32-bit Linux NDK r10e <http://dl.google.com/android/ndk/android-ndk-r10e-linux-x86.bin>`_
Platform and build tools
````````````````````````

.. warning::
**32-bit distributions**

Since the python2 recipe updated to version 2.7.15, the build system has
been changed and you should use an old release of python-for-android, which
contains the legacy python recipe (v2.7.2). The last python-for-android
release with the legacy version of python is version
`0.6.0 <https://github.com/kivy/python-for-android/archive/0.6.0.zip>`_.

First, install an API platform to target. You can replace ``27`` with
a different platform number, but keep in mind **other API versions
are less well-tested**, and older devices are still supported
(down to the specified *minimum* API/NDK API level):
First, install an API platform to target. **The recommended *target* API
level is 27**, you can replace it with a different number but
keep in mind other API versions are less well-tested and older devices
are still supported down to the **recommended specified *minimum*
API/NDK API level 21**:

$SDK_DIR/tools/bin/sdkmanager "platforms;android-27"

Expand All @@ -128,13 +135,17 @@ possibilities, but 26.0.2 is the latest version at the time of writing::

$SDK_DIR/tools/bin/sdkmanager "build-tools;26.0.2"

Then, you can edit your ``~/.bashrc`` or other favorite shell to include new environment variables necessary for building on android::
Configure p4a to use your SDK/NDK
`````````````````````````````````

Then, you can edit your ``~/.bashrc`` or other favorite shell to include new environment
variables necessary for building on android::

# Adjust the paths!
export ANDROIDSDK="$HOME/Documents/android-sdk-27"
export ANDROIDNDK="$HOME/Documents/android-ndk-r17c"
export ANDROIDAPI="26" # Target API version of your application
export NDKAPI="19" # Minimum supported API version of your application
export ANDROIDAPI="27" # Target API version of your application
export NDKAPI="21" # Minimum supported API version of your application
export ANDROIDNDKVER="r10e" # Version of the NDK you installed

You have the possibility to configure on any command the PATH to the SDK, NDK and Android API using:
Expand All @@ -158,9 +169,9 @@ and the requirements::

p4a apk --private $HOME/code/myapp --package=org.example.myapp --name "My application" --version 0.1 --bootstrap=sdl2 --requirements=python3,kivy

**Note on `--requirements`: you must add all
**Note on** ``--requirements``: **you must add all
libraries/dependencies your app needs to run.**
Example: `--requirements=python3,kivy,vispy`. For an SDL2 app,
Example: ``--requirements=python3,kivy,vispy``. For an SDL2 app,
`kivy` is not needed, but you need to add any wrappers you might
use (e.g. `pysdl2`).

Expand All @@ -175,8 +186,6 @@ an `.apk` file.
it will possibly no longer receive patches by the python creators
themselves in 2020. Migration to Python 3 is recommended!

- You can also use ``--bootstrap=pygame``, but this bootstrap
is deprecated and not well-tested.

Build a WebView application
~~~~~~~~~~~~~~~~~~~~~~~~~~~
Expand All @@ -188,7 +197,7 @@ well as the requirements::
p4a apk --private $HOME/code/myapp --package=org.example.myapp --name "My WebView Application" --version 0.1 --bootstrap=webview --requirements=flask --port=5000

**Please note as with kivy/SDL2, you need to specify all your
additional requirements/depenencies.**
additional requirements/dependencies.**

You can also replace flask with another web framework.

Expand Down
8 changes: 3 additions & 5 deletions doc/source/troubleshooting.rst
Original file line number Diff line number Diff line change
Expand Up @@ -101,17 +101,15 @@ This will reveal all the Python-related files::
$ ls
android_runnable.pyo include interpreter_subprocess main.kv pipinterface.kv settings.pyo
assets __init__.pyo interpreterwrapper.pyo main.pyo pipinterface.pyo utils.pyo
editor.kv interpreter.kv lib menu.kv private.mp3 widgets.pyo
editor.kv interpreter.kv _python_bundle menu.kv private.mp3 widgets.pyo
editor.pyo interpreter.pyo libpymodules.so menu.pyo settings.kv

Most of these files have been included by the user (in this case, they
come from one of my own apps), the rest relate to the python
distribution.

With Python 2, the Python installation can mostly be found in the
``lib`` folder. With Python 3 (using the ``python3crystax`` recipe),
the Python installation can be found in a folder named
``crystax_python``.
The python installation, along with all side-packages, is mostly contained
inside the `_python_bundle` folder.


Common errors
Expand Down
3 changes: 1 addition & 2 deletions pythonforandroid/__init__.py
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@

__version__ = '2019.06.06.post0'
__version__ = '2019.07.08'
8 changes: 6 additions & 2 deletions pythonforandroid/archs.py
Original file line number Diff line number Diff line change
Expand Up @@ -167,8 +167,12 @@ def get_env(self, with_flags_in_cc=True, clang=False):
'host' + self.ctx.python_recipe.name, self.ctx)
env['BUILDLIB_PATH'] = join(
hostpython_recipe.get_build_dir(self.arch),
'build', 'lib.{}-{}'.format(
build_platform, self.ctx.python_recipe.major_minor_version_string)
'native-build',
'build',
'lib.{}-{}'.format(
build_platform,
self.ctx.python_recipe.major_minor_version_string,
),
)

env['PATH'] = environ['PATH']
Expand Down
Loading

0 comments on commit ce9b571

Please sign in to comment.