Как создать конкретный исполняемый файл cli для Android (service.cpp )

#android #c #build #android-service #android-source

#Android #c #сборка #android-сервис #android-исходный код

Вопрос:

В Android, когда вы открываете эмулятор терминала или подключаете оболочку adb, есть команда service , которую вы можете выполнить, которая позволяет вам в некоторой степени взаимодействовать с системными службами. Для моих целей функциональность слишком ограничена, и я хотел бы ее немного расширить.

К сожалению, этот исполняемый файл не документирован.

Я нашел исходный код здесь: service.cpp

В том же каталоге также есть файл с именем Android.bp со следующим содержимым:

 cc_binary {
    name: "service",

    srcs: ["service.cpp"],

    shared_libs: [
        "libcutils",
        "libutils",
        "libbinder",
    ],

    cflags: [
        "-DXP_UNIX",
        "-Wall",
        "-Werror",
    ],
}

cc_binary {
    name: "vndservice",

    proprietary: true,
    srcs: ["service.cpp"],

    shared_libs: [
        "libcutils",
        "libutils",
        "libbinder",
    ],

    cflags: [
        "-DXP_UNIX",
        "-DVENDORSERVICES",
        "-Wall",
        "-Werror",
    ],
}
  

Для меня эти cflags выглядят как флаги g . Я действительно не знаю g , но после долгих проб и ошибок я пришел к этому:

 # Download required source code
git clone https://android.googlesource.com/platform/superproject
cd superproject
git submodule init
git submodule update frameworks/native
git submodule update system/libbase
git submodule update system/core
git submodule update system/logging
# Set required include directories in CPATH
export CPATH="./frameworks/native/include:./system/libbase/include:./system/core/libcutils/include:./system/core/libutils/include:./system/logging/liblog/include:./system/core/libsystem/include:./frameworks/native/libs/binder/include"
# Build
g   -DXP_UNIX -Wall -Werror -o service ./frameworks/native/cmds/service/service.cpp
  

К сожалению, я получаю огромное количество ошибок:
https://pastebin.com/fnu7LJLU

Моя версия G :
g (GCC) 9.3.1 20200408 (Red Hat 9.3.1-2)

Есть идеи, почему это не удается?

Комментарии:

1. Этот g предназначен для вашей хост-платформы, верно? Если ваша целевая платформа — ARM, вам нужен соответствующий кросс-компилятор / набор инструментов. Самый простой способ настроить это, включая набор инструментов и все зависимости файла, который вы хотите скомпилировать, — это получить полное дерево AOSP ( source.android.com/setup/build/downloading ), а затем используйте сценарии сборки Android для создания этого модуля.

2. Для справки, вот полный вызов компилятора для service.cpp из моего журнала сборки Android 8: pastebin.com/raw/jtdQGH5L Но, как я уже сказал, я не думаю, что делать это вручную было бы очень продуктивно.

3. Сначала я попытался проверить весь исходный код, но у меня недостаточно места на диске. Для проверки исходного кода и его сборки, по-видимому, требуется не менее 400 ГБ свободного места на диске. Мне нужно что-то более разумное, потому что в противном случае я не смогу должным образом интегрировать его в бесплатные системы CI и сделать его доступным для всех. Я не думал о том, что архитектура является проблемой, спасибо, что указали на это. Я попытался создать его на своем телефоне прямо сейчас, но я все еще получаю много ошибок: pastebin.com/xQfeM4rJ

4. Я также пытался скомпилировать его с помощью clang на своем устройстве, чтобы я мог скопировать и вставить вашу команду, но пока безуспешно.

5. Получил clang для работы на моем телефоне и ПК, но я получаю fatal error: 'map' file not found сообщение о том, что он не может найти стандартные заголовки. Довольно странно, так как простой clang test.cpp -o test с включением карты работает просто отлично.