From 873e7b8dc34481fce354dcf4329eb168e29d93c4 Mon Sep 17 00:00:00 2001 From: Alexander Taylor Date: Thu, 31 Jan 2019 16:10:54 +0000 Subject: [PATCH 1/3] Removed the old toolchain doc --- doc/source/index.rst | 1 - .../old_toolchain/Screenshot_Kivy_Kompass.png | Bin 56791 -> 0 bytes doc/source/old_toolchain/_static/.empty | 0 doc/source/old_toolchain/android.rst | 369 ------------------ doc/source/old_toolchain/conf.py | 242 ------------ doc/source/old_toolchain/contribute.rst | 105 ----- doc/source/old_toolchain/customize.rst | 30 -- doc/source/old_toolchain/example_compass.rst | 61 --- .../old_toolchain/example_helloworld.rst | 96 ----- doc/source/old_toolchain/examples.rst | 21 - doc/source/old_toolchain/faq.rst | 41 -- doc/source/old_toolchain/index.rst | 38 -- doc/source/old_toolchain/javaapi.rst | 239 ------------ doc/source/old_toolchain/prerequisites.rst | 79 ---- doc/source/old_toolchain/related.rst | 7 - doc/source/old_toolchain/toolchain.rst | 66 ---- doc/source/old_toolchain/usage.rst | 167 -------- 17 files changed, 1562 deletions(-) delete mode 100644 doc/source/old_toolchain/Screenshot_Kivy_Kompass.png delete mode 100644 doc/source/old_toolchain/_static/.empty delete mode 100644 doc/source/old_toolchain/android.rst delete mode 100644 doc/source/old_toolchain/conf.py delete mode 100644 doc/source/old_toolchain/contribute.rst delete mode 100644 doc/source/old_toolchain/customize.rst delete mode 100644 doc/source/old_toolchain/example_compass.rst delete mode 100644 doc/source/old_toolchain/example_helloworld.rst delete mode 100644 doc/source/old_toolchain/examples.rst delete mode 100644 doc/source/old_toolchain/faq.rst delete mode 100644 doc/source/old_toolchain/index.rst delete mode 100644 doc/source/old_toolchain/javaapi.rst delete mode 100644 doc/source/old_toolchain/prerequisites.rst delete mode 100644 doc/source/old_toolchain/related.rst delete mode 100644 doc/source/old_toolchain/toolchain.rst delete mode 100644 doc/source/old_toolchain/usage.rst diff --git a/doc/source/index.rst b/doc/source/index.rst index cee0d5ad4c..16d6162dc3 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -38,7 +38,6 @@ Contents troubleshooting docker contribute - old_toolchain/index.rst Indices and tables diff --git a/doc/source/old_toolchain/Screenshot_Kivy_Kompass.png b/doc/source/old_toolchain/Screenshot_Kivy_Kompass.png deleted file mode 100644 index 828ce41952810fe95b3498595a98fb5168dcf87d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56791 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⋙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 diff --git a/doc/source/old_toolchain/_static/.empty b/doc/source/old_toolchain/_static/.empty deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/doc/source/old_toolchain/android.rst b/doc/source/old_toolchain/android.rst deleted file mode 100644 index 5d898749af..0000000000 --- a/doc/source/old_toolchain/android.rst +++ /dev/null @@ -1,369 +0,0 @@ -Python API -========== - -The Python for Android project includes a Python module called -``android`` which consists of multiple parts that are mostly there to -facilitate the use of the Java API. - -This module is not designed to be comprehensive. Most of the Java API -is also accessible with PyJNIus, so if you can't find what you need -here you can try using the Java API directly instead. - - -Android (``android``) ---------------------- - -.. module:: android - -.. function:: check_pause() - - This should be called on a regular basis to check to see if Android - expects the application to pause. If it returns true, the app should call - :func:`android.wait_for_resume()`, after storing its state as necessary. - -.. function:: wait_for_resume() - - This function should be called after :func:`android.check_pause()` and returns - true. It does not return until Android has resumed from the pause. While in - this function, Android may kill the app without further notice. - -.. function:: map_key(keycode, keysym) - - This maps an android keycode to a python keysym. The android - keycodes are available as constants in the android module. - - -Activity (``android.activity``) -------------------------------- - -.. module:: android.activity - -The default PythonActivity has a observer pattern for `onActivityResult `_ and `onNewIntent `_. - -.. function:: bind(eventname=callback, ...) - - This allows you to bind a callback to an Android event: - - ``on_new_intent`` is the event associated to the onNewIntent java call - - ``on_activity_result`` is the event associated to the onActivityResult java call - - .. warning:: - - This method is not thread-safe. Call it in the mainthread of your app. (tips: use kivy.clock.mainthread decorator) - -.. function:: unbind(eventname=callback, ...) - - Unregister a previously registered callback with :func:`bind`. - -Example:: - - # This example is a snippet from an NFC p2p app implemented with Kivy. - - from android import activity - - def on_new_intent(self, intent): - if intent.getAction() != NfcAdapter.ACTION_NDEF_DISCOVERED: - return - rawmsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES) - if not rawmsgs: - return - for message in rawmsgs: - message = cast(NdefMessage, message) - payload = message.getRecords()[0].getPayload() - print 'payload: {}'.format(''.join(map(chr, payload))) - - def nfc_enable(self): - activity.bind(on_new_intent=self.on_new_intent) - # ... - - def nfc_disable(self): - activity.unbind(on_new_intent=self.on_new_intent) - # ... - - -Billing (``android.billing``) ------------------------------ - -.. module:: android.billing - -This billing module gives an access to the `In-App Billing `_: - -#. `Setup a test account `_, and get your Public Key -#. Export your public key:: - - export BILLING_PUBKEY="Your public key here" - -#. `Setup some In-App product `_ to buy. Let's say you've created a product with the id "org.kivy.gopremium" - -#. In your application, you can use the ``billing`` module like this:: - - - from android.billing import BillingService - from kivy.clock import Clock - - class MyBillingService(object): - - def __init__(self): - super(MyBillingService, self).__init__() - - # Start the billing service, and attach our callback - self.service = BillingService(billing_callback) - - # Start a clock to check billing service message every second - Clock.schedule_interval(self.service.check, 1) - - def billing_callback(self, action, *largs): - '''Callback that will receive all the events from the Billing service - ''' - if action == BillingService.BILLING_ACTION_ITEMSCHANGED: - items = largs[0] - if 'org.kivy.gopremium' in items: - print "Congratulations, you have a premium acess" - else: - print "Unfortunately, you don't have premium access" - - def buy(self, sku): - # Method to buy something. - self.service.buy(sku) - - def get_purchased_items(self): - # Return all the items purchased - return self.service.get_purchased_items() - -#. To initiate an in-app purchase, just call the ``buy()`` method:: - - # Note: start the service at the start, and never twice! - bs = MyBillingService() - bs.buy('org.kivy.gopremium') - - # Later, when you get the notification that items have been changed, you - # can still check all the items you bought: - print bs.get_purchased_items() - {'org.kivy.gopremium': {'qt: 1}} - -#. You'll receive all the notifications about the billing process in the callback. - -#. Last step, create your application with ``--with-billing $BILLING_PUBKEY``:: - - ./build.py ... --with-billing $BILLING_PUBKEY - - -Broadcast (``android.broadcast``) ---------------------------------- - -.. module:: android.broadcast - -Implementation of the android `BroadcastReceiver -`_. -You can specify the callback that will receive the broadcast event, and actions -or categories filters. - -.. class:: BroadcastReceiver - - .. warning:: - - The callback will be called in another thread than the main thread. In - that thread, be careful not to access OpenGL or something like that. - - .. method:: __init__(callback, actions=None, categories=None) - - :param callback: function or method that will receive the event. Will - receive the context and intent as argument. - :param actions: list of strings that represent an action. - :param categories: list of strings that represent a category. - - For actions and categories, the string must be in lower case, without the prefix:: - - # In java: Intent.ACTION_HEADSET_PLUG - # In python: 'headset_plug' - - .. method:: start() - - Register the receiver with all the actions and categories, and start - handling events. - - .. method:: stop() - - Unregister the receiver with all the actions and categories, and stop - handling events. - -Example:: - - class TestApp(App): - - def build(self): - self.br = BroadcastReceiver( - self.on_broadcast, actions=['headset_plug']) - self.br.start() - # ... - - def on_broadcast(self, context, intent): - extras = intent.getExtras() - headset_state = bool(extras.get('state')) - if headset_state: - print 'The headset is plugged' - else: - print 'The headset is unplugged' - - # Don't forget to stop and restart the receiver when the app is going - # to pause / resume mode - - def on_pause(self): - self.br.stop() - return True - - def on_resume(self): - self.br.start() - - -Mixer (``android.mixer``) -------------------------- - -.. module:: android.mixer - -The `android.mixer` module contains a subset of the functionality in found -in the `pygame.mixer `_ module. It's -intended to be imported as an alternative to pygame.mixer, using code like: :: - - try: - import pygame.mixer as mixer - except ImportError: - import android.mixer as mixer - -Note that if you're using the `kivy.core.audio -`_ module, you don't have to do -anything, it is all automatic. - -The `android.mixer` module is a wrapper around the Android MediaPlayer -class. This allows it to take advantage of any hardware acceleration -present, and also eliminates the need to ship codecs as part of an -application. - -It has several differences with the pygame mixer: - -* The init() and pre_init() methods work, but are ignored - Android chooses - appropriate settings automatically. - -* Only filenames and true file objects can be used - file-like objects - will probably not work. - -* Fadeout does not work - it causes a stop to occur. - -* Looping is all or nothing, there is no way to choose the number of - loops that occur. For looping to work, the - :func:`android.mixer.periodic` function should be called on a - regular basis. - -* Volume control is ignored. - -* End events are not implemented. - -* The mixer.music object is a class (with static methods on it), - rather than a module. Calling methods like :func:`mixer.music.play` - should work. - - -Runnable (``android.runnable``) -------------------------------- - -.. module:: android.runnable - -:class:`Runnable` is a wrapper around the Java `Runnable -`_ class. This -class can be used to schedule a call of a Python function into the -`PythonActivity` thread. - -Example:: - - from android.runnable import Runnable - - def helloworld(arg): - print 'Called from PythonActivity with arg:', arg - - Runnable(helloworld)('hello') - -Or use our decorator:: - - from android.runnable import run_on_ui_thread - - @run_on_ui_thread - def helloworld(arg): - print 'Called from PythonActivity with arg:', arg - - helloworld('arg1') - - -This can be used to prevent errors like: - - - W/System.err( 9514): java.lang.RuntimeException: Can't create handler - inside thread that has not called Looper.prepare() - - NullPointerException in ActivityThread.currentActivityThread() - -.. warning:: - - Because the python function is called from the PythonActivity thread, you - need to be careful about your own calls. - - - -Service (``android.service``) ------------------------------ - -Services of an application are controlled through the class :class:`AndroidService`. - -.. module:: android.service - -.. class:: AndroidService(title, description) - - Run ``service/main.py`` from the application directory as a service. - - :param title: Notification title, default to 'Python service' - :param description: Notification text, default to 'Kivy Python service started' - :type title: str - :type description: str - - .. method:: start(arg) - - Start the service. - - :param arg: Argument to pass to a service, through the environment variable - ``PYTHON_SERVICE_ARGUMENT``. Defaults to '' - :type arg: str - - .. method:: stop() - - Stop the service. - -Application activity part example, ``main.py``: - -.. code-block:: python - - from android import AndroidService - - ... - - class ServiceExample(App): - - ... - - def start_service(self): - self.service = AndroidService('Sevice example', 'service is running') - self.service.start('Hello From Service') - - def stop_service(self): - self.service.stop() - -Application service part example, ``service/main.py``: - -.. code-block:: python - - import os - import time - - # get the argument passed - arg = os.getenv('PYTHON_SERVICE_ARGUMENT') - - while True: - # this will print 'Hello From Service' continually, even when the application is switched - print arg - time.sleep(1) - diff --git a/doc/source/old_toolchain/conf.py b/doc/source/old_toolchain/conf.py deleted file mode 100644 index 02498acb27..0000000000 --- a/doc/source/old_toolchain/conf.py +++ /dev/null @@ -1,242 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Python for Android documentation build configuration file, created by -# sphinx-quickstart on Wed Jan 11 02:31:33 2012. -# -# This file is execfile()d with the current directory set to its containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -import sys, os - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -#sys.path.insert(0, os.path.abspath('.')) - -# -- General configuration ----------------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -#needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be extensions -# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. -extensions = [] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# The suffix of source filenames. -source_suffix = '.rst' - -# The encoding of source files. -#source_encoding = 'utf-8-sig' - -# The master toctree document. -master_doc = 'index' - -# General information about the project. -project = u'Python for Android' -copyright = u'2012/2013, Kivy organisation' - -# The version info for the project you're documenting, acts as replacement for -# |version| and |release|, also used in various other places throughout the -# built documents. -# -# The short X.Y version. -version = '1.2' -# The full version, including alpha/beta/rc tags. -release = '1.2' - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -#language = None - -# There are two options for replacing |today|: either, you set today to some -# non-false value, then it is used: -#today = '' -# Else, today_fmt is used as the format for a strftime call. -#today_fmt = '%B %d, %Y' - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -exclude_patterns = [] - -# The reST default role (used for this markup: `text`) to use for all documents. -#default_role = None - -# If true, '()' will be appended to :func: etc. cross-reference text. -#add_function_parentheses = True - -# If true, the current module name will be prepended to all description -# unit titles (such as .. function::). -#add_module_names = True - -# If true, sectionauthor and moduleauthor directives will be shown in the -# output. They are ignored by default. -#show_authors = False - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' - -# A list of ignored prefixes for module index sorting. -#modindex_common_prefix = [] - - -# -- Options for HTML output --------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -html_theme = 'default' - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -#html_theme_options = {} - -# Add any paths that contain custom themes here, relative to this directory. -#html_theme_path = [] - -# The name for this set of Sphinx documents. If None, it defaults to -# " v documentation". -#html_title = None - -# A shorter title for the navigation bar. Default is the same as html_title. -#html_short_title = None - -# The name of an image file (relative to this directory) to place at the top -# of the sidebar. -#html_logo = None - -# The name of an image file (within the static path) to use as favicon of the -# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 -# pixels large. -#html_favicon = None - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] - -# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, -# using the given strftime format. -#html_last_updated_fmt = '%b %d, %Y' - -# If true, SmartyPants will be used to convert quotes and dashes to -# typographically correct entities. -#html_use_smartypants = True - -# Custom sidebar templates, maps document names to template names. -#html_sidebars = {} - -# Additional templates that should be rendered to pages, maps page names to -# template names. -#html_additional_pages = {} - -# If false, no module index is generated. -#html_domain_indices = True - -# If false, no index is generated. -#html_use_index = True - -# If true, the index is split into individual pages for each letter. -#html_split_index = False - -# If true, links to the reST sources are added to the pages. -#html_show_sourcelink = True - -# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. -#html_show_sphinx = True - -# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. -#html_show_copyright = True - -# If true, an OpenSearch description file will be output, and all pages will -# contain a tag referring to it. The value of this option must be the -# base URL from which the finished HTML is served. -#html_use_opensearch = '' - -# This is the file name suffix for HTML files (e.g. ".xhtml"). -#html_file_suffix = None - -# Output file base name for HTML help builder. -htmlhelp_basename = 'PythonForAndroiddoc' - - -# -- Options for LaTeX output -------------------------------------------------- - -latex_elements = { -# The paper size ('letterpaper' or 'a4paper'). -#'papersize': 'letterpaper', - -# The font size ('10pt', '11pt' or '12pt'). -#'pointsize': '10pt', - -# Additional stuff for the LaTeX preamble. -#'preamble': '', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, author, documentclass [howto/manual]). -latex_documents = [ - ('index', 'PythonForAndroid.tex', u'Python for Android Documentation', - u'Mathieu Virbel', 'manual'), -] - -# The name of an image file (relative to this directory) to place at the top of -# the title page. -#latex_logo = None - -# For "manual" documents, if this is true, then toplevel headings are parts, -# not chapters. -#latex_use_parts = False - -# If true, show page references after internal links. -#latex_show_pagerefs = False - -# If true, show URL addresses after external links. -#latex_show_urls = False - -# Documents to append as an appendix to all manuals. -#latex_appendices = [] - -# If false, no module index is generated. -#latex_domain_indices = True - - -# -- Options for manual page output -------------------------------------------- - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [ - ('index', 'pythonforandroid', u'Python for Android Documentation', - [u'Mathieu Virbel'], 1) -] - -# If true, show URL addresses after external links. -#man_show_urls = False - - -# -- Options for Texinfo output ------------------------------------------------ - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - ('index', 'PythonForAndroid', u'Python for Android Documentation', - u'Mathieu Virbel', 'PythonForAndroid', 'One line description of project.', - 'Miscellaneous'), -] - -# Documents to append as an appendix to all manuals. -#texinfo_appendices = [] - -# If false, no module index is generated. -#texinfo_domain_indices = True - -# How to display URL addresses: 'footnote', 'no', or 'inline'. -#texinfo_show_urls = 'footnote' diff --git a/doc/source/old_toolchain/contribute.rst b/doc/source/old_toolchain/contribute.rst deleted file mode 100644 index dcc0fbe7c6..0000000000 --- a/doc/source/old_toolchain/contribute.rst +++ /dev/null @@ -1,105 +0,0 @@ -Contribute -========== - -Extending Python for android native support -------------------------------------------- - -So, you want to get into python-for-android and extend what's available -to Python on Android ? - -Turns out it's not very complicated, here is a little introduction on how to go -about it. Without Pyjnius, the schema to access the Java API from Cython is:: - - [1] Cython -> [2] C JNI -> [3] Java - -Think about acceleration sensors: you want to get the acceleration -values in Python, but nothing is available natively. Lukcily you have -a Java API for that : the Google API is available here -http://developer.android.com/reference/android/hardware/Sensor.html - -You can't use it directly, you need to do your own API to use it in python, -this is done in 3 steps - -Step 1: write the java code to create very simple functions to use -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -like : accelerometer Enable/Reading -In our project, this is done in the Hardware.java: -https://github.com/kivy/python-for-android/blob/master/src/src/org/renpy/android/Hardware.java -you can see how it's implemented - -Step 2 : write a jni wrapper -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -This is a C file to be able to invoke/call Java functions from C, in our case, -step 2 (and 3) are done in the android python module. The JNI part is done in -the android_jni.c: -https://github.com/kivy/python-for-android/blob/master/recipes/android/src/android_jni.c - -Step 3 : you have the java part, that you can call from the C -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -You can now do the Python extension around it, all the android python part is -done in -https://github.com/kivy/python-for-android/blob/master/recipes/android/src/android.pyx - -→ [python] android.accelerometer_reading ⇒ [C] android_accelerometer_reading -⇒ [Java] Hardware.accelerometer_reading() - -The jni part is really a C api to call java methods. a little bit hard to get -it with the syntax, but working with current example should be ok - -Example with bluetooth -~~~~~~~~~~~~~~~~~~~~~~ -Start directly from a fork of https://github.com/kivy/python-for-android - -The first step is to identify where and how they are doing it in sl4a, it's -really easy, because everything is already done as a client/server -client/consumer approach, for bluetooth, they have a "Bluetooth facade" in -java. - -http://code.google.com/p/android-scripting/source/browse/android/BluetoothFacade/src/com/googlecode/android_scripting/facade/BluetoothFacade.java - -You can learn from it, and see how is it's can be used as is, or if you can -simplify / remove stuff you don't want. - -From this point, create a bluetooth file in -python-for-android/tree/master/src/src/org/renpy/android in Java. - -Do a good API (enough simple to be able to write the jni in a very easy manner, -like, don't pass any custom java object in argument). - -Then write the JNI, and then the python part. - -3 steps, once you get it, the real difficult part is to write the java part :) - -Jni gottchas -~~~~~~~~~~~~ - -- package must be org.renpy.android, don't change it. - - -Create your own recipes ------------------------ - -A recipe is a script that contains the "definition" of a module to compile. -The directory layout of a recipe for a is something like:: - - python-for-android/recipes//recipe.sh - python-for-android/recipes//patches/ - python-for-android/recipes//patches/fix-path.patch - -When building, all the recipe builds must go to:: - - python-for-android/build// - -For example, if you want to create a recipe for sdl, do:: - - cd python-for-android/recipes - mkdir sdl - cp recipe.sh.tmpl sdl/recipe.sh - sed -i 's#XXX#sdl#' sdl/recipe.sh - -Then, edit the sdl/recipe.sh to adjust other information (version, url) and -complete the build function. - diff --git a/doc/source/old_toolchain/customize.rst b/doc/source/old_toolchain/customize.rst deleted file mode 100644 index 5b9d954d27..0000000000 --- a/doc/source/old_toolchain/customize.rst +++ /dev/null @@ -1,30 +0,0 @@ -Customize your distribution ---------------------------- - -The basic layout of a distribution is:: - - AndroidManifest.xml - (*) android manifest (generated from templates) - assets/ - private.mp3 - (*) fake package that will contain all the python installation - public.mp3 - (*) fake package that will contain your application - bin/ - contain all the apk generated from build.py - blacklist.txt - list of file patterns to not include in the APK - buildlib/ - internals libraries for build.py - build.py - build script to use for packaging your application - build.xml - (*) build settings (generated from templates) - default.properties - settings generated from your distribute.sh - libs/ - contain all the compiled libraries - local.properties - settings generated from your distribute.sh - private/ - private directory containing all the python files - lib/ this is where you can remove or add python libs. - python2.7/ by default, some modules are already removed (tests, idlelib, ...) - project.properties - settings generated from your distribute.sh - python-install/ - the whole python installation, generated from distribute.sh - not included in the final package. - res/ - (*) android resource (generated from build.py) - src/ - Java bootstrap - templates/ - Templates used by build.py - - (*): Theses files are automatically generated from build.py, don't change them directly ! - - diff --git a/doc/source/old_toolchain/example_compass.rst b/doc/source/old_toolchain/example_compass.rst deleted file mode 100644 index bff430eafe..0000000000 --- a/doc/source/old_toolchain/example_compass.rst +++ /dev/null @@ -1,61 +0,0 @@ -Compass -------- - -The following example is an extract from the Compass app as provided in the Kivy -`examples/android/compass `__ -folder: - -.. code-block:: python - - # ... imports - Hardware = autoclass('org.renpy.android.Hardware') - - class CompassApp(App): - - needle_angle = NumericProperty(0) - - def build(self): - self._anim = None - Hardware.magneticFieldSensorEnable(True) - Clock.schedule_interval(self.update_compass, 1 / 10.) - - def update_compass(self, *args): - # read the magnetic sensor from the Hardware class - (x, y, z) = Hardware.magneticFieldSensorReading() - - # calculate the angle - needle_angle = Vector(x , y).angle((0, 1)) + 90. - - # animate the needle - if self._anim: - self._anim.stop(self) - self._anim = Animation(needle_angle=needle_angle, d=.2, t='out_quad') - self._anim.start(self) - - def on_pause(self): - # when you are going on pause, don't forget to stop the sensor - Hardware.magneticFieldSensorEnable(False) - return True - - def on_resume(self): - # reactivate the sensor when you are back to the app - Hardware.magneticFieldSensorEnable(True) - - if __name__ == '__main__': - CompassApp().run() - - -If you compile this app, you will get an APK which outputs the following -screen: - -.. figure:: Screenshot_Kivy_Kompass.png - :width: 100% - :scale: 60% - :figwidth: 80% - :alt: Screenshot Kivy Compass - - Screenshot of the Kivy Compass App - (Source of the Compass Windrose: `Wikipedia `__) - - - diff --git a/doc/source/old_toolchain/example_helloworld.rst b/doc/source/old_toolchain/example_helloworld.rst deleted file mode 100644 index dab760ad4b..0000000000 --- a/doc/source/old_toolchain/example_helloworld.rst +++ /dev/null @@ -1,96 +0,0 @@ -Hello world ------------ - -If you don't know how to start with Python for Android, here is a simple -tutorial for creating an UI using `Kivy `_, and make an APK -with this project. - -.. note:: - - Don't forget that Python for Android is not Kivy only, and you - might want to use other toolkit libraries. When other toolkits - will be available, this documentation will be enhanced. - -Let's create a simple Hello world application, with one Label and one Button. - -#. Ensure you've correctly installed and configured the project as said in the - :doc:`prerequisites` - -#. Create a directory named ``helloworld``:: - - mkdir helloworld - cd helloworld - -#. Create a file named ``main.py``, with this content:: - - import kivy - kivy.require('1.0.9') - from kivy.lang import Builder - from kivy.uix.gridlayout import GridLayout - from kivy.properties import NumericProperty - from kivy.app import App - - Builder.load_string(''' - : - cols: 1 - Label: - text: 'Welcome to the Hello world' - Button: - text: 'Click me! %d' % root.counter - on_release: root.my_callback() - ''') - - class HelloWorldScreen(GridLayout): - counter = NumericProperty(0) - def my_callback(self): - print 'The button has been pushed' - self.counter += 1 - - class HelloWorldApp(App): - def build(self): - return HelloWorldScreen() - - if __name__ == '__main__': - HelloWorldApp().run() - -#. Go to the ``python-for-android`` directory - -#. Create a distribution with kivy:: - - ./distribute.sh -m kivy - -#. Go to the newly created ``default`` distribution:: - - cd dist/default - -#. Plug your android device, and ensure you can install development - application - -#. Build your hello world application in debug mode:: - - ./build.py --package org.hello.world --name "Hello world" \ - --version 1.0 --dir /PATH/TO/helloworld debug installd - -#. Take your device, and start the application! - -#. If something goes wrong, open the logcat by doing:: - - adb logcat - -The final debug APK will be located in ``bin/hello-world-1.0-debug.apk``. - -If you want to release your application instead of just making a debug APK, you must: - -#. Generate a non-signed APK:: - - ./build.py --package org.hello.world --name "Hello world" \ - --version 1.0 --dir /PATH/TO/helloworld release - -#. Continue by reading http://developer.android.com/guide/publishing/app-signing.html - - -.. seealso:: - - `Kivy demos `_ - You can use them for creating APK too. - diff --git a/doc/source/old_toolchain/examples.rst b/doc/source/old_toolchain/examples.rst deleted file mode 100644 index 4d7408fa0c..0000000000 --- a/doc/source/old_toolchain/examples.rst +++ /dev/null @@ -1,21 +0,0 @@ -Examples -======== - -Prebuilt VirtualBox -------------------- - -A good starting point to build an APK are prebuilt VirtualBox images, -where the Android NDK, the Android SDK, and the Kivy -Python-For-Android sources are prebuilt in an VirtualBox image. Please -search the `Download Section `__ for such -an image. You will also need to create a device filter for the Android -USB device using the VirtualBox OS settings. - -.. include:: example_helloworld.rst -.. include:: example_compass.rst - -.. toctree:: - :hidden: - - example_helloworld - example_compass diff --git a/doc/source/old_toolchain/faq.rst b/doc/source/old_toolchain/faq.rst deleted file mode 100644 index 22ffe11512..0000000000 --- a/doc/source/old_toolchain/faq.rst +++ /dev/null @@ -1,41 +0,0 @@ -FAQ -=== - -arm-linux-androideabi-gcc: Internal error: Killed (program cc1) ---------------------------------------------------------------- - -This could happen if you are not using a validated SDK/NDK with Python for -Android. Go to :doc:`prerequisites` to see which one are working. - -_sqlite3.so not found ---------------------- - -We recently fixed sqlite3 compilation. In case of this error, you -must: - -* Install development headers for sqlite3 if they are not already - installed. On Ubuntu: - - apt-get install libsqlite3-dev - -* Compile the distribution with (sqlite3 must be the first argument):: - - ./distribute.sh -m 'sqlite3 kivy' - -* Go into your distribution at `dist/default` -* Edit blacklist.txt, and remove all the lines concerning sqlite3:: - - sqlite3/* - lib-dynload/_sqlite3.so - -Then sqlite3 will be compiled and included in your APK. - -Too many levels of symbolic links ------------------------------------------------------ - -Python for Android does not work within a virtual enviroment. The Python for -Android directory must be outside of the virtual enviroment prior to running - - ./distribute.sh -m "kivy" - -or else you may encounter OSError: [Errno 40] Too many levels of symbolic links. \ No newline at end of file diff --git a/doc/source/old_toolchain/index.rst b/doc/source/old_toolchain/index.rst deleted file mode 100644 index 1b873be657..0000000000 --- a/doc/source/old_toolchain/index.rst +++ /dev/null @@ -1,38 +0,0 @@ - -Old p4a toolchain doc -===================== - -This is the documentation for the old python-for-android toolchain, -using distribute.sh and build.py. This it entirely superseded by the -new toolchain, you do not need to read it unless using this old -method. - -.. warning:: The old toolchain is deprecated and no longer - supported. You should instead use the :doc:`current version - <../quickstart>`. - -Python for android is a project to create your own Python distribution -including the modules you want, and create an apk including python, libs, and -your application. - -- Forum: https://groups.google.com/forum/#!forum/python-android -- Mailing list: python-android@googlegroups.com - -.. toctree:: - :maxdepth: 2 - - toolchain.rst - examples.rst - android.rst - javaapi.rst - contribute.rst - related.rst - faq.rst - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` - diff --git a/doc/source/old_toolchain/javaapi.rst b/doc/source/old_toolchain/javaapi.rst deleted file mode 100644 index 73fc888f8e..0000000000 --- a/doc/source/old_toolchain/javaapi.rst +++ /dev/null @@ -1,239 +0,0 @@ -Java API (pyjnius) -================== - -Using `PyJNIus `__ to access the Android API -restricts the usage to a simple call of the **autoclass** constructor function -and a second call to instantiate this class. - -You can access through this method the entire Java Android API, e.g., -the ``DisplayMetrics`` of an Android device could be fetched using the -following piece of code: - -.. code-block:: python - - DisplayMetrics = autoclass('android.util.DisplayMetrics') - metrics = DisplayMetrics() - metrics.setToDefaults() - self.densityDpi = metrics.densityDpi - -You can access all fields and methods as described in the `Java -Android DisplayMetrics API -`__ -as shown here with the method `setToDefaults()` and the field -`densityDpi`. Before you use a view field, you should always call -`setToDefaults` to initiate to the default values of the device. - -Currently only JavaMethod, JavaStaticMethod, JavaField, -JavaStaticField and JavaMultipleMethod are built into PyJNIus, -therefore such constructs like registerListener or something like this -must still be coded in Java. For this the Android module described -below is available to access some of the hardware on Android devices. - -.. module:: org.renpy.android - - -Activity --------- - -If you want the instance of the current Activity, use: - -- :data:`PythonActivity.mActivity` if you are running an application -- :data:`PythonService.mService` if you are running a service - -.. class:: PythonActivity - - .. data:: mInfo - - Instance of an `ApplicationInfo - `_ - - .. data:: mActivity - - Instance of :class:`PythonActivity`. - - .. method:: registerNewIntentListener(NewIntentListener listener) - - Register a new instance of :class:`NewIntentListener` to be called when - `onNewIntent - `_ - is called. - - .. method:: unregisterNewIntentListener(NewIntentListener listener) - - Unregister a previously registered listener from - :meth:`registerNewIntentListener` - - .. method:: registerActivityResultListener(ActivityResultListener listener) - - Register a new instance of :class:`ActivityResultListener` to be called - when `onActivityResult - `_ is called. - - .. method:: unregisterActivityResultListener(ActivityResultListener listener) - - Unregister a previously registered listener from - :meth:`PythonActivity.registerActivityResultListener` - -.. class:: PythonActivity_ActivityResultListener - - .. note:: - - This class is a subclass of PythonActivity, so the notation will be - ``PythonActivity$ActivityResultListener`` - - Listener interface for onActivityResult. You need to implementing it, - create an instance and use it with :meth:`PythonActivity.registerActivityResultListener`. - - .. method:: onActivityResult(int requestCode, int resultCode, Intent data) - - Method to implement - -.. class:: PythonActivity_NewIntentListener - - .. note:: - - This class is a subclass of PythonActivity, so the notation will be - ``PythonActivity$NewIntentListener`` - - Listener interface for onNewIntent. You need to implementing it, create - an instance and use it with :meth:`registerNewIntentListener`. - - .. method:: onNewIntent(Intent intent) - - Method to implement - - -Action ------- - -.. class:: Action - - This module is built to deliver data to someone else. - - .. method:: send(mimetype, filename, subject, text, chooser_title) - - Deliver data to someone else. This method is a wrapper around `ACTION_SEND - `_ - - :Parameters: - `mimetype`: str - Must be a valid mimetype, that represent the content to sent. - `filename`: str, default to None - (optional) Name of the file to attach. Must be a absolute path. - `subject`: str, default to None - (optional) Default subject - `text`: str, default to None - (optional) Content to send. - `chooser_title`: str, default to None - (optional) Title of the android chooser window, default to 'Send email...' - - Sending a simple hello world text:: - - android.action_send('text/plain', text='Hello world', - subject='Test from python') - - Sharing an image file:: - - # let's say you've make an image in /sdcard/image.png - android.action_send('image/png', filename='/sdcard/image.png') - - Sharing an image with a default text too:: - - android.action_send('image/png', filename='/sdcard/image.png', - text='Hi,\n\tThis is my awesome image, what do you think about it ?') - - -Hardware --------- - -.. class:: Hardware - - This module is built for accessing hardware devices of an Android device. - All the methods are static and public, you don't need an instance. - - - .. method:: vibrate(s) - - Causes the phone to vibrate for `s` seconds. This requires that your - application have the VIBRATE permission. - - - .. method:: getHardwareSensors() - - Returns a string of all hardware sensors of an Android device where each - line lists the informations about one sensor in the following format: - - Name=name,Vendor=vendor,Version=version,MaximumRange=maximumRange,MinDelay=minDelay,Power=power,Type=type - - For more information about this informations look into the original Java - API for the `Sensors Class - `__ - - .. attribute:: accelerometerSensor - - This variable links to a generic3AxisSensor instance and their functions to - access the accelerometer sensor - - .. attribute:: orientationSensor - - This variable links to a generic3AxisSensor instance and their functions to - access the orientation sensor - - .. attribute:: magenticFieldSensor - - - The following two instance methods of the generic3AxisSensor class should be - used to enable/disable the sensor and to read the sensor - - - .. method:: changeStatus(boolean enable) - - Changes the status of the sensor, the status of the sensor is enabled, - if `enable` is true or disabled, if `enable` is false. - - .. method:: readSensor() - - Returns an (x, y, z) tuple of floats that gives the sensor reading, the - units depend on the sensor as shown on the Java API page for - `SensorEvent - `_. - The sesnor must be enabled before this function is called. If the tuple - contains three zero values, the accelerometer is not enabled, not - available, defective, has not returned a reading, or the device is in - free-fall. - - .. method:: get_dpi() - - Returns the screen density in dots per inch. - - .. method:: show_keyboard() - - Shows the soft keyboard. - - .. method:: hide_keyboard() - - Hides the soft keyboard. - - .. method:: wifi_scanner_enable() - - Enables wifi scanning. - - .. note:: - - ACCESS_WIFI_STATE and CHANGE_WIFI_STATE permissions are required. - - .. method:: wifi_scan() - - Returns a String for each visible WiFi access point - - (SSID, BSSID, SignalLevel) - -Further Modules -~~~~~~~~~~~~~~~ - -Some further modules are currently available but not yet documented. Please -have a look into the code and you are very welcome to contribute to this -documentation. - - diff --git a/doc/source/old_toolchain/prerequisites.rst b/doc/source/old_toolchain/prerequisites.rst deleted file mode 100644 index eb5cd6dcd0..0000000000 --- a/doc/source/old_toolchain/prerequisites.rst +++ /dev/null @@ -1,79 +0,0 @@ -Prerequisites -------------- - -.. note:: There is a VirtualBox Image we provide with the - prerequisites along with the Android SDK and NDK preinstalled to - ease your installation woes. You can download it from `here - `__. - -.. warning:: - - The current version is tested only on Ubuntu oneiric (11.10) and - precise (12.04). If it doesn't work on other platforms, send us a - patch, not a bug report. Python for Android works on Linux and Mac - OS X, not Windows. - -You need the minimal environment for building python. Note that other -libraries might need other tools (cython is used by some recipes, and -ccache to speedup the build):: - - sudo apt-get install build-essential patch git-core ccache ant python-pip python-dev - -If you are on a 64 bit distro, you should install these packages too :: - - sudo apt-get install ia32-libs libc6-dev-i386 - -On debian Squeeze amd64, those packages were found to be necessary :: - - sudo apt-get install lib32stdc++6 lib32z1 - -Ensure you have the latest Cython version:: - - pip install --upgrade cython - -You must have android SDK and NDK. The SDK defines the Android -functions you can use. The NDK is used for compilation. Right now, -it's preferred to use: - -- SDK API 8 or 14 (15 will only work with a newly released NDK) -- NDK r5b or r7 - -You can download them at:: - - http://developer.android.com/sdk/index.html - http://developer.android.com/sdk/ndk/index.html - - -In general, Python for Android currently works with Android 2.3 to L. - -If it's your very first time using the Android SDK, don't forget to -follow the documentation for recommended components at:: - - http://developer.android.com/sdk/installing/adding-packages.html - - You need to download at least one platform into your environment, so - that you will be able to compile your application and set up an Android - Virtual Device (AVD) to run it on (in the emulator). To start with, - just download the latest version of the platform. Later, if you plan to - publish your application, you will want to download other platforms as - well, so that you can test your application on the full range of - Android platform versions that your application supports. - -After installing them, export both installation paths, NDK version, -and API to use:: - - export ANDROIDSDK=/path/to/android-sdk - export ANDROIDNDK=/path/to/android-ndk - export ANDROIDNDKVER=rX - export ANDROIDAPI=X - - # example - export ANDROIDSDK="/home/tito/code/android/android-sdk-linux_86" - export ANDROIDNDK="/home/tito/code/android/android-ndk-r7" - export ANDROIDNDKVER=r7 - export ANDROIDAPI=14 - -Also, you must configure your PATH to add the ``android`` binary:: - - export PATH=$ANDROIDNDK:$ANDROIDSDK/platform-tools:$ANDROIDSDK/tools:$PATH - diff --git a/doc/source/old_toolchain/related.rst b/doc/source/old_toolchain/related.rst deleted file mode 100644 index ea694f619c..0000000000 --- a/doc/source/old_toolchain/related.rst +++ /dev/null @@ -1,7 +0,0 @@ -Related projects -================ - -- PGS4A: http://pygame.renpy.org/ (thanks to Renpy to make it possible) -- Android scripting: http://code.google.com/p/android-scripting/ -- Python on a chip: http://code.google.com/p/python-on-a-chip/ - diff --git a/doc/source/old_toolchain/toolchain.rst b/doc/source/old_toolchain/toolchain.rst deleted file mode 100644 index b301a5a9f5..0000000000 --- a/doc/source/old_toolchain/toolchain.rst +++ /dev/null @@ -1,66 +0,0 @@ -Toolchain -========= - -Introduction ------------- - -In terms of comparaison, you can check how Python for android can be useful -compared to other projects. - -+--------------------+---------------+---------------+----------------+--------------+ -| Project | Native Python | GUI libraries | APK generation | Custom build | -+====================+===============+===============+================+==============+ -| Python for android | Yes | Yes | Yes | Yes | -+--------------------+---------------+---------------+----------------+--------------+ -| PGS4A | Yes | Yes | Yes | No | -+--------------------+---------------+---------------+----------------+--------------+ -| Android scripting | No | No | No | No | -+--------------------+---------------+---------------+----------------+--------------+ -| Python on a chip | No | No | No | No | -+--------------------+---------------+---------------+----------------+--------------+ - -.. note:: - - For the moment, we are shipping only one "java bootstrap" (needed for - decompressing your packaged zip file project, create an OpenGL ES 2.0 - surface, handle touch input and manage an audio thread). - - If you want to use it without kivy module (an opengl es 2.0 ui toolkit), - then you might want a lighter java bootstrap, that we don't have right now. - Help is welcome :) - - So for the moment, Python for Android can only be used with the kivy GUI toolkit: - http://kivy.org/#home - - -How does it work ? ------------------- - -To be able to run Python on android, you need to compile it for android. And -you need to compile all the libraries you want for android too. -Since Python is a language, not a toolkit, you cannot draw any user interface -with it: you need to use a toolkit for it. Kivy can be one of them. - -So for a simple ui project, the first step is to compile Python + Kivy + all -others libraries. Then you'll have what we call a "distribution". -A distribution is composed of: - -- Python -- Python libraries -- All selected libraries (kivy, pygame, pil...) -- A java bootstrap -- A build script - -You'll use the build script for create an "apk": an android package. - - -.. include:: prerequisites.rst -.. include:: usage.rst -.. include:: customize.rst - -.. toctree:: - :hidden: - - prerequisites - usage - customize diff --git a/doc/source/old_toolchain/usage.rst b/doc/source/old_toolchain/usage.rst deleted file mode 100644 index 7d83b23888..0000000000 --- a/doc/source/old_toolchain/usage.rst +++ /dev/null @@ -1,167 +0,0 @@ -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. From 7e4841de2051b91a2afce31907cfae531d868cf1 Mon Sep 17 00:00:00 2001 From: Alexander Taylor Date: Thu, 31 Jan 2019 16:14:43 +0000 Subject: [PATCH 2/3] Added doc note about overriding recipe source locations --- doc/source/quickstart.rst | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/doc/source/quickstart.rst b/doc/source/quickstart.rst index 8de4471a01..5e56bbc2bb 100644 --- a/doc/source/quickstart.rst +++ b/doc/source/quickstart.rst @@ -282,6 +282,17 @@ include such as:: --android_api 27 --requirements kivy,openssl +Overriding recipes sources +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +You can override the source of any recipe using the +``$P4A_recipename_DIR` environment variable. For instance, to test +your own Kivy branch you might set:: + + export P4A_kivy_DIR=/home/username/kivy + +The specified directory will be copied into python-for-android instead +of downloading from the normal url specified in the recipe. Going further ~~~~~~~~~~~~~ From f192df114a7fbb356450834fc2f96518da7692b4 Mon Sep 17 00:00:00 2001 From: Alexander Taylor Date: Thu, 31 Jan 2019 16:23:20 +0000 Subject: [PATCH 3/3] Fixed rst syntax, missing quote --- doc/source/quickstart.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/quickstart.rst b/doc/source/quickstart.rst index 5e56bbc2bb..3e8042537a 100644 --- a/doc/source/quickstart.rst +++ b/doc/source/quickstart.rst @@ -286,7 +286,7 @@ Overriding recipes sources ~~~~~~~~~~~~~~~~~~~~~~~~~~ You can override the source of any recipe using the -``$P4A_recipename_DIR` environment variable. For instance, to test +``$P4A_recipename_DIR`` environment variable. For instance, to test your own Kivy branch you might set:: export P4A_kivy_DIR=/home/username/kivy