【安卓开发系列 -- 系统开发】AOSP 源码环境开发系统 APP 预置带有 SO 的 AAR 包

【安卓开发系列 -- 系统开发】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在安卓中显示动图遇到的问题​​​​​​​

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值