RK3576-Android15解决内置低版本32位库文件apk导致启动app崩溃问题

RK3576-Android15解决内置低版本32位库文件apk导致启动app崩溃问题 文章目录概要一、Android15 内置apk如何内置apk参考资料内置app二、 库文件说明高版本库文件解压缩配置内置app自动生成编译脚本文件Android.mk自动解压缩库文件低版本库文件解压缩三、解决低版本32位无法适配系统搞清楚属性LOCAL_MULTILIB 和 LOCAL_JNI_SHARED_LIBRARIES_ABILOCAL_MULTILIB : 32LOCAL_JNI_SHARED_LIBRARIES_ABI : arm两者核心区别对照表32位低版本库文件适配Android15 64位系统解决方案小结概要RK 3576 Android15 产品内置一些App但是32位的app 内置OK开机后打开直接崩溃。其实就是默认的情况下Android15 只会去加载高版本的库64位的so库文件如果只有32 位库文件 系统找不到直接崩溃了。一、Android15 内置apk如何内置apk参考资料Rk-内置应用作为系统Launcher-内置APK-拷贝文件-替换开机动画RK3576-Android15-内置32位应用-此应用与最新版 Android 不兼容。请检查是否有更新或与应用开发者联系 弹框问题解决内置appRK 内置应用其实有三种方式如下可以理解为3个文件夹直接把apk 扔到对应的文件夹里面即可对应区别如下特性维度preinstallpreinstall_del_foreverpreinstall_del中文含义不可卸载预装可卸载预装可卸载但可恢复预装用户权限不可卸载无卸载按钮可正常卸载如普通应用可正常卸载恢复机制恢复出厂设置依旧存在恢复出厂设置不再出现已“永久删除”恢复出厂设置会重新出现应用性质系统核心应用、厂商关键服务纯粹的商业合作第三方应用重要的合作或推荐应用存储位置通常安装在/system/app或/system/priv-app系统分区首次开机后安装到/data/app用户数据分区卸载后即删除。安装包在系统分区首次安装到用户分区卸载后包仍在恢复出厂时重装。所以我们直接把需要内置的apk 根据实际需求扔到对应的文件夹即可。二、 库文件说明高版本库文件解压缩如上内置app 中把自己需要内置的app 扔到对应文件夹下面系统编译的时候就会自动加压缩对应的库文件。配置内置app我们以抖音app 为例 直接扔apk 到对应的文件夹下会生成apk 同名的文件夹自动生成编译脚本文件Android.mk本身我们自己就扔了一个douying.apk 文件到文件夹里面的然后编译 过程中自动解压缩生成配置编译文件Android.mk 和库文件LOCAL_PATH:$(my-dir)include $(CLEAR_VARS)LOCAL_MODULE:douyinLOCAL_MODULE_CLASS:APPSLOCAL_MODULE_PATH:$(TARGET_OUT_ODM)/bundled_uninstall_back-appLOCAL_SRC_FILES:$(LOCAL_MODULE)$(COMMON_ANDROID_PACKAGE_SUFFIX)LOCAL_CERTIFICATE:PRESIGNEDLOCAL_DEX_PREOPT:falseLOCAL_DONT_CHECK_MODULE:trueLOCAL_ENFORCE_USES_LIBRARIES:falseLOCAL_MODULE_TAGS:optionalLOCAL_MODULE_SUFFIX:$(COMMON_ANDROID_PACKAGE_SUFFIX)LOCAL_JNI_SHARED_LIBRARIES_ABI:arm64LOCAL_PREBUILT_JNI_LIBS:\ lib/arm64/libAGFX.so\ lib/arm64/libByteVC1_dec.so\ lib/arm64/libCKResourceJni.so\ lib/arm64/libCoreCpt.so\ lib/arm64/libCtaApiLib.so\ lib/arm64/libCurve25519Donna.so\ lib/arm64/libDavinciResourceJni.so\ lib/arm64/libEffectEditorABTestJni.so\ lib/arm64/libEffectEditorJni.so\ lib/arm64/libEncryptor.so\ lib/arm64/libILAMaterialSDK.so\ lib/arm64/libILASDK.so\ lib/arm64/libLogTransport.so\ lib/arm64/libNLEPresetJni.so\ lib/arm64/libNLEResourcesDAVJni.so\ lib/arm64/libStreamCore.so\ lib/arm64/libTTHtmlParser_dyreader.so\ lib/arm64/libTTMachineCore.so\ lib/arm64/libTTWebViewSdkFlipped.so\ lib/arm64/libTuringYuvUtils.so\ lib/arm64/libabrmodule.so\ lib/arm64/libalog.so\ lib/arm64/libandroidx.graphics.path.so\ lib/arm64/libanimax.so\ lib/arm64/libanimax_bytevc1.so\ lib/arm64/libanimax_napi.so\ lib/arm64/libanimax_textra.so\ lib/arm64/libapkpatch.so\ lib/arm64/libapplog_rust.so\ lib/arm64/libart_method_ext.so\ lib/arm64/libart_sym.so\ lib/arm64/libaudio_fingerprint_sdk.so\ lib/arm64/libaudioeffect.so\ lib/arm64/libaudioeffectdls.so\ lib/arm64/libavframework.so\ lib/arm64/libavmdlbase.so\ lib/arm64/libavmdlv2.so\ lib/arm64/libbach-sdk-jni.so\ lib/arm64/libbasedevtool.so\ lib/arm64/libbat.so\ lib/arm64/libbdbadger.so\ lib/arm64/libbdheif.so\ lib/arm64/libbdmpg123.so\ lib/arm64/libbdp_yuv.so\ lib/arm64/libbdp_yuvutil.so\ lib/arm64/libbdsword.so\ lib/arm64/libbdvideouploader.so\ lib/arm64/libbdzstd.so\ lib/arm64/libblender_worklet_jni.so\ lib/arm64/libbmf_hydra_lite.so\ lib/arm64/libbrotlicommon.so\ lib/arm64/libbrotlidec.so\ lib/arm64/libbtch_collection.so\ lib/arm64/libbuffer.so\ lib/arm64/libbvcparser.so\ lib/arm64/libbyteVC2dec.so\ lib/arm64/libbyte_coffee.so\ lib/arm64/libbyte_rec.so\ lib/arm64/libbyteaudio.so\ lib/arm64/libbytebench.so\ lib/arm64/libbytehook.so\ lib/arm64/libbytelink.so\ lib/arm64/libbytemonitor.so\ lib/arm64/libbytenn.so\ lib/arm64/libbytenn_plugin_ocl.so\ lib/arm64/libbytennllm-jni.so\ lib/arm64/libbytennllm.so\ lib/arm64/libbytennwrapper.so\ lib/arm64/libbyterts.so\ lib/arm64/libbytevc0.so\ lib/arm64/libbytevc1enc.so\ lib/arm64/libc_shared.so\ lib/arm64/libcachemodule.so\ lib/arm64/libcastproxy.so\ lib/arm64/libclay.so\ lib/arm64/libcoversong_sdk.so\ lib/arm64/libdaemon.so\ lib/arm64/libdelta.so\ lib/arm64/libdexvmp.so\ lib/arm64/libdisktracing.so\ lib/arm64/libec_jpeg_decoder.so\ lib/arm64/libec_pdp_perf.so\ lib/arm64/libeffect.so\ lib/arm64/libentryexpro.so\ lib/arm64/libep_finder.so\ lib/arm64/liberis.so\ lib/arm64/libevil-core.so\ lib/arm64/libfastcv.so\ lib/arm64/libfastmalloc.so\ lib/arm64/libfdk-aac.so\ lib/arm64/libfileprotect.so\ lib/arm64/libflipped.so\ lib/arm64/libflock-lib.so\ lib/arm64/libfwatchdog.so\ lib/arm64/libgaia_lib.so\ lib/arm64/libgecko_encrypt.so\ lib/arm64/libgeckox_bspatch.so\ lib/arm64/libgifimage.so\ lib/arm64/libgkfs.so\ lib/arm64/libgodzilla-sysopt.so\ lib/arm64/libhdiffpatch.so\ lib/arm64/libhelios_bm.so\ lib/arm64/libhidden_watermark_lib.so\ lib/arm64/libhpatchz.so\ lib/arm64/libiesapplogger.so\ lib/arm64/libimagepipeline.so\ lib/arm64/libinterstellar.so\ lib/arm64/libisecgm.so\ lib/arm64/libjarvis-binder.so\ lib/arm64/libjarvis-experience-metric.so\ lib/arm64/libjarvis-stacktrace.so\ lib/arm64/libjarvis-trace.so\ lib/arm64/libjato.so\ lib/arm64/libjazz.so\ lib/arm64/libjstack.so\ lib/arm64/libkeva.so\ lib/arm64/libkrypton.so\ lib/arm64/libkrypton_dawn.so\ lib/arm64/libkrypton_sar.so\ lib/arm64/libkryptonaudio.so\ lib/arm64/libkryptonaudioaudioeffect.so\ lib/arm64/libkryptonaudioeffect.so\ lib/arm64/libkryptonaudioogg.so\ lib/arm64/libkryptonaurum.so\ lib/arm64/libkryptoneffect.so\ lib/arm64/libkryptoni18n.so\ lib/arm64/libkryptonlive.so\ lib/arm64/libkryptonogg.so\ lib/arm64/libkryptonrtc.so\ lib/arm64/libkryptonvecamera.so\ lib/arm64/liblens.so\ lib/arm64/liblighten-bitmap-monitor.so\ lib/arm64/libliveffect.so\ lib/arm64/libliveplayer.so\ lib/arm64/libliveplayer2.so\ lib/arm64/liblivestrategy.so\ lib/arm64/liblogger.so\ lib/arm64/liblynx.so\ lib/arm64/liblynx_debug.so\ lib/arm64/liblynx_krypton.so\ lib/arm64/liblynx_markdown.so\ lib/arm64/liblynx_service_api.so\ lib/arm64/liblynx_text_service.so\ lib/arm64/liblynx_v8_bridge.so\ lib/arm64/liblynxbase.so\ lib/arm64/liblynxdebugrouter.so\ lib/arm64/liblynxdevtool.so\ lib/arm64/liblynxdevtool_qjs_bridge.so\ lib/arm64/liblynxdevtool_v8_bridge.so\ lib/arm64/liblynxsecurity.so\ lib/arm64/liblynxservice.so\ lib/arm64/liblynxtrace.so\ lib/arm64/libmali_gpu_perf_counter.so\ lib/arm64/libmannorarmor.so\ lib/arm64/libmemorydegradation.so\ lib/arm64/libmetasec_ml.so\ lib/arm64/libmethod_discover.so\ lib/arm64/libmonitor_ext.so\ lib/arm64/libmonitorcollector-lib.so\ lib/arm64/libmotion.so\ lib/arm64/libmotion_compress.so\ lib/arm64/libn.so\ lib/arm64/libnapi.so\ lib/arm64/libnative-filters.so\ lib/arm64/libnative_badger_log.so\ lib/arm64/libnative_classloader.so\ lib/arm64/libnative_log.so\ lib/arm64/libnativebuffer.so\ lib/arm64/libnativelog.so\ lib/arm64/libnativeserver.so\ lib/arm64/libnetecho.so\ lib/arm64/libnewep.so\ lib/arm64/libnpth.so\ lib/arm64/libnpth_bt.so\ lib/arm64/libnpth_dl.so\ lib/arm64/libnpth_dumper.so\ lib/arm64/libnpth_fd_tracker.so\ lib/arm64/libnpth_fp_unw.so\ lib/arm64/libnpth_heap_tracker.so\ lib/arm64/libnpth_logcat.so\ lib/arm64/libnpth_ref_monitor.so\ lib/arm64/libnpth_repair.so\ lib/arm64/libnpth_tls_monitor.so\ lib/arm64/libnpth_unw.so\ lib/arm64/libnpth_unwind.so\ lib/arm64/libnpth_vm_monitor.so\ lib/arm64/libnpth_xasan.so\ lib/arm64/libnslinker.so\ lib/arm64/libocr_jni.so\ lib/arm64/libonetex.so\ lib/arm64/libosfix.so\ lib/arm64/libpl_droidsonroids_gif.so\ lib/arm64/libpreload.so\ lib/arm64/libprofiler.so\ lib/arm64/libpush_ka.so\ lib/arm64/libquick.so\ lib/arm64/libreflect.so\ lib/arm64/librelax.so\ lib/arm64/librelaxui.so\ lib/arm64/libreparo.so\ lib/arm64/libropaencrypt.so\ lib/arm64/librtclive.so\ lib/arm64/librtclive_nico_extension.so\ lib/arm64/libsafemode.so\ lib/arm64/libserval_markdown.so\ lib/arm64/libserval_svg.so\ lib/arm64/libsgmain.so\ lib/arm64/libshadowhook.so\ lib/arm64/libshadowhook_nothing.so\ lib/arm64/libsheo.so\ lib/arm64/libskity-codec.so\ lib/arm64/libskity-graphics.so\ lib/arm64/libskity.so\ lib/arm64/libsm_impl.so\ lib/arm64/libsm_loader.so\ lib/arm64/libsnapdragon_services_adk.qti.so\ lib/arm64/libsnapdragon_services_qape.qti.so\ lib/arm64/libsniper_record.so\ lib/arm64/libsoloader.so\ lib/arm64/libsonicjson.so\ lib/arm64/libspeechengine.so\ lib/arm64/libsscronet-wrapper-helper.so\ lib/arm64/libsscronet-wrapper.so\ lib/arm64/libsscronet.so\ lib/arm64/libstatic-webp.so\ lib/arm64/libstoragehandlerlib.so\ lib/arm64/libstretch.so\ lib/arm64/libsweep_tools.so\ lib/arm64/libsys-platform.so\ lib/arm64/libsysmonitor.so\ lib/arm64/libsysoptimizer.so\ lib/arm64/libsysoptimizer_early.so\ lib/arm64/libsysoptimizer_qape.so\ lib/arm64/libtailor.so\ lib/arm64/libtexturerender_native.so\ lib/arm64/libtt_cnpa_sdk.so\ lib/arm64/libttboringssl.so\ lib/arm64/libttcrypto.so\ lib/arm64/libttffmpeg.so\ lib/arm64/libttheif_dec.so\ lib/arm64/libttheif_enc.so\ lib/arm64/libttmaudioprocess.so\ lib/arm64/libttmpaflns.so\ lib/arm64/libttmplayer.so\ lib/arm64/libttmverify.so\ lib/arm64/libttmverifylite.so\ lib/arm64/libtttext_dyreader.so\ lib/arm64/libtttext_lite.so\ lib/arm64/libttvesdk.so\ lib/arm64/libturbo.so\ lib/arm64/libturing_live.so\ lib/arm64/libundead_native_ability_q.so\ lib/arm64/libunicorn-main.so\ lib/arm64/libunicorn.so\ lib/arm64/libunicorn_neo.so\ lib/arm64/libuniplayer.so\ lib/arm64/libutils_ext.so\ lib/arm64/libvcbasekit.so\ lib/arm64/libvcn.so\ lib/arm64/libvcnverify.so\ lib/arm64/libvcnverifylite.so\ lib/arm64/libvctfo.so\ lib/arm64/libvideodec.so\ lib/arm64/libvoip.so\ lib/arm64/libwasm.so\ lib/arm64/libwatson.so\ lib/arm64/libwcdb2.so\ lib/arm64/libwhisper.so\ lib/arm64/libworker.so\ lib/arm64/libwppatch.so\ lib/arm64/libxplay-yuv-utils.so\ lib/arm64/libyoga.so\ lib/arm64/libyuv.so\ lib/arm64/libzootopia.so\ include $(BUILD_PREBUILT)自动解压缩库文件如下在Android15 环境下系统自动解压缩生成了一个lib/arm64 文件把64位库文件生成后放到这里了。实际看看 apk 库文件如下: 就只有64位库文件。低版本库文件解压缩如上分析了高版本的或者说正常情况下库文件加压缩生成目录系统默认本身就是64位的正好直接使用64位的库文件。 但是如果apk 只有低版本32位库文件怎么办。再继续看看默认生成的编译脚本配置文件Android.mkLOCAL_PATH:$(my-dir)include $(CLEAR_VARS)LOCAL_MODULE:xfmasterLOCAL_MODULE_CLASS:APPSLOCAL_MODULE_PATH:$(TARGET_OUT_ODM)/bundled_uninstall_back-appLOCAL_SRC_FILES:$(LOCAL_MODULE)$(COMMON_ANDROID_PACKAGE_SUFFIX)LOCAL_CERTIFICATE:PRESIGNEDLOCAL_DEX_PREOPT:falseLOCAL_DONT_CHECK_MODULE:trueLOCAL_ENFORCE_USES_LIBRARIES:falseLOCAL_MODULE_TAGS:optionalLOCAL_MODULE_SUFFIX:$(COMMON_ANDROID_PACKAGE_SUFFIX)LOCAL_JNI_SHARED_LIBRARIES_ABI:armLOCAL_PREBUILT_JNI_LIBS:\ lib/arm/libijksdl.so\ lib/arm/libijkplayer.so\ lib/arm/libencrypt.so\ lib/arm/libeventKey.so\ lib/arm/libvtn_mic1.so\ lib/arm/libaiui.so\ lib/arm/libijkffmpeg.so\ lib/arm/libtvui_keyevent.so\ include $(BUILD_PREBUILT)但是默认情况下大概率apk 会报错崩溃。 后面给出解决方案三、解决低版本32位无法适配系统搞清楚属性LOCAL_MULTILIB 和 LOCAL_JNI_SHARED_LIBRARIES_ABILOCAL_MULTILIB : 32作用范围适用于可执行文件、shared library、static library、预编译 apk 等所有模块。取值32 / 64 / both / firstLOCAL_MULTILIB :32 含义告诉编译系统本模块只构建 32 位版本。如果是 App 模块最终这个 App 进程以 32 位运行编译时只会链接 32 位系统库如果是原生 so 模块只输出 32 位 .so在 64 位 RK 平台arm64上强制使用 TARGET_2ND_ARCHarm32 位 arm环境编译LOCAL_JNI_SHARED_LIBRARIES_ABI : arm仅用于预编译 APK 模块include $(BUILD_PREBUILT)搭LOCAL_JNI_SHARED_LIBRARIES典型场景你有一个第三方 APK源码不在系统里但是希望编译固件时自动把系统里编译好的 so 打包进这个 apk 的 lib 目录。LOCAL_JNI_SHARED_LIBRARIES_ABI : arm 的字面含义编译系统在查找 LOCAL_JNI_SHARED_LIBRARIES 列表内的 so 时使用 arm32 位 ABI对应的输出目录去找 .so然后把 so 拷贝进 apk 内部lib/armeabi-v7a/xxx.so两者核心区别对照表项目LOCAL_MULTILIB :32LOCAL_JNI_SHARED_LIBRARIES_ABI : arm管控对象当前整个模块APK / 库自身构建架构仅管控LOCAL_JNI_SHARED_LIBRARIES内附加的 so 库生效模块所有模块apk/executable/shared library仅限 BUILD_PREBUILT 预编译 APK 模块作用决定模块编译时使用 32/64 位工具链、链接对应架构系统库、决定 App 进程位数仅仅指定从哪个 ABI 目录拷贝 so 塞进 apk lib 目录是否互相替代不能替代不能替代32位低版本库文件适配Android15 64位系统解决方案如上分析其实就是有部分库不仅仅是LOCAL_JNI_SHARED_LIBRARIES_ABIapk 运行时候还有其他库那么就需要配置32 为了。所以添加一行配置即可LOCAL_MULTILIB : 32LOCAL_PATH:$(my-dir)include $(CLEAR_VARS)LOCAL_MODULE:xfmasterLOCAL_MODULE_CLASS:APPSLOCAL_MODULE_PATH:$(TARGET_OUT_ODM)/bundled_uninstall_back-appLOCAL_SRC_FILES:$(LOCAL_MODULE)$(COMMON_ANDROID_PACKAGE_SUFFIX)LOCAL_CERTIFICATE:PRESIGNEDLOCAL_DEX_PREOPT:falseLOCAL_DONT_CHECK_MODULE:trueLOCAL_ENFORCE_USES_LIBRARIES:falseLOCAL_MODULE_TAGS:optionalLOCAL_MODULE_SUFFIX:$(COMMON_ANDROID_PACKAGE_SUFFIX)LOCAL_MULTILIB:32LOCAL_JNI_SHARED_LIBRARIES_ABI:armLOCAL_PREBUILT_JNI_LIBS:\ lib/arm/libijksdl.so\ lib/arm/libijkplayer.so\ lib/arm/libencrypt.so\ lib/arm/libeventKey.so\ lib/arm/libvtn_mic1.so\ lib/arm/libaiui.so\ lib/arm/libijkffmpeg.so\ lib/arm/libtvui_keyevent.so\ include $(BUILD_PREBUILT)小结务必掌握低版本apk 如何内置到高版本的Android系统中去现在Android版本都比较高了系统本身64位系统。低版本apk 也还蛮多都在用所以需要适配。