You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Android Studio中编译依赖系统库的AOSP bootanimation项目?

我之前也踩过AOSP组件在Android Studio里编译的坑,针对你说的bootanimation依赖/system/lib下私有.so库的问题,给你分享两种可行的方案,CMake和ndk-build都能搞定:

方案一:使用CMake编译

1. 准备依赖文件

  • 从你的AOSP源码中,把bootanimation依赖的所有.so库(比如libcutils.so、libutils.so、libui.so等)拷贝到项目的app/src/main/jniLibs/[ABI]/目录下(比如armeabi-v7a、arm64-v8a,根据你要编译的架构创建对应子目录)。
  • 把AOSP源码中bootanimation需要的头文件(比如cutils/、utils/、ui/下的.h文件)拷贝到项目的app/src/main/jni/include/目录下,方便CMake找到头文件。

2. 编写CMakeLists.txt

在app/src/main/jni/下创建CMakeLists.txt,示例如下:

cmake_minimum_required(VERSION 3.22.1)

# 设置项目名称
project(bootanimation)

# 添加头文件搜索路径
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)

# 引入依赖的预编译系统库
# 以libcutils为例,其他库同理
add_library(libcutils SHARED IMPORTED)
set_target_properties(libcutils PROPERTIES
    IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/libcutils.so
)

add_library(libutils SHARED IMPORTED)
set_target_properties(libutils PROPERTIES
    IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/libutils.so
)

add_library(libui SHARED IMPORTED)
set_target_properties(libui PROPERTIES
    IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/libui.so
)

# 添加bootanimation的源码文件,替换成你实际的源码列表
add_executable(bootanimation
    bootanimation_main.cpp
    BootAnimation.cpp
    # 其他源码文件...
)

# 链接所有依赖库
target_link_libraries(bootanimation
    libcutils
    libutils
    libui
    android
    log
)

3. 配置Android Studio

在app/build.gradle中配置CMake路径:

android {
    defaultConfig {
        externalNativeBuild {
            cmake {
                abiFilters 'armeabi-v7a', 'arm64-v8a'
                cppFlags "-std=c++17" // 匹配AOSP源码的C++标准
            }
        }
    }
    externalNativeBuild {
        cmake {
            path "src/main/jni/CMakeLists.txt"
        }
    }
}

方案二:使用ndk-build编译

1. 准备依赖文件

和CMake方案一样,把依赖的.so库放到app/src/main/jniLibs/[ABI]/,头文件放到app/src/main/jni/include/。

2. 编写Android.mk和Application.mk

在app/src/main/jni/下创建Android.mk:

LOCAL_PATH := $(call my-dir)

# 引入预编译的libcutils库
include $(CLEAR_VARS)
LOCAL_MODULE := libcutils
LOCAL_SRC_FILES := ../jniLibs/$(TARGET_ARCH_ABI)/libcutils.so
include $(PREBUILT_SHARED_LIBRARY)

# 引入预编译的libutils库
include $(CLEAR_VARS)
LOCAL_MODULE := libutils
LOCAL_SRC_FILES := ../jniLibs/$(TARGET_ARCH_ABI)/libutils.so
include $(PREBUILT_SHARED_LIBRARY)

# 引入预编译的libui库
include $(CLEAR_VARS)
LOCAL_MODULE := libui
LOCAL_SRC_FILES := ../jniLibs/$(TARGET_ARCH_ABI)/libui.so
include $(PREBUILT_SHARED_LIBRARY)

# 编译bootanimation可执行文件
include $(CLEAR_VARS)
LOCAL_MODULE := bootanimation
LOCAL_SRC_FILES := bootanimation_main.cpp BootAnimation.cpp # 替换为实际源码
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_SHARED_LIBRARIES := libcutils libutils libui android log
LOCAL_CPPFLAGS := -std=c++17 # 匹配AOSP的C++标准
include $(BUILD_EXECUTABLE)

创建Application.mk:

APP_ABI := armeabi-v7a arm64-v8a
APP_PLATFORM := android-29 # 匹配你的AOSP源码对应的Android版本
APP_STL := c++_shared

3. 配置Android Studio

在app/build.gradle中配置ndk-build路径:

android {
    defaultConfig {
        externalNativeBuild {
            ndkBuild {
                abiFilters 'armeabi-v7a', 'arm64-v8a'
            }
        }
    }
    externalNativeBuild {
        ndkBuild {
            path "src/main/jni/Android.mk"
        }
    }
}

关键注意事项

  • 所有依赖的.so库必须和你的AOSPbootanimation源码版本完全匹配,否则会出现符号缺失或兼容性错误。
  • 编译出来的bootanimation是AOSP系统专属的可执行文件,无法在普通的商用Android设备上运行(因为这些设备的系统库没有AOSP的私有符号)。
  • 如果bootanimation用到了AOSP的私有宏定义或API,可能需要手动在CMake/Android.mk中添加对应的编译宏,比如LOCAL_CFLAGS += -DANDROID_SDK_VERSION=29之类的。

内容的提问来源于stack exchange,提问作者WkAble

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:50:44