【安卓开发系列 -- 系统开发】AOSP 源码环境开发系统 APP 预置带有 SO 的 AAR 包
【1】案例说明
1. 在 AOSP 源码环境中开发系统 APP 时需要引入 android-gif-drawable AAR 包并显示 GIF 动图;
2. 开发环境
2.1 开发板,AIO-3399C 六核 AI 开发板
2.2 主机,Win10;虚拟机,Ubuntu 16.04
2.3 android 源码,android 7.1
3. 本博客记录在上述开发环境下引入 android-gif-drawable AAR 包的方法;
【2】Android.mk 文件引入带有 SO 的 AAR 包
Android.mk 文件中关于引入 AAR 包的关键内容
# 引入 AAR 包
LOCAL_STATIC_JAVA_AAR_LIBRARIES := android-gif-drawable
# 引入 AAR 包
LOCAL_AAPT_FLAGS := ...
LOCAL_AAPT_FLAGS += --extra-packages pl.droidsonroids.gif
LOCAL_AAPT_FLAGS += --extra-packages com.aispeech.dui.dds
# 引入 AAR 包文件路径
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := android-gif-drawable:libs/android-gif-drawable-1.1.9.aar
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES += lib-dds:libs/lib-dds-1.1.8.1-release.aar
include $(BUILD_MULTI_PREBUILT)
Android.mk 文件中关于引入 SO 的关键内容
# 引入 SO 包
LOCAL_JNI_SHARED_LIBRARIES := libpl_droidsonroids_gif
# 引入 SO 包
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_SUFFIX := .so
LOCAL_MODULE := libpl_droidsonroids_gif
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_SRC_FILES_arm64 := jniLibs/arm64-v8a/libpl_droidsonroids_gif.so
LOCAL_SRC_FILES_arm32 := jniLibs/armeabi-v7a/libpl_droidsonroids_gif.so
LOCAL_MODULE_TARGET_ARCHS:= arm64 arm32
LOCAL_MULTILIB := 64 32
include $(BUILD_PREBUILT)
完整的 Android.mk 文件内容
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_RESOURCE_DIR := packages/apps/SecretRobot/res
LOCAL_RESOURCE_DIR += frameworks/opt/datetimepicker/res
ifeq ($(TARGET_BUILD_APPS),)
LOCAL_RESOURCE_DIR += frameworks/support/design/res
LOCAL_RESOURCE_DIR += frameworks/support/v7/appcompat/res
LOCAL_RESOURCE_DIR += frameworks/support/v7/gridlayout/res
LOCAL_RESOURCE_DIR += frameworks/support/v7/recyclerview/res
else
LOCAL_RESOURCE_DIR += prebuilts/sdk/current/support/design/res
LOCAL_RESOURCE_DIR += prebuilts/sdk/current/support/v7/appcompat/res
LOCAL_RESOURCE_DIR += prebuilts/sdk/current/support/v7/gridlayout/res
LOCAL_RESOURCE_DIR += prebuilts/sdk/current/support/v7/recyclerview/res
endif
LOCAL_PACKAGE_NAME := SecretRobot
LOCAL_CERTIFICATE := platform
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-java-files-under, src gen)
# 引入 JAR 包
LOCAL_STATIC_JAVA_LIBRARIES := android-opt-datetimepicker
LOCAL_STATIC_JAVA_LIBRARIES += messageformat
LOCAL_STATIC_JAVA_LIBRARIES += android-support-design
LOCAL_STATIC_JAVA_LIBRARIES += android-support-v13
LOCAL_STATIC_JAVA_LIBRARIES += android-support-v4
LOCAL_STATIC_JAVA_LIBRARIES += android-support-v7-appcompat
LOCAL_STATIC_JAVA_LIBRARIES += android-support-v7-gridlayout
LOCAL_STATIC_JAVA_LIBRARIES += android-support-v7-recyclerview
# 引入 AAR 包
LOCAL_STATIC_JAVA_AAR_LIBRARIES := android-gif-drawable
LOCAL_STATIC_JAVA_AAR_LIBRARIES += lib-dds
# 引入 SO 包
LOCAL_JNI_SHARED_LIBRARIES := libpl_droidsonroids_gif
LOCAL_AAPT_FLAGS := --auto-add-overlay
LOCAL_AAPT_FLAGS += --extra-packages android.support.design
LOCAL_AAPT_FLAGS += --extra-packages android.support.v7.appcompat
LOCAL_AAPT_FLAGS += --extra-packages android.support.v7.gridlayout
LOCAL_AAPT_FLAGS += --extra-packages android.support.v7.recyclerview
LOCAL_AAPT_FLAGS += --extra-packages com.android.datetimepicker
LOCAL_AAPT_FLAGS += --extra-packages com.android.messageformat
# 引入 AAR 包
LOCAL_AAPT_FLAGS += --extra-packages pl.droidsonroids.gif
LOCAL_AAPT_FLAGS += --extra-packages com.aispeech.dui.dds
LOCAL_PROGUARD_FLAG_FILES := ../../../frameworks/support/design/proguard-rules.pro
LOCAL_PROGUARD_FLAG_FILES += proguard-rules.pro
include $(BUILD_PACKAGE)
# 引入 AAR 包文件路径
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := android-gif-drawable:libs/android-gif-drawable-1.1.9.aar
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES += lib-dds:libs/lib-dds-1.1.8.1-release.aar
include $(BUILD_MULTI_PREBUILT)
# 引入 SO 包
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_SUFFIX := .so
LOCAL_MODULE := libpl_droidsonroids_gif
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_SRC_FILES_arm64 := jniLibs/arm64-v8a/libpl_droidsonroids_gif.so
LOCAL_SRC_FILES_arm32 := jniLibs/armeabi-v7a/libpl_droidsonroids_gif.so
LOCAL_MODULE_TARGET_ARCHS:= arm64 arm32
LOCAL_MULTILIB := 64 32
include $(BUILD_PREBUILT)
include $(call all-makefiles-under, $(LOCAL_PATH))
常见问题总结
问题一 :
library "/system/lib64/libpl_droidsonroids_gif.so" ("/system/lib64/libpl_droidsonroids_gif.so")
needed or dlopened by"/system/lib64/libpl_droidsonroids_gif.so" is not accessible for
the namespace "classloader-namespace"
解决方案 :
方案一 :
修改 system/core/rootdir/etc/public.libraries.android.txt
将需要添加的 SO 库添加到该文件中
重新编译系统镜像并下载安装
方案二 :
不用编译,直接在板子上修改,对应目录 /system/etc
问题二 :
ANDROID NATIVE 的 No implementation found for native 等类似问题
说明,该问题主要是针对 libpl_droidsonroids_gif.so 产生的,android-gif-drawable.aar 与安卓 sdk 版本的兼容问题,
需要下载适合于 SDK 的 android-gif-drawable.aar 版本
参考致谢
本博客为博主学习笔记,同时参考了网上众博主的博文以及相关专业书籍,在此表示感谢,本文若存在不足之处,请批评指正。
【1】Android源码 app预制带so和assets文件的aar包(sdk)
【2】[RK3399][Android7.1] 调试笔记 --- JNI无法访问so提示not accessible
【3】浅谈Android系统编译apk后so文件在dlopen时出现linker权限问题
【4】Android 使用pl.droidsonroids.gif.GifImageView在安卓中显示动图遇到的问题