如何在 AOSP 项目中包含约束布局库

How to include constraint layout library in an AOSP project

我有一个现有的 android 应用程序,我想使用 Android.mk 在 AOSP(android 源代码树)中构建它。该应用程序使用 AOSP 源代码树 (AFAIK) 中未包含的约束布局。 我怎样才能满足这种依赖?包括其他支持库,例如 recyclerview、v4 等,但不包括约束布局。

我应该下载 lib aar 吗?如果是,我该如何 add/include? 或者我应该获取源代码(从哪里下载?)并在源代码树中的某处构建它?

在此先感谢您的帮助。

有多种方法可以解决您的问题。

1.添加预构建的 .apk

您不必将源代码放入 AOSP 树。 您可以只添加 .apk 文件,将其放入 packages/apps/YourApp,或 vendor/yourname/packages/apps/YourApp,甚至 your_dir_name/packages/apps/YourApp,并为构建系统创建一个 Android.mk 文件以确定您的应用程序。

Android.mk 看起来像:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := YourApplication # your .apk name
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)

include $(BUILD_PREBUILT)

优点:您可以使用 gradle.

构建您的项目

2。将源代码添加到 AOSP

如果您仍想将源代码放在 packages/apps 并在那里构建它,您可以将 ConstrainsLayout 放在项目的 libs/ 目录并添加到 Android.mk 类似于:

  LOCAL_PATH := $(call my-dir)
  include $(CLEAR_VARS)

  # List of static libraries to include in the package
  LOCAL_STATIC_JAVA_LIBRARIES := constraint-layout

  # Build all java files in the java subdirectory
  LOCAL_SRC_FILES := $(call all-subdir-java-files)

  # Name of the APK
  LOCAL_PACKAGE_NAME := YourApplication

  # Tell it to build an APK
  include $(BUILD_PACKAGE)

万一你不能让它工作(我没遇到过这个问题,but he did):

LOCAL_STATIC_JAVA_LIBRARIES := libconstraint-layout

include $(BUILD_PACKAGE)

其他,最后

include $(CLEAR_VARS)

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := libconstraint-layout:libs/constraint-layout.aar

缺点:您必须使用 mmamm -B 的 make 来构建您的代码,或者将 gradle 作为您的第二个开发构建系统。第二个选项可行,但要建立完整构建并在 out/ 目录中构建 .apk,您必须使用 make.

构建它

3。添加 ConstraintLayout

如果您想要多个使用约束布局的应用程序,您可以将其作为预编译的新库模块添加 .aar。 可以分别位于 'vendor/yourname/libs' 或 'your_dir_name/libs' 中的某处。 它类似于添加预构建的 .apk:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := constraint-layout
LOCAL_SRC_FILES := $(LOCAL_MODULE).aar
LOCAL_MODULE_SUFFIX := .aar

include $(BUILD_PREBUILT)

之后,在您的应用程序 Android.mk 中,您必须添加:

LOCAL_STATIC_JAVA_LIBRARIES := constraint-layout

或者,您可以将 ConstraintLayout.aar 添加到 prebuilds/,因为它终有一天会出现。

关于Android.mk有一个很好的话题:https://wladimir-tm4pda.github.io/porting/build_cookbook.html

这可以按如下方式完成:

  1. 下载 constraint-layout.aar 和 constraint-layout-solve.jar 并将这些文件放在 lib 文件夹中。

  2. 将以下内容添加到您的 Android.mk 文件

LOCAL_STATIC_JAVA_AAR_LIBRARIES += constraint-layout
LOCAL_STATIC_JAVA_LIBRARIES += constraint-layout-solver

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := constraint-layout:libs/constraint-layout.aar
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := constraint-layput-solver:libs/constraint-layout-solver.jar

是正确的,除了应该使用 LOCAL_STATIC_JAVA_AAR_LIBRARIES 而不是 LOCAL_STATIC_JAVA_LIBRARIES,因为约束布局是一个 aar 文件。

从Android 9.0开始,constraint-layout项目中不再需要单独添加.aar.jar。我们可以使用 AOSP 内置的 constraint-layout 库。

我们需要在Android.mk中添加一行:

LOCAL_USE_AAPT2 := true

然后,我们需要添加:

LOCAL_AAPT_FLAGS := \
    --auto-add-overlay \
    --extra-packages android.support.constraint

LOCAL_STATIC_ANDROID_LIBRARIES += android-support-constraint-layout

LOCAL_STATIC_JAVA_LIBRARIES += android-support-constraint-layout-solver

更详细的回答: