Update升级包中内置第三方app案例

Update升级包中内置第三方app案例

    • Update升级包中内置第三方app案例
    • 介绍
    • 总结内容
      • 1 问题现象
      • 2 原因分析
      • 3 解决方案
        • Androidmk
        • preinstallsh
      • 4 后续工作中须注意细节
    • 扩展阅读

1. 介绍

Amlogic MX8726 5iHome项目,客户提出需求在固件中预制第三方app
请列出开发的项目,项目简单背景,使用的平台,待总结的内容简述

2. 总结内容

2.1 问题现象:

客户提供第三方app直接使用U盘pm install YouKu_CIBN.apk ,app正常运行
app放在patch preinstall/app 目录下,编译system/app/YouKu_CIBN.apk
YouKu_CIBN 闪退

2.2 原因分析:

logcat -v time 查看打印

java.lang.UnsatisfiedLinkError: 
Couldn't load mono from loader dalvik.system.PathClassLoader[DexPathList[[zip file "/system/app/5iHomeBadminton.apk"], nativeLibraryDirectories=[/vendor/lib, /system/lib]]]: findLibrary returned null

缺少库文件,但pm insatll安装可以正常运行,咨询同事system/app/目录下apk安装模式不是pm install方式,其具体采用的哪种模式….下次填坑

2.3 解决方案:

既然Youku_CIBN.apk使用pm install 模式可以正常运行,可以在系统在刷机后第一次启动后,可以尝试后台运行service安装一次Youku.apk

youku.apk放置到目录vendor\amlogic\prebuilt\preinstallation并修改Android.mk与Preinstall.sh

Android.mk

LOCAL_PATH:= $(call my-dir)

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


#manager_apk := $(patsubst $(LOCAL_PATH)/%,%,$(wildcard $(LOCAL_PATH)/*.apk))
manager_apk := youku_cibn.apk

$(foreach t,$(manager_apk), \
$(eval include $(CLEAR_VARS)) \
$(eval LOCAL_MODULE     := $(notdir $(t))) \
$(eval LOCAL_MODULE_TAGS := optional) \
$(eval LOCAL_MODULE_CLASS := ETC) \
$(eval LOCAL_MODULE_PATH := $(TARGET_OUT)/preinstall) \
$(eval LOCAL_SRC_FILES   := $(t)) \
$(eval LOCAL_CERTIFICATE := shared) \
$(eval include $(BUILD_PREBUILT)) \
)

$(LOCAL_INSTALLED_MODULE): $(notdir $(manager_apk))

preinstall.sh

#!/system/bin/sh 
//标记文件symbol_preinstall_apks_installed
MARK=/data/local/symbol_preinstall_apks_installed
PKGS=/system/preinstall/

//判断标记文件symbol_preinstall_apks_installed是否存在
if [ ! -e $MARK ]; then
echo "booting the first time, so pre-install some APKs."

    apk_list=$(busybox find $PKGS -name "*\.apk")
    echo $apk_list
    for apk in $apk_list
    do 
        echo "install: " $apk
        mkdir -p /data/app
        cp -f $apk /data/app/app_to_install.apk
        chmod 644 /data/app/app_to_install.apk
        /system/bin/pm install -r /data/app/app_to_install.apk
        rm /data/app/app_to_install.apk
    done

# NO NEED to delete these APKs since we keep a mark under data partition.
# And the mark will be wiped out after doing factory reset, so you can install
# these APKs again if files are still there.
# busybox rm -rf $PKGS

touch $MARK
echo "OK, installation complete."
fi

2.4 后续工作中须注意细节:

  • Android.mk与preinstall.sh编码格式必须使用UNIX
  • update.zip升级时必须恢复出厂设置,原因,开机执行preinstal.sh 会先判断MARK=/data/local/symbol_preinstall_apks_installed标志文件是否存在,如存在会退出执行,但客户提出update.zip升级恢复出厂设置给用户带来不便利,只需修改 MARK=/data/local/(*)

3. 扩展阅读

开机执行preinstall.sh,需在开机init.amlogic.board.rc中注册与start

start preinstall

service preinstall /system/bin/preinstall.sh
    user root       //改变用户归属
    group root      //改变用户归属
    disabled        //服务必须显式启动
    oneshot         //指明不能重启服务

编译出来app在不同的目录区别

  • system/app 内置app放置目录
  • system/priv-app系统核心app放置目录,权限最高 (Android 4.4才有)
  • system/preinstall 预安装第三方app

system/preinstall目录中app,默认刷机后第一次启动安装,与U盘直接安装效果相同,安装后app位置在data/app

你可能感兴趣的:(APP,预安装,Android-TV,preinstall)