Modules

Toolchain

moduleSource

Available on macOS, Linux, Windows

#import "Android/Toolchain";

Module parameters#

SDK_LEVEL := 34
The Android API level to build against and target.
ENABLE_ARM_LSE := true
Targets arm64 CPUs with the LSE atomic instructions.

Procedures#

ABI names#

SHA#

(s: string) -> [SHA_DIGEST_LENGTH] u8

Project API#

Manifest API#

SDK API#

Helper API#

Device API#

(apk_path: string, reinstall_keeping_data := false, allow_test_apk := false, allow_version_code_downgrade := false, uninstall_and_retry_on_key_mismatch := true, log_errors := true) -> bool

Gradle API#

Direct key#

JKS generation#

(java_bin_path: string, keystore_path: string, key_alias := DEFAULT_KEYSTORE_ALIAS, key_password := DEFAULT_KEYSTORE_PASSWORD, algorithm := Android_Signing_Key_Signature_Algorithm.EC, key_size := 0, common_name := "Jai Android", organization_name := "Jai", country_code := "US") -> (bool, Android_Signing_Key)

Format helpers#

ASN1 identity#

ASN1 tags#

ASN1 values#

ASN1 records#

ASN1 diagnostics#

asn1_print3 overloadsSource
(name: string, value: ASN1_Value)
(name: string, data: string)
(data: string, depth := 0, hack_skip_depth := false)

Byte readers#

($Int_Type: Type, s: *string, $BIG_ENDIAN := false) -> Int_Type

ASN1 hex#

ADB process#

(command_args: ..string, device_serial := "", log_adb_command_errors := false, print_captured_output := false, loc := #caller_location, try_and_escape_spaces_in_shell_arguments := true) -> (bool, output_string := "", error_string := "", exit_code := 0)

ADB transfer#

(local_source: string, remote_destination: string, only_update_newer_files := false, dry_run := false, compression_algorithm := Adb_Compression_Algorithm.UNSPECIFIED, disable_compression := false) -> bool
(remote_source: string, local_destination := "", preserve_timestamps := true, disable_compression := false, compression_algorithm := Adb_Compression_Algorithm.UNSPECIFIED) -> bool

ADB apps#

Java discovery#

SDK discovery#

Config flags#

X509 structure#

Android ZIP wire#

Android ZIP writer#

(w: *Zip_Writer, filepath: string, zip_filename: string, compression := Zip_Compression_Method.NONE, alignment := 0) -> bool

Android APK#

Crypto provider#

sign_datasince 0.31.0Source
(private_key_info: string, message: string) -> (bool, string)

JKS reader#

(data: string, password: string) -> (bool, certificate: string, encrypted_private_key_info: string)

JKS decryption#

APK signing framing#

APK signing digest#

APK signing orchestration#

(unsigned_apk_filepath: string, keystore_filepath: string, keystore_password := "password") -> (bool, string)
(unsigned_apk_filepath: string, private_key_info: string, certificate: string) -> (bool, string)

Build API#

Loader API#

Types#

:: struct
app_name: := "MyJaiApp"
project_path: := "AndroidProject"
app_id: := "jai.example"
version_code: := 1
version_name: := "0.1"
min_sdk_level: := 29
target_sdk_level: := SDK_LEVEL
lib_name: := "main"
theme: := Android_Default_Theme.Theme_Black_NoTitleBar
screen_orientation: := Android_Screen_Orientation.UNSPECIFIED
vr: := false
quest_enable_passthrough_splash: := false
android_manifest: string
application_meta_data: [] Meta_Data_Item
permissions: [] string
features: [] Feature
android_gradle_plugin_version: := "8.2.0"
gradle_version: := "8.2"
:: enum
UNSPECIFIED
LANDSCAPE
PORTRAIT
USER
BEHIND
SENSOR
NOSENSOR
SENSOR_LANDSCAPE
SENSOR_PORTRAIT
REVERSE_LANDSCAPE
REVERSE_PORTRAIT
FULL_SENSOR
USER_LANDSCAPE
USER_PORTRAIT
FULL_USER
LOCKED
:: enum
Theme
Theme_NoTitleBar
Theme_NoTitleBar_Fullscreen
Theme_Black
Theme_Black_NoTitleBar
Theme_Black_NoTitleBar_Fullscreen
Theme_Dialog
Theme_Light
Theme_Light_NoTitleBar
Theme_Light_NoTitleBar_Fullscreen
Theme_Translucent
Theme_Translucent_NoTitleBar
Theme_Translucent_NoTitleBar_Fullscreen
:: struct
size: u16
res0: u8
dataType: u8
data: u32
:: enum
UNSET
UNSPECIFIED
LANDSCAPE
PORTRAIT
USER
BEHIND
SENSOR
NOSENSOR
SENSOR_LANDSCAPE
SENSOR_PORTRAIT
REVERSE_LANDSCAPE
REVERSE_PORTRAIT
FULL_SENSOR
USER_LANDSCAPE
USER_PORTRAIT
FULL_USER
LOCKED
:: struct
raw_data: string
free_data_on_deinit: := false
string_pool: [] string
resource_ids: [] u32
android_namespace: Xml_Namespace
elements: [..] Xml_Element
:: struct
root: string
toolchain: string
sysroot: string
:: enum
RERSERVED_FOR_ENCODING_RULES
SEQUENCE
SET
BOOLEAN
INTEGER
ENUMERATED
REAL
NULL
BIT_STRING
OCTET_STRING
OBJECT_IDENTIFIER
RELATIVE_OBJECT_IDENTIFER
OBJECT_DESCRIPTOR
EMBEDDED_PDV
UTF8_STRING
NUMERIC_STRING
PRINTABLE_STRING
TELETEX_STRING
VIDEOTEX_STRING
IA5_STRING
GRAPHIC_STRING
VISIBLE_STRING
GENERAL_STRING
UNIVERSAL_STRING
BMP_STRING
TIME
UTC_TIME
GENERALIZED_TIME
:: struct
serial: string
connection_state: Connection_State
product_name: string
model_name: string
device_name: string
transport_id: int
:: enum_flags
orientation
Display geometry, appearance and language.
screenLayout
screenSize
smallestScreenSize
density
colorMode
fontScale
uiMode
locale
layoutDirection
touchscreen
Input peripherals and network configuration.
keyboard
keyboardHidden
navigation
mcc
mnc
:: enum
NONE
SHRUNK
REDUCED_1
REDUCED_2
REDUCED_3
REDUCED_4
IMPLODED
RESERVED
DEFLATE
DEFLATE64
BZIP2
LZMA
ZSTD
MP3
XZ
JPEG
WAV_PACK
PPMD
:: struct
signature: u32
version_needed_to_extract: u16
general_purpose_bit_flag: u16
compression_method: Zip_Compression_Method
last_mod_file_time: u16
last_mod_file_date: u16
crc_32: u32
compressed_size: u32
uncompressed_size: u32
filename_length: u16
extra_field_length: u16
:: struct
signature: u32
version_made_by: u16
version_needed_to_extract: u16
general_purpose_bit_flag: u16
compression_method: Zip_Compression_Method
last_mod_file_time: u16
last_mod_file_date: u16
crc_32: u32
compressed_size: u32
uncompressed_size: u32
filename_length: u16
extra_field_length: u16
file_comment_length: u16
disk_number_start: u16
internal_file_attributes: u16
external_file_attributes: u32
relative_offset_of_local_header: u32
:: struct
signature: u32
disk_number_this: u16
disk_number_start: u16
total_entries_this_disk: u16
total_entries: u16
central_directory_size: u32
central_directory_offset: u32
file_comment_length: u16
:: struct
filepath: string
entire_apk_is_loaded: := true
data: string
content: string
signing_block: string
central_directory: string
end_of_central_directory: string
is_signed: := false
:: enum
RSASSA_PSS_SHA256
RSASSA_PSS_SHA512
RSASSA_PKCS1_v1_5_SHA256
RSASSA_PKCS1_v1_5_SHA512
ECDSA_SHA256
ECDSA_SHA512
DSA_SHA256
:: struct
mode: enum { GRADLE; COMMAND_LINE_TOOLS; ILL_WRITE_IT_AND_WELL_DO_IT_LIVE_FUCKING_THING_SUCKS; }
sdk_path: string
java_bin_path: string
sdk_level: := SDK_LEVEL
build_type: enum { DEBUG; RELEASE; }
intermediate_path: := DEFAULT_INTERMEDIATE_PATH
cpu_target: := CPU_Tag.ARM64
output_path: string
output_apk_name: := "what_is_in_a_name"
assets_path_type: enum { CONTENTS_OF_PATH; SINGLE_DIRECTORY; }
assets_path: string
shared_library_path: string
use_jks_keystore_in_handmade_mode: := false
signing_key_source: enum { AUTO_GENERATE; CUSTOM; SDK_DEFAULT_DEBUG; }
custom_signing_key: Android_Signing_Key

Constants#