mirror of
https://github.com/Relintai/pandemonium_engine_docs.git
synced 2025-01-08 15:09:50 +01:00
171 lines
8.5 KiB
ReStructuredText
171 lines
8.5 KiB
ReStructuredText
.. _doc_android_plugin:
|
|
|
|
Creating Android plugins
|
|
========================
|
|
|
|
Introduction
|
|
------------
|
|
|
|
Android plugins are powerful tools to extend the capabilities of the Godot engine
|
|
by tapping into the functionality provided by the Android platform and ecosystem.
|
|
|
|
Mobile gaming monetization is one such example since it requires features
|
|
and capabilities that don't belong to the core feature set of a game engine:
|
|
|
|
- Analytics
|
|
- In-app purchases
|
|
- Receipt validation
|
|
- Install tracking
|
|
- Ads
|
|
- Video ads
|
|
- Cross-promotion
|
|
- In-game soft & hard currencies
|
|
- Promo codes
|
|
- A/B testing
|
|
- Login
|
|
- Cloud saves
|
|
- Leaderboards and scores
|
|
- User support & feedback
|
|
- Posting to Facebook, Twitter, etc.
|
|
- Push notifications
|
|
|
|
Android plugin
|
|
--------------
|
|
|
|
While introduced in Godot 3.2, the Android plugin system got a significant architecture update starting with Godot 3.2.2.
|
|
The new plugin system is backward-incompatible with the previous one, but both systems are kept functional in future releases of the 3.2.x branch.
|
|
Since we previously did not version the Android plugin systems, the new one is now labelled `v1` and is the starting point for the modern Godot Android ecosystem.
|
|
|
|
**Note:** In Godot 4.0, the previous system will be fully deprecated and removed.
|
|
|
|
As a prerequisite, make sure you understand how to set up a `custom build environment<doc_android_custom_build>` for Android.
|
|
|
|
At its core, a Godot Android plugin is a `Android archive library <https://developer.android.com/studio/projects/android-library#aar-contents>`_ (*aar* archive file)
|
|
with the following caveats:
|
|
|
|
- The library must have a dependency on the Godot engine library (`godot-lib.<version>.<status>.aar`). A stable version is made available for each Godot release on the `Godot download page <https://godotengine.org/download>`_.
|
|
- The library must include a specifically configured `<meta-data>` tag in its manifest file.
|
|
|
|
Building an Android plugin
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
**Prerequisite:** `Android Studio <https://developer.android.com/studio>`_ is strongly recommended as the IDE to use to create Android plugins.
|
|
The instructions below assumes that you're using Android Studio.
|
|
|
|
1. Follow `these instructions <https://developer.android.com/studio/projects/android-library>`__ to create an Android library module for your plugin.
|
|
|
|
2. Add the Godot engine library as a dependency to your plugin module:
|
|
|
|
- Download the Godot engine library (`godot-lib.<version>.<status>.aar`) from the `Godot download page <https://godotengine.org/download>`_ (e.g.: `godot-lib.3.4.2.stable.release.aar`).
|
|
- Follow `these instructions <https://developer.android.com/studio/projects/android-library#AddDependency>`__ to add
|
|
the Godot engine library as a dependency for your plugin.
|
|
- In the plugin module's `build.gradle` file, replace `implementation` with `compileOnly` for the dependency line for the Godot engine library.
|
|
|
|
3. Create a new class in the plugin module and make sure it extends `org.godotengine.godot.plugin.GodotPlugin`.
|
|
At runtime, it will be used to instantiate a singleton object that will be used by the Godot engine to load, initialize and run the plugin.
|
|
|
|
4. Update the plugin `AndroidManifest.xml` file:
|
|
|
|
- Open the plugin `AndroidManifest.xml` file.
|
|
- Add the `<application></application>` tag if it's missing.
|
|
- In the `<application>` tag, add a `<meta-data>` tag setup as follow::
|
|
|
|
<meta-data
|
|
android:name="org.godotengine.plugin.v1.[PluginName]"
|
|
android:value="[plugin.init.ClassFullName]" />
|
|
|
|
Where `PluginName` is the name of the plugin, and `plugin.init.ClassFullName` is the full name (package + class name) of the plugin loading class.
|
|
|
|
5. Add the remaining logic for your plugin and run the `gradlew build` command to generate the plugin's `aar` file.
|
|
The build will likely generate both a `debug` and `release` `aar` files.
|
|
Depending on your need, pick only one version (usually the `release` one) which to provide your users with.
|
|
|
|
It's recommended that the `aar` filename matches the following pattern: `[PluginName]*.aar` where `PluginName` is the name of the plugin in PascalCase (e.g.: `GodotPayment.release.aar`).
|
|
|
|
6. Create a Godot Android Plugin configuration file to help the system detect and load your plugin:
|
|
|
|
- The configuration file extension must be `gdap` (e.g.: `MyPlugin.gdap`).
|
|
- The configuration file format is as follow::
|
|
|
|
[config]
|
|
|
|
name="MyPlugin"
|
|
binary_type="local"
|
|
binary="MyPlugin.aar"
|
|
|
|
[dependencies]
|
|
|
|
local=["local_dep1.aar", "local_dep2.aar"]
|
|
remote=["example.plugin.android:remote-dep1:0.0.1", "example.plugin.android:remote-dep2:0.0.1"]
|
|
custom_maven_repos=["http://repo.mycompany.com/maven2"]
|
|
|
|
The `config` section and fields are required and defined as follow:
|
|
|
|
- **name**: name of the plugin.
|
|
- **binary_type**: can be either `local` or `remote`. The type affects the **binary** field.
|
|
- **binary**:
|
|
|
|
- If **binary_type** is `local`, then this should be the filepath of the plugin `aar` file.
|
|
|
|
- The filepath can be relative (e.g.: `MyPlugin.aar`) in which case it's relative to the `res://android/plugins` directory.
|
|
- The filepath can be absolute: `res://some_path/MyPlugin.aar`.
|
|
|
|
- If **binary_type** is `remote`, then this should be a declaration for a `remote gradle binary <https://developer.android.com/studio/build/dependencies#dependency-types>`_ (e.g.: `org.godot.example:my-plugin:0.0.0`).
|
|
|
|
The `dependencies` section and fields are optional and defined as follow:
|
|
|
|
- **local**: contains a list of filepaths to the local `.aar` binary files the plugin depends on. Similarly to the `binary` field (when the `binary_type` is `local`), the local binaries' filepaths can be relative or absolute.
|
|
- **remote**: contains a list of remote binary gradle dependencies for the plugin.
|
|
- **custom_maven_repos**: contains a list of URLs specifying the custom maven repositories required for the plugin's dependencies.
|
|
|
|
Loading and using an Android plugin
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
Move the plugin configuration file (e.g.: `MyPlugin.gdap`) and, if any, its local binary (e.g.: `MyPlugin.aar`) and dependencies to the Godot project's `res://android/plugins` directory.
|
|
|
|
The Godot editor will automatically parse all `.gdap` files in the `res://android/plugins` directory and show a list of detected and toggleable plugins in the Android export presets window under the **Plugins** section.
|
|
|
|
.. image:: img/android_export_preset_plugins_section.png
|
|
|
|
From your script:
|
|
|
|
.. code::
|
|
|
|
if Engine.has_singleton("MyPlugin"):
|
|
var singleton = Engine.get_singleton("MyPlugin")
|
|
print(singleton.myPluginFunction("World"))
|
|
|
|
|
|
Bundling GDNative resources
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
An Android plugin can define and provide C/C++ GDNative resources, either to provide and/or access functionality from the game logic.
|
|
The GDNative resources can be bundled within the plugin `aar` file which simplifies the distribution and deployment process:
|
|
|
|
- The shared libraries (`.so`) for the defined GDNative libraries will be automatically bundled by the `aar` build system.
|
|
- Godot `*.gdnlib` and `*.gdns` resource files must be manually defined in the plugin `assets` directory.
|
|
The recommended path for these resources relative to the `assets` directory should be: `godot/plugin/v1/[PluginName]/`.
|
|
|
|
For GDNative libraries, the plugin singleton object must override the `org.godotengine.godot.plugin.GodotPlugin::getPluginGDNativeLibrariesPaths()` method,
|
|
and return the paths to the bundled GDNative libraries config files (`*.gdnlib`). The paths must be relative to the `assets` directory.
|
|
At runtime, the plugin will provide these paths to Godot core which will use them to load and initialize the bundled GDNative libraries.
|
|
|
|
Reference implementations
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
- `Godot Oculus Mobile plugin <https://github.com/GodotVR/godot_oculus_mobile>`_
|
|
- `Bundled gdnative resources <https://github.com/GodotVR/godot_oculus_mobile/tree/master/plugin/src/main/assets/addons/godot_ovrmobile>`_
|
|
- `Godot Google Play Billing plugin <https://github.com/godotengine/godot-google-play-billing>`_
|
|
|
|
|
|
Troubleshooting
|
|
---------------
|
|
|
|
Godot crashes upon load
|
|
^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
Check `adb logcat` for possible problems, then:
|
|
|
|
- Check that the methods exposed by the plugin used the following Java types: `void`, `boolean`, `int`, `float`, `java.lang.String`, `org.godotengine.godot.Dictionary`, `int[]`, `byte[]`, `float[]`, `java.lang.String[]`.
|
|
- More complex datatypes are not supported for now.
|