android -
Android platform support and APIs
Compilation for Android
The compiler generates an APK file as the output when the android
module is imported by the compilation target. The path to the generated
file can be specified using the -o
and --dir
options.
Host system configuration
To compile Android apps from a 64 bits GNU/Linux host you can reuse an existing Android Studio installation or make a clean install with command line tools only.
Note that this guide supports only 64 bits GNU/Linux hosts with support for a Java 8 JDK, it may be possible to support other platforms with some tweaks.
Install the required SDK packages using one of these two methods:
a. Using Android Studio, open
Tools > Android > SDK Manager
, in the SDK Tools tab,install "Android SDK Build-Tools", CMake and NDK.
b. From the command line, run this script for a quick setup without Android Studio.
You will probably need to tweak it to you system or update the download URL to the latest SDK tools from https://developer.android.com/studio/index.html#command-tools
# Fetch and extract SDK tools mkdir -p ~/Android/Sdk cd ~/Android/Sdk wget https://dl.google.com/android/repository/sdk-tools-linux-3859397.zip unzip sdk-tools-linux-3859397.zip # Update tools tools/bin/sdkmanager --update # Accept the licenses tools/bin/sdkmanager --licenses # Install the basic build tools tools/bin/sdkmanager "build-tools;27.0.0" ndk-bundle
Set the environment variable ANDROID_HOME to the SDK installation directory, usually
~/Android/Sdk/
. Use the following command to setup the variable for bash.echo "export ANDROID_HOME=~/Android/Sdk/" >> ~/.bashrc
Install Java 8 JDK, on Debian/Ubuntu systems you can use the following command:
sudo apt install openjdk-8-jdk
Configure the Android application
The app.nit framework and this project offers some services to customize the generated Android application.
Annotations
All app.nit annotations are applied to Android projects:
app_name
,app_namespace
andapp_version
.See:
../app/README.md
Custom information can be added to the Android manifest file using the annotations
android_manifest
,android_manifest_application
andandroid_manifest_activity
.Example usage to specify an extra permission:
android_manifest """<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>"""
The API version target can be specified with
android_api_min
,android_api_max
andandroid_api_target
. These take a single integer as argument. They are applied in the Android manifest asminSdkVesion
,targetSdkVersion
andmaxSdkVersion
.See http://developer.android.com/guide/topics/manifest/uses-sdk-element.html
The annotation
android_activity
defines a Java class used as an entry point to your application. As of now, this annotation should only be used by low-level implementations of Nit on Android. Its usefulness will be extended in the future to customize user applications.
Android implementation
There is two core implementation for Nit apps on Android.
android::nit_activity
is used by apps with standard windows and native UI controls.
android::game
is used by, well, games and the game frameworks mnit
and gamnit
.
Clients don't have to select the core implementation, it is imported by other relevant modules.
For example, a module importing app::ui
and android
will trigger the importation of android::nit_activity
.
Lock app orientation
Importing android::landscape
or android::portrait
locks the generated
application in the specified orientation. This can be useful for games and
other multimedia applications.
Resources and application icon
Resources specific to the Android platform should be placed in an android/
folder at the root of the project.
The folder should adopt the structure of a normal Android project, e.g., a custom XML resource file can be placed
at android/res/values/color.xml
to be compiled with the Android application.
The application icon should also be placed in the android/
folder.
Place the classic bitmap version at android/res/mipmap-hdpi/ic_launcher.png
(and others),
and the adaptive version at android/res/mipmap-anydpi-v26/ic_launcher.xml
.
The Nit compiler detects these files and uses them as the application icon.
Additional android/
folders may be placed next to more specific Nit modules to change the Android resources
for application variants. The more specific resources will have priority over the project level android/
files.
Compilation modes
There are two compilation modes for the Android platform, debug and release.
Theses modes are also applied to the generated Android projects.
The compilation mode is specified as an argument to nitc
, only
--release
can be specified as debug is the default behavior.
Debug mode
Debug mode enables compiling to an APK file without handling signing keys and their password. The APK file can be installed to a local device with USB debugging enabled, but it cannot be published on the Play Store.
By default, nitc
will compile Android applications in debug mode.
Release mode
Building in release mode will use your private key to sign the APK file, it can then be published on the Play Store.
Have a keystore with a valid key to sign your APK file.
To create a new keystore, avoid using the default values of
jarsigner
as they change between versions of the Java SDK. You should instead use a command similar to the following, replacingKEYSTORE_PATH
andKEY_ALIAS
with the desired values.keytool -genkey -keystore KEYSTORE_PATH -alias KEY_ALIAS -sigalg MD5withRSA -keyalg RSA -keysize 1024 -validity 10000
Set the environment variables used by
nitc
:KEYSTORE
,KEY_ALIAS
and optionallyTSA_SERVER
. These settings can be set in a startup script such as~/.bashrc
or in a local Makefile.You can use the following commands by replacing the right-hand values to your own configuration.
export KEYSTORE=keystore_path export KEY_ALIAS=key_alias export TSA_SERVER=timestamp_authority_server_url # Optional
Call
nitc
with the--release
options. You will be prompted for therequired passwords as needed by
jarsigner
.
Content
- android: Android platform support and APIs (lib/android)
- activities: Android Activities wrapper (lib/android/activities.nit)
- android: Android services and implementation of app.nit (lib/android/android.nit)
- assets: Implementation of
app::assets
(lib/android/assets.nit) - assets_and_resources: Android Assets and Resources Management (lib/android/assets_and_resources.nit)
- audio: Android audio services, wraps a part of android audio API (lib/android/audio.nit)
- aware: Android compatibility module (lib/android/aware.nit)
- bundle: A mapping class of
String
to various value types used by the (lib/android/bundle/bundle.nit) - cardboard: Services from the Google Cardboard SDK for virtual reality on Android (lib/android/cardboard.nit)
- dalvik: Java related services specific to Android and its Dalvik VM (lib/android/dalvik.nit)
- data_store: Implements
app::data_store
usingshared_preferences
(lib/android/data_store.nit) - examples (lib/android/examples)
- src (lib/android/examples/src)
- ui_test: Test for app.nit's UI services (lib/android/examples/src/ui_test.nit)
- src (lib/android/examples/src)
- game: Android services and implementation of app.nit for gamnit and mnit (lib/android/game.nit)
- gamepad: Support for gamepad events (over Bluetooth or USB) (lib/android/gamepad.nit)
- http_request: Android implementation of
app:http_request
(lib/android/http_request.nit) - input_events: Pointer and hardware key events (lib/android/input_events.nit)
- intent (lib/android/intent)
- intent: Services allowing to launch activities and start/stop services using (lib/android/intent/intent.nit)
- intent_api10: Services allowing to launch activities and start/stop services using (lib/android/intent/intent_api10.nit)
- intent_api11: Refines intent module to add API 11 services (lib/android/intent/intent_api11.nit)
- intent_api12: Refines intent module to add API 12 services (lib/android/intent/intent_api12.nit)
- intent_api14: Refines intent module to add API 14 services (lib/android/intent/intent_api14.nit)
- intent_api15: Refines intent module to add API 15 services (lib/android/intent/intent_api15.nit)
- intent_api16: Refines intent module to add API 16 services (lib/android/intent/intent_api16.nit)
- intent_api17: Refines intent module to add API 17 services (lib/android/intent/intent_api17.nit)
- intent_api18: Refines intent module to add API 18 services (lib/android/intent/intent_api18.nit)
- intent_api19: Refines intent module to add API 19 services (lib/android/intent/intent_api19.nit)
- key_event (lib/android/key_event.nit)
- landscape: Lock the application in the landscape orientation (lib/android/landscape.nit)
- load_image: Low-level services to load pixel data from the assets (lib/android/load_image.nit)
- log: Advanced Android logging services (lib/android/log.nit)
- native_app_glue: Wrapper of the Android native_app_glue framework to implement app.nit (lib/android/native_app_glue.nit)
- nit_activity: Core implementation of
app.nit
on Android using a custom Java entry point (lib/android/nit_activity.nit) - notification (lib/android/notification)
- native_notification: Native Java classes for notifications (lib/android/notification/native_notification.nit)
- notification: Services to show notification in the Android status bar (lib/android/notification/notification.nit)
- platform: Triggers compilation for the android platform (lib/android/platform.nit)
- portrait: Config to set the portrait orientation (lib/android/portrait.nit)
- sensors: Access Android sensors (lib/android/sensors.nit)
- service (lib/android/service)
- at_boot: Import this module to launch
Service
at device boot (lib/android/service/at_boot.nit) - service: Android service support for app.nit centered around the class
Service
(lib/android/service/service.nit)
- at_boot: Import this module to launch
- shared_preferences (lib/android/shared_preferences)
- shared_preferences: Services allowing to save and load datas to internal android device (lib/android/shared_preferences/shared_preferences.nit)
- shared_preferences_api10: Services to save/load data using
android.content.SharedPreferences
for the android platform (lib/android/shared_preferences/shared_preferences_api10.nit) - shared_preferences_api11: Refines shared_preferences module to add API 11 services (lib/android/shared_preferences/shared_preferences_api11.nit)
- toast: Services to display a toast, a small popup on Android (lib/android/toast.nit)
- ui (lib/android/ui)
- native_ui: Native services from the
android.view
andandroid.widget
namespaces (lib/android/ui/native_ui.nit) - ui: Views and services to use the Android native user interface (lib/android/ui/ui.nit)
- native_ui: Native services from the
- vibration: Vibration services for Android (lib/android/vibration.nit)
- wifi: Simple wrapper of the Android WiFi services (lib/android/wifi.nit)