Как построить AOSP Латинский IME из дерева?

Я пытаюсь создать AOSP Latin IME (исходный код: https://android.googlesource.com/platform/packages/inputmethods/LatinIME/+/master) без загрузки всего исходного кода AOSP. В идеале я хотел бы построить проект как проект Gradle, чтобы я мог легко интегрировать его с моими существующими приложениями для Android.

Я уже добился определенного прогресса

1] создание пустого проекта в Android Studio

2] копирование-вставка папок "java" и "java-overridable" и копирование-вставка содержимого папки "res" в мой проект

Однако во время компиляции проекта происходит сбой клавиатуры при открытии из-за следующей ошибки:

Не удалось загрузить нативную библиотеку jni_latinime

Эта ошибка имеет смысл, потому что я не собрал и не включил собственную библиотеку C++ (находится здесь: https://android.googlesource.com/platform/packages/inputmethods/LatinIME/+/master/native/jni/), которая требуется для клавиатура для работы.

Как я могу создать собственную библиотеку, найденную по вышеуказанной ссылке, и включить ее в мой проект Gradle? Есть ли способ скомпилировать эти файлы C++ без загрузки всего исходного кода AOSP?

Проект поставляется с файлом "Android.bp", в котором указано, как компилировать файлы C++. К сожалению, я не могу понять, как использовать систему сборки Soong. https://android.googlesource.com/platform/packages/inputmethods/LatinIME/+/master/native/jni/Android.bp

1 ответ

По моему мнению, вы не можете использовать систему сборки soong вне AOSP tree.so для компиляции нативных файлов с Android.bp, вам придется собирать внутри дерева AOSP.

Но можете ли вы просто оформить стабильную ветку вместо использования основного кода ветки?

Soong is the replacement for the old Android make-based build system.
It replaces Android.mk files with Android.bp files,
which are JSON-like simple declarative descriptions of modules to build.



This Makefile-based system is in the process of being replaced with Soong, 
a new build system written in Go. 

During the transition, all of these makefiles are read by Kati, and generate a ninja file instead of being executed directly. 
That's combined with a ninja file read by Soong so that the build graph of the two systems can be combined and run as one.

Если вы извлекаете код в стабильную ветку, такую ​​как pie-release или oreo-r6-release, вы получите исходный код без этой системы сборки soong, и у вас будут старые системные файлы сборки, такие как Android.mk

Но если вам все еще нужен последний исходный код, вы можете прочитать этот файл Android.bp и создать собственный модуль модуля, а затем собрать его с помощью CMake.

Вам придется преобразовать этот файл Android.bp в CMakeLists.txt для сборки его с помощью cmake. Я думаю, что это будет не очень сложно

Main segement that you want to build is : libjni_latinime
cc_library
{
name: "libjni_latinime",
host_supported: true,
product_specific: true,

sdk_version: "14",
cflags: [
    "-Werror",
    "-Wall",
    "-Wextra",
    "-Weffc++",
    "-Wformat=2",
    "-Wcast-qual",
    "-Wcast-align",
    "-Wwrite-strings",
    "-Wfloat-equal",
    "-Wpointer-arith",
    "-Winit-self",
    "-Wredundant-decls",
    "-Woverloaded-virtual",
    "-Wsign-promo",
    "-Wno-system-headers",

    // To suppress compiler warnings for unused variables/functions used for debug features etc.
    "-Wno-unused-parameter",
    "-Wno-unused-function",
],
local_include_dirs: ["src"],

srcs: [
    "com_android_inputmethod_keyboard_ProximityInfo.cpp",
    "com_android_inputmethod_latin_BinaryDictionary.cpp",
    "com_android_inputmethod_latin_BinaryDictionaryUtils.cpp",
    "com_android_inputmethod_latin_DicTraverseSession.cpp",
    "jni_common.cpp",

    ":LATIN_IME_CORE_SRC_FILES",
],

target: {
android_x86: {
        // HACK: -mstackrealign is required for x86 builds running on pre-KitKat devices to avoid crashes
        // with SSE instructions.
        cflags: ["-mstackrealign"],
    },
    android: {
        stl: "libc++_static",
    },
    host: {
        cflags: ["-DHOST_TOOL"],
    },
}

Вы должны передать эти CFLAGS и включить dir и список исходных файлов, а из target просто передать android libC++_static, поскольку другие вещи для вас бесполезны.

Если вы хотите прочитать о Сун: https://android.googlesource.com/platform/build/soong/

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

Если вы хотите изменить имя пакета приложения, вам также потребуется внести соответствующие изменения в файлы cpp, потому что с этими файлами создаются собственные библиотеки.

Другие вопросы по тегам