如何在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库必须和你的AOSP
bootanimation源码版本完全匹配,否则会出现符号缺失或兼容性错误。 - 编译出来的
bootanimation是AOSP系统专属的可执行文件,无法在普通的商用Android设备上运行(因为这些设备的系统库没有AOSP的私有符号)。 - 如果
bootanimation用到了AOSP的私有宏定义或API,可能需要手动在CMake/Android.mk中添加对应的编译宏,比如LOCAL_CFLAGS += -DANDROID_SDK_VERSION=29之类的。
内容的提问来源于stack exchange,提问作者WkAble
相关产品推荐
相关产品推荐

