Android系统预装第三方apk

对于android系统预装第三方apk,分两种情况:

一、不包含so库的简单apk:

完全可以预装到system/app目录下(也就是系统app),运行时不会有找不到so库的错误;

二、包含so库的apk:

如果按照普通的apk一样预装到system/app目录(因为不做任何处理,一般都会预装到这个目录),则会报错:

java.lang.UnsatisfiedLinkError: Couldn't load libXXX from loader  .........findLibrary returned null;

对于发生这种情况的原因是system app在系统启动加载时不会加载so;要解决这个问题,需要使第三方apk不是系统apk,下面就说说如何使第三方apk预装到data/app。

网上有用shell命令拷贝从源码目录拷贝到system/urs/apps的解决方法,可我对这些大长串的命令不熟悉,所以用mk文件结合shell命令来解决:

假设项目目录为:device/ha/product_name/,在此目录建立thirdparty目录。步骤如下:

1、将需要安装的第三方apk放到此目录,在thirdparty目录建立Android.mk文件:

include $(CLEAR_VARS)
LOCAL_MODULE :=
xx.apk
LOCAL_SRC_FILES :=
xx
.apk
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := PRESET_APPS
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_MODULE_PATH := $(TARGET_OUT)/usr/apps
include $(BUILD_PREBUILT)

 2、在当前目录创建从system/usr/apps目录拷贝到data/app目录的脚本文件copy_apk.sh(需要授权755即可):

#!/system/bin/sh
busybox cp /system/usr/apps/
xx.apk data/app/
chmod 777 data/app/
xx
.apk

  3、在第一步创建的mk文件中添加:

include $(CLEAR_VARS)
LOCAL_MODULE := copy_apk.sh
LOCAL_SRC_FILES := copy_apk.sh
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := EXECUTABLES
LOCAL_MODULE_PATH := $(TARGET_OUT)/bin
include $(BUILD_PREBUILT)

4、在device/ha/product_name/这个目录下找到并编辑init.product_name.rc文件,添加一个服务:

service copy_apk /system/bin/copy_apk.sh
    class main
    oneshot

大致思路:编译时将apk预装到system/usr/目录,开机启动时通过脚步将system/usr目录下的apk拷贝到data/app目录,这样系统启动时就会加载apk中so文件,从而不会报错。


做完以上几步编个版本升级或烧录后就能达到效果。








你可能感兴趣的:(Android)