diff --git a/extract-files.py b/extract-files.py new file mode 100755 index 0000000..47fae26 --- /dev/null +++ b/extract-files.py @@ -0,0 +1,111 @@ +#!/usr/bin/env -S PYTHONPATH=../../../tools/extract-utils python3 +# +# SPDX-FileCopyrightText: 2024 The LineageOS Project +# SPDX-License-Identifier: Apache-2.0 +# + +from extract_utils.file import File +from extract_utils.fixups_blob import ( + BlobFixupCtx, + blob_fixup, + blob_fixups_user_type, +) +from extract_utils.fixups_lib import ( + lib_fixup_remove, + lib_fixups, + lib_fixups_user_type, +) +from extract_utils.main import ( + ExtractUtils, + ExtractUtilsModule, +) +from extract_utils.tools import ( + llvm_objdump_path, +) +from extract_utils.utils import ( + run_cmd, +) + +namespace_imports = [ + 'device/lineage/example', +] + + +def lib_fixup_vendor_suffix(lib: str, partition: str, *args, **kwargs): + return f'{lib}_{partition}' if partition == 'vendor' else None + + +lib_fixups: lib_fixups_user_type = { + **lib_fixups, + ( + 'vendor.twopac.hardware.xoo@1.0', + 'vendor.twopac.hardware.oxo@1.0', + 'vendor.twopac.hardware.oox@1.0', + ): lib_fixup_vendor_suffix, + 'libwpa_client': lib_fixup_remove, +} + + +def blob_fixup_return_1( + ctx: BlobFixupCtx, + file: File, + file_path: str, + symbol: str, + *args, + **kwargs, +): + for line in run_cmd( + [ + llvm_objdump_path, + '--dynamic-syms', + file_path, + ] + ).splitlines(): + if line.endswith(f' {symbol}'): + offset, _ = line.split(maxsplit=1) + + with open(file_path, 'rb+') as f: + f.seek(int(offset, 16)) + f.write(b'\x01\x00\xa0\xe3') # mov r0, #1 + f.write(b'\x1e\xff\x2f\xe1') # bx lr + + break + + +blob_fixups: blob_fixups_user_type = { + 'vendor/app/Test.apk': blob_fixup() + .apktool_patch('blob-patches/TestApk.patch', '-s'), + 'vendor/etc/test.conf': blob_fixup() + .patch_file('blob-patches/TestConf.patch') + .regex_replace('(LOG_.*_ENABLED)=1', '\\1=0') + .add_line_if_missing('DEBUG=0'), + ('vendor/etc/test.0.xml', 'vendor/etc/test.1.xml'): blob_fixup() + .fix_xml(), + 'vendor/lib/test.so': blob_fixup() + .patchelf_version('0_17_2') + .fix_soname() + .add_needed('to_add.so') + .remove_needed('to_remove.so') + .replace_needed('from.so', 'to.so') + .clear_symbol_version('rpc_call_invoke') + .strip_debug_sections() + .binary_regex_replace(b'\xFF\x00\x00\x94', b'\xFE\x00\x00\x94') + .sig_replace('C0 03 5F D6 ?? ?? ?? ?? C0 03 5F D6', '1F 20 03 D5') + .call(blob_fixup_return_1, 'license_check'), +} # fmt: skip + +module = ExtractUtilsModule( + 'example', + 'lineage', + blob_fixups=blob_fixups, + lib_fixups=lib_fixups, + namespace_imports=namespace_imports, +) + +module.add_proprietary_file('proprietary-files-phone.txt').add_copy_files_guard( + 'TARGET_IS_TABLET', 'true', invert=True +) + +if __name__ == '__main__': + utils = ExtractUtils.device(module) + utils.run() diff --git a/setup-makefiles.py b/setup-makefiles.py new file mode 100755 index 0000000..32947cf --- /dev/null +++ b/setup-makefiles.py @@ -0,0 +1 @@ +#!./extract-files.py --regenerate_makefiles diff --git a/sort-blobs-list.sh b/sort-blobs-list.sh new file mode 100755 index 0000000..1cbcf0a --- /dev/null +++ b/sort-blobs-list.sh @@ -0,0 +1,28 @@ +#!/bin/bash +# +# SPDX-FileCopyrightText: 2024 The LineageOS Project +# SPDX-License-Identifier: Apache-2.0 +# + +set -e + +# List of files to sort +PROPRIETARY_FILES_TXT=( + "proprietary-files.txt" +) + +# Load sort-blobs-list.py and do some sanity checks +MY_DIR="${BASH_SOURCE%/*}" +if [[ ! -d "${MY_DIR}" ]]; then MY_DIR="${PWD}"; fi + +ANDROID_ROOT="${MY_DIR}/../../.." + +HELPER="${ANDROID_ROOT}/tools/extract-utils/sort-blobs-list.py" +if [ ! -f "${HELPER}" ]; then + echo "Unable to find helper script at ${HELPER}" + exit 1 +fi + +# Call the helper to sort the list +# Add --dir-first to give priority to directories and subdirectories +"${HELPER}" "${PROPRIETARY_FILES_TXT[@]}"