Path: blob/master/platform/android/export/export_plugin.h
20836 views
/**************************************************************************/1/* export_plugin.h */2/**************************************************************************/3/* This file is part of: */4/* GODOT ENGINE */5/* https://godotengine.org */6/**************************************************************************/7/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */8/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */9/* */10/* Permission is hereby granted, free of charge, to any person obtaining */11/* a copy of this software and associated documentation files (the */12/* "Software"), to deal in the Software without restriction, including */13/* without limitation the rights to use, copy, modify, merge, publish, */14/* distribute, sublicense, and/or sell copies of the Software, and to */15/* permit persons to whom the Software is furnished to do so, subject to */16/* the following conditions: */17/* */18/* The above copyright notice and this permission notice shall be */19/* included in all copies or substantial portions of the Software. */20/* */21/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */22/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */23/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */24/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */25/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */26/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */27/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */28/**************************************************************************/2930#pragma once3132#ifndef DISABLE_DEPRECATED33#include "godot_plugin_config.h"34#endif // DISABLE_DEPRECATED3536#include "gradle_export_util.h"3738#include "core/io/image.h"39#include "core/io/zip_io.h"40#include "core/os/os.h"41#include "editor/export/editor_export_platform.h"4243class ImageTexture;4445// Optional environment variables for defining confidential information. If any46// of these is set, they will override the values set in the credentials file.47const String ENV_ANDROID_KEYSTORE_DEBUG_PATH = "GODOT_ANDROID_KEYSTORE_DEBUG_PATH";48const String ENV_ANDROID_KEYSTORE_DEBUG_USER = "GODOT_ANDROID_KEYSTORE_DEBUG_USER";49const String ENV_ANDROID_KEYSTORE_DEBUG_PASS = "GODOT_ANDROID_KEYSTORE_DEBUG_PASSWORD";50const String ENV_ANDROID_KEYSTORE_RELEASE_PATH = "GODOT_ANDROID_KEYSTORE_RELEASE_PATH";51const String ENV_ANDROID_KEYSTORE_RELEASE_USER = "GODOT_ANDROID_KEYSTORE_RELEASE_USER";52const String ENV_ANDROID_KEYSTORE_RELEASE_PASS = "GODOT_ANDROID_KEYSTORE_RELEASE_PASSWORD";5354const String DEFAULT_ANDROID_KEYSTORE_DEBUG_USER = "androiddebugkey";55const String DEFAULT_ANDROID_KEYSTORE_DEBUG_PASSWORD = "android";5657struct LauncherIcon {58const char *export_path;59int dimensions = 0;60};6162class AndroidEditorGradleRunner;6364class EditorExportPlatformAndroid : public EditorExportPlatform {65GDCLASS(EditorExportPlatformAndroid, EditorExportPlatform);6667Ref<ImageTexture> logo;68Ref<ImageTexture> run_icon;6970struct Device {71String id;72String name;73String description;74int api_level = 0;75String architecture;76};7778struct APKExportData {79EditorExportPlatform::PackData pd;80zipFile apk;81EditorProgress *ep = nullptr;82};8384struct FeatureInfo {85String name;86bool required;87String version;88};8990#ifndef DISABLE_DEPRECATED91mutable Vector<PluginConfigAndroid> android_plugins;92mutable SafeFlag android_plugins_changed;93Mutex android_plugins_lock;94#endif // DISABLE_DEPRECATED95String last_plugin_names;96uint64_t last_gradle_build_time = 0;97String last_gradle_build_dir;9899#ifndef ANDROID_ENABLED100bool use_scrcpy = false;101Vector<Device> devices;102SafeFlag devices_changed;103Mutex device_lock;104105Thread check_for_changes_thread;106SafeFlag quit_request;107SafeFlag has_runnable_preset;108109static void _check_for_changes_poll_thread(void *ud);110void _update_preset_status();111#else // ANDROID_ENABLED112AndroidEditorGradleRunner *android_editor_gradle_runner = nullptr;113#endif // ANDROID_ENABLED114115String get_project_name(const Ref<EditorExportPreset> &p_preset, const String &p_name) const;116117String get_package_name(const Ref<EditorExportPreset> &p_preset, const String &p_package) const;118119String get_valid_basename(const Ref<EditorExportPreset> &p_preset) const;120121String get_assets_directory(const Ref<EditorExportPreset> &p_preset, int p_export_format) const;122123bool is_package_name_valid(const Ref<EditorExportPreset> &p_preset, const String &p_package, String *r_error = nullptr) const;124bool is_project_name_valid(const Ref<EditorExportPreset> &p_preset) const;125126static bool _should_compress_asset(const String &p_path, const Vector<uint8_t> &p_data);127128static zip_fileinfo get_zip_fileinfo();129130struct ABI {131String abi;132String arch;133134bool operator==(const ABI &p_a) const {135return p_a.abi == abi;136}137138ABI(const String &p_abi, const String &p_arch) {139abi = p_abi;140arch = p_arch;141}142ABI() {}143};144145static Vector<ABI> get_abis();146147#ifndef DISABLE_DEPRECATED148/// List the gdap files in the directory specified by the p_path parameter.149static Vector<String> list_gdap_files(const String &p_path);150151static Vector<PluginConfigAndroid> get_plugins();152153static Vector<PluginConfigAndroid> get_enabled_plugins(const Ref<EditorExportPreset> &p_presets);154#endif // DISABLE_DEPRECATED155156static Error store_in_apk(APKExportData *ed, const String &p_path, const Vector<uint8_t> &p_data, int compression_method = Z_DEFLATED);157158static Error save_apk_so(const Ref<EditorExportPreset> &p_preset, void *p_userdata, const SharedObject &p_so);159160static Error save_apk_file(const Ref<EditorExportPreset> &p_preset, void *p_userdata, const String &p_path, const Vector<uint8_t> &p_data, int p_file, int p_total, const Vector<String> &p_enc_in_filters, const Vector<String> &p_enc_ex_filters, const Vector<uint8_t> &p_key, uint64_t p_seed, bool p_delta);161162static Error ignore_apk_file(const Ref<EditorExportPreset> &p_preset, void *p_userdata, const String &p_path, const Vector<uint8_t> &p_data, int p_file, int p_total, const Vector<String> &p_enc_in_filters, const Vector<String> &p_enc_ex_filters, const Vector<uint8_t> &p_key, uint64_t p_seed, bool p_delta);163164static Error copy_gradle_so(const Ref<EditorExportPreset> &p_preset, void *p_userdata, const SharedObject &p_so);165166bool _has_read_write_storage_permission(const Vector<String> &p_permissions);167168bool _has_manage_external_storage_permission(const Vector<String> &p_permissions);169170void _get_manifest_info(const Ref<EditorExportPreset> &p_preset, bool p_give_internet, Vector<String> &r_permissions, Vector<FeatureInfo> &r_features, Vector<MetadataInfo> &r_metadata);171172void _write_tmp_manifest(const Ref<EditorExportPreset> &p_preset, bool p_give_internet, bool p_debug);173174bool _is_transparency_allowed(const Ref<EditorExportPreset> &p_preset) const;175176void _fix_themes_xml(const Ref<EditorExportPreset> &p_preset);177178void _fix_manifest(const Ref<EditorExportPreset> &p_preset, Vector<uint8_t> &p_manifest, bool p_give_internet);179180static String _get_keystore_path(const Ref<EditorExportPreset> &p_preset, bool p_debug);181182static String _parse_string(const uint8_t *p_bytes, bool p_utf8);183184void _fix_resources(const Ref<EditorExportPreset> &p_preset, Vector<uint8_t> &r_manifest);185186void _process_launcher_icons(const String &p_file_name, const Ref<Image> &p_source_image, int dimension, Vector<uint8_t> &p_data);187188void load_icon_refs(const Ref<EditorExportPreset> &p_preset, Ref<Image> &icon, Ref<Image> &foreground, Ref<Image> &background, Ref<Image> &monochrome);189190void _copy_icons_to_gradle_project(const Ref<EditorExportPreset> &p_preset,191const Ref<Image> &p_main_image,192const Ref<Image> &p_foreground,193const Ref<Image> &p_background,194const Ref<Image> &p_monochrome);195196static void _create_editor_debug_keystore_if_needed();197198static Vector<ABI> get_enabled_abis(const Ref<EditorExportPreset> &p_preset);199200bool _uses_vulkan(const Ref<EditorExportPreset> &p_preset) const;201202Error _generate_sparse_pck_metadata(const Ref<EditorExportPreset> &p_preset, PackData &p_pack_data, Vector<uint8_t> &r_data);203204protected:205void _notification(int p_what);206207public:208typedef Error (*EditorExportSaveFunction)(void *p_userdata, const String &p_path, const Vector<uint8_t> &p_data, int p_file, int p_total, const Vector<String> &p_enc_in_filters, const Vector<String> &p_enc_ex_filters, const Vector<uint8_t> &p_key, uint64_t p_seed);209210virtual void get_preset_features(const Ref<EditorExportPreset> &p_preset, List<String> *r_features) const override;211212virtual void get_export_options(List<ExportOption> *r_options) const override;213214virtual bool get_export_option_visibility(const EditorExportPreset *p_preset, const String &p_option) const override;215216virtual String get_export_option_warning(const EditorExportPreset *p_preset, const StringName &p_name) const override;217218virtual String get_name() const override;219220virtual String get_os_name() const override;221222virtual Ref<Texture2D> get_logo() const override;223224virtual bool should_update_export_options() override;225226#ifndef ANDROID_ENABLED227virtual bool poll_export() override;228229virtual int get_options_count() const override;230231virtual Ref<Texture2D> get_option_icon(int p_index) const override;232233virtual bool is_option_runnable(int p_index) const override { return p_index != 0; }234235virtual String get_options_tooltip() const override;236237virtual String get_option_label(int p_index) const override;238239virtual String get_option_tooltip(int p_index) const override;240241virtual String get_device_architecture(int p_index) const override;242243virtual Error run(const Ref<EditorExportPreset> &p_preset, int p_device, BitField<EditorExportPlatform::DebugFlags> p_debug_flags) override;244#endif // ANDROID_ENABLED245246virtual Ref<Texture2D> get_run_icon() const override;247248static String get_adb_path();249250static String get_apksigner_path(int p_target_sdk = -1, bool p_check_executes = false);251252static String get_java_path();253254static String get_keytool_path();255256virtual bool has_valid_export_configuration(const Ref<EditorExportPreset> &p_preset, String &r_error, bool &r_missing_templates, bool p_debug = false) const override;257virtual bool has_valid_project_configuration(const Ref<EditorExportPreset> &p_preset, String &r_error) const override;258static bool has_valid_username_and_password(const Ref<EditorExportPreset> &p_preset, String &r_error);259260virtual List<String> get_binary_extensions(const Ref<EditorExportPreset> &p_preset) const override;261262String _get_deprecated_plugins_names(const Ref<EditorExportPreset> &p_preset) const;263264String _get_plugins_names(const Ref<EditorExportPreset> &p_preset) const;265266String _resolve_export_plugin_android_library_path(const String &p_android_library_path) const;267268bool _is_clean_build_required(const Ref<EditorExportPreset> &p_preset);269270String get_apk_expansion_fullpath(const Ref<EditorExportPreset> &p_preset, const String &p_path);271272Error save_apk_expansion_file(const Ref<EditorExportPreset> &p_preset, bool p_debug, const String &p_path);273274void get_command_line_flags(const Ref<EditorExportPreset> &p_preset, const String &p_path, BitField<EditorExportPlatform::DebugFlags> p_flags, Vector<uint8_t> &r_command_line_flags);275276Error sign_apk(const Ref<EditorExportPreset> &p_preset, bool p_debug, const String &export_path, EditorProgress &ep);277278void _clear_assets_directory(const Ref<EditorExportPreset> &p_preset);279280void _remove_copied_libs(String p_gdextension_libs_path);281282static String join_list(const List<String> &p_parts, const String &p_separator);283static String join_abis(const Vector<ABI> &p_parts, const String &p_separator, bool p_use_arch);284285virtual Error export_project(const Ref<EditorExportPreset> &p_preset, bool p_debug, const String &p_path, BitField<EditorExportPlatform::DebugFlags> p_flags = 0) override;286287Error export_project_helper(const Ref<EditorExportPreset> &p_preset, bool p_debug, const String &p_path, int export_format, bool should_sign, BitField<EditorExportPlatform::DebugFlags> p_flags);288289virtual void get_platform_features(List<String> *r_features) const override;290291virtual void resolve_platform_feature_priorities(const Ref<EditorExportPreset> &p_preset, HashSet<String> &p_features) override;292293virtual void initialize() override;294295~EditorExportPlatformAndroid();296};297298299