Path: blob/master/platform/android/export/export_plugin.h
10278 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"4243// Optional environment variables for defining confidential information. If any44// of these is set, they will override the values set in the credentials file.45const String ENV_ANDROID_KEYSTORE_DEBUG_PATH = "GODOT_ANDROID_KEYSTORE_DEBUG_PATH";46const String ENV_ANDROID_KEYSTORE_DEBUG_USER = "GODOT_ANDROID_KEYSTORE_DEBUG_USER";47const String ENV_ANDROID_KEYSTORE_DEBUG_PASS = "GODOT_ANDROID_KEYSTORE_DEBUG_PASSWORD";48const String ENV_ANDROID_KEYSTORE_RELEASE_PATH = "GODOT_ANDROID_KEYSTORE_RELEASE_PATH";49const String ENV_ANDROID_KEYSTORE_RELEASE_USER = "GODOT_ANDROID_KEYSTORE_RELEASE_USER";50const String ENV_ANDROID_KEYSTORE_RELEASE_PASS = "GODOT_ANDROID_KEYSTORE_RELEASE_PASSWORD";5152const String DEFAULT_ANDROID_KEYSTORE_DEBUG_USER = "androiddebugkey";53const String DEFAULT_ANDROID_KEYSTORE_DEBUG_PASSWORD = "android";5455struct LauncherIcon {56const char *export_path;57int dimensions = 0;58};5960class EditorExportPlatformAndroid : public EditorExportPlatform {61GDCLASS(EditorExportPlatformAndroid, EditorExportPlatform);6263Ref<ImageTexture> logo;64Ref<ImageTexture> run_icon;6566struct Device {67String id;68String name;69String description;70int api_level = 0;71String architecture;72};7374struct APKExportData {75EditorExportPlatform::PackData pd;76zipFile apk;77EditorProgress *ep = nullptr;78};7980struct FeatureInfo {81String name;82bool required;83String version;84};8586#ifndef DISABLE_DEPRECATED87mutable Vector<PluginConfigAndroid> android_plugins;88mutable SafeFlag android_plugins_changed;89Mutex android_plugins_lock;90#endif // DISABLE_DEPRECATED91String last_plugin_names;92uint64_t last_gradle_build_time = 0;93String last_gradle_build_dir;9495Vector<Device> devices;96SafeFlag devices_changed;97Mutex device_lock;98#ifndef ANDROID_ENABLED99Thread check_for_changes_thread;100SafeFlag quit_request;101SafeFlag has_runnable_preset;102103static void _check_for_changes_poll_thread(void *ud);104void _update_preset_status();105#endif106107String get_project_name(const Ref<EditorExportPreset> &p_preset, const String &p_name) const;108109String get_package_name(const Ref<EditorExportPreset> &p_preset, const String &p_package) const;110111String get_valid_basename(const Ref<EditorExportPreset> &p_preset) const;112113String get_assets_directory(const Ref<EditorExportPreset> &p_preset, int p_export_format) const;114115bool is_package_name_valid(const Ref<EditorExportPreset> &p_preset, const String &p_package, String *r_error = nullptr) const;116bool is_project_name_valid(const Ref<EditorExportPreset> &p_preset) const;117118static bool _should_compress_asset(const String &p_path, const Vector<uint8_t> &p_data);119120static zip_fileinfo get_zip_fileinfo();121122struct ABI {123String abi;124String arch;125126bool operator==(const ABI &p_a) const {127return p_a.abi == abi;128}129130ABI(const String &p_abi, const String &p_arch) {131abi = p_abi;132arch = p_arch;133}134ABI() {}135};136137static Vector<ABI> get_abis();138139#ifndef DISABLE_DEPRECATED140/// List the gdap files in the directory specified by the p_path parameter.141static Vector<String> list_gdap_files(const String &p_path);142143static Vector<PluginConfigAndroid> get_plugins();144145static Vector<PluginConfigAndroid> get_enabled_plugins(const Ref<EditorExportPreset> &p_presets);146#endif // DISABLE_DEPRECATED147148static Error store_in_apk(APKExportData *ed, const String &p_path, const Vector<uint8_t> &p_data, int compression_method = Z_DEFLATED);149150static Error save_apk_so(void *p_userdata, const SharedObject &p_so);151152static Error save_apk_file(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);153154static Error ignore_apk_file(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);155156static Error copy_gradle_so(void *p_userdata, const SharedObject &p_so);157158bool _has_read_write_storage_permission(const Vector<String> &p_permissions);159160bool _has_manage_external_storage_permission(const Vector<String> &p_permissions);161162void _get_manifest_info(const Ref<EditorExportPreset> &p_preset, bool p_give_internet, Vector<String> &r_permissions, Vector<FeatureInfo> &r_features, Vector<MetadataInfo> &r_metadata);163164void _write_tmp_manifest(const Ref<EditorExportPreset> &p_preset, bool p_give_internet, bool p_debug);165166bool _is_transparency_allowed(const Ref<EditorExportPreset> &p_preset) const;167168void _fix_themes_xml(const Ref<EditorExportPreset> &p_preset);169170void _fix_manifest(const Ref<EditorExportPreset> &p_preset, Vector<uint8_t> &p_manifest, bool p_give_internet);171172static String _get_keystore_path(const Ref<EditorExportPreset> &p_preset, bool p_debug);173174static String _parse_string(const uint8_t *p_bytes, bool p_utf8);175176void _fix_resources(const Ref<EditorExportPreset> &p_preset, Vector<uint8_t> &r_manifest);177178void _load_image_data(const Ref<Image> &p_splash_image, Vector<uint8_t> &p_data);179180void _process_launcher_icons(const String &p_file_name, const Ref<Image> &p_source_image, int dimension, Vector<uint8_t> &p_data);181182void load_icon_refs(const Ref<EditorExportPreset> &p_preset, Ref<Image> &icon, Ref<Image> &foreground, Ref<Image> &background, Ref<Image> &monochrome);183184void _copy_icons_to_gradle_project(const Ref<EditorExportPreset> &p_preset,185const Ref<Image> &p_main_image,186const Ref<Image> &p_foreground,187const Ref<Image> &p_background,188const Ref<Image> &p_monochrome);189190static void _create_editor_debug_keystore_if_needed();191192static Vector<ABI> get_enabled_abis(const Ref<EditorExportPreset> &p_preset);193194bool _uses_vulkan(const Ref<EditorExportPreset> &p_preset) const;195196Error _generate_sparse_pck_metadata(const Ref<EditorExportPreset> &p_preset, PackData &p_pack_data, Vector<uint8_t> &r_data);197198protected:199void _notification(int p_what);200201public:202typedef 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);203204virtual void get_preset_features(const Ref<EditorExportPreset> &p_preset, List<String> *r_features) const override;205206virtual void get_export_options(List<ExportOption> *r_options) const override;207208virtual bool get_export_option_visibility(const EditorExportPreset *p_preset, const String &p_option) const override;209210virtual String get_export_option_warning(const EditorExportPreset *p_preset, const StringName &p_name) const override;211212virtual String get_name() const override;213214virtual String get_os_name() const override;215216virtual Ref<Texture2D> get_logo() const override;217218virtual bool should_update_export_options() override;219220virtual bool poll_export() override;221222virtual int get_options_count() const override;223224virtual String get_options_tooltip() const override;225226virtual String get_option_label(int p_index) const override;227228virtual String get_option_tooltip(int p_index) const override;229230virtual String get_device_architecture(int p_index) const override;231232virtual Error run(const Ref<EditorExportPreset> &p_preset, int p_device, BitField<EditorExportPlatform::DebugFlags> p_debug_flags) override;233234virtual Ref<Texture2D> get_run_icon() const override;235236static String get_adb_path();237238static String get_apksigner_path(int p_target_sdk = -1, bool p_check_executes = false);239240static String get_java_path();241242static String get_keytool_path();243244virtual bool has_valid_export_configuration(const Ref<EditorExportPreset> &p_preset, String &r_error, bool &r_missing_templates, bool p_debug = false) const override;245virtual bool has_valid_project_configuration(const Ref<EditorExportPreset> &p_preset, String &r_error) const override;246static bool has_valid_username_and_password(const Ref<EditorExportPreset> &p_preset, String &r_error);247248virtual List<String> get_binary_extensions(const Ref<EditorExportPreset> &p_preset) const override;249250String _get_deprecated_plugins_names(const Ref<EditorExportPreset> &p_preset) const;251252String _get_plugins_names(const Ref<EditorExportPreset> &p_preset) const;253254String _resolve_export_plugin_android_library_path(const String &p_android_library_path) const;255256bool _is_clean_build_required(const Ref<EditorExportPreset> &p_preset);257258String get_apk_expansion_fullpath(const Ref<EditorExportPreset> &p_preset, const String &p_path);259260Error save_apk_expansion_file(const Ref<EditorExportPreset> &p_preset, bool p_debug, const String &p_path);261262void 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);263264Error sign_apk(const Ref<EditorExportPreset> &p_preset, bool p_debug, const String &export_path, EditorProgress &ep);265266void _clear_assets_directory(const Ref<EditorExportPreset> &p_preset);267268void _remove_copied_libs(String p_gdextension_libs_path);269270static String join_list(const List<String> &p_parts, const String &p_separator);271static String join_abis(const Vector<ABI> &p_parts, const String &p_separator, bool p_use_arch);272273virtual Error export_project(const Ref<EditorExportPreset> &p_preset, bool p_debug, const String &p_path, BitField<EditorExportPlatform::DebugFlags> p_flags = 0) override;274275Error 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);276277virtual void get_platform_features(List<String> *r_features) const override;278279virtual void resolve_platform_feature_priorities(const Ref<EditorExportPreset> &p_preset, HashSet<String> &p_features) override;280281EditorExportPlatformAndroid();282283~EditorExportPlatformAndroid();284};285286287