zoukankan      html  css  js  c++  java
  • Android系统使用Shell脚本预装apk

    客户需求:需要在Android系统预安装一个或者若干个apk,客户可以选择自行卸载并且卸载后系统再次启动并不会再次自动安装。

    考虑到需要批量安装应用,我这里考虑到使用灵活的shell脚本。shell脚本可以通过修改init.rc令其可以在开机时运行启动,同时可以加入限制相应的判断条件让其在首次只run一次,这里命名shell脚本为install_apk.sh。以下是init.rc的配置启动服务,通过添加如下声明可以让Android系统在启动时运行install_apk.sh

    1
    2
    3
    4

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

    接下来我们来看install_apk.sh的实现,这里设计shell脚本的功能主要是实现安装指定目录下的apk,并且只运行一次,我们直接看脚本代码。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

    installed_mode=`/system/bin/getprop "persist.sys.apk.installed"`
    if [ "$installed_mode" != "DONE" ]; then
    DIR="/system/usr/app"
    DATA_DIR="/data/app"
    cd $DIR
    for apk in $(ls $DIR)
    do
    busybox cp $DIR/$apk $DATA_DIR
    chmod 777 $DATA_DIR/$apk
    done
    fi大专栏  Android系统使用Shell脚本预装apkpan>
    /system/bin/setprop persist.sys.apk.installed DONE

    脚本的功能是划分以下两个部分

    1、查询/system/usr/app下的全部apk,通过copy到/data/app和修改其权限实现apk的安装,

    2、通过系统属性persist.sys.apk.installed赋值给installed_mode变量,判断应用是否已经安装运行

    这里可以查询关于shell脚本的for使用方法进行优化,避免重复操作,之前少量apk的时候我是这样写的,如下

    1
    2
    3
    4
    busybox cp /system/usr/app/OfficeSuite.apk data/app
    busybox cp /system/usr/app/ES.apk data/app
    chmod 777 data/app/OfficeSuite.apk
    chmod 777 data/app/ES.apk

    如果预装的apk多起来就很麻烦,你需要反复地修改你的脚本,真的是不堪其扰,因此使用for来处理。

    当然在此之前,你还需要做的是把相关的apk在系统编译时拷贝到/system/usr/app目录下,常规做法是使用在device.mk文件中使用PRODUCT_COPY_FILES拷贝,但是考虑有可能会有很多个apk,我遇到有的客户需要预装10个应用,所以还是采取一劳永逸的办法,批量拷贝,在对应的产品目录下新建一个目录,我这里命名为preinstallApk,将相关的apk拷贝到该目录下,具体mk实现如下。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    define all-data-files-under
    $(patsubst ./%,%,
    $(shell cd $(LOCAL_PATH)/$(1) ;
    find ./ -maxdepth 1 -name "*.apk" -and -not -name ".*")
    )
    endef

    COPY_APK_TARGET := $(call all-data-files-under,preinstallApk)
    PRODUCT_COPY_FILES += $(foreach apkName, $(COPY_APK_TARGET),
    $(addprefix $(LOCAL_PATH)/preinstallApk/, $(apkName)):$(addprefix system/usr/app/, $(apkName)))

    同理,shell脚本也是可以通过PRODUCT_COPY_FILES操作拷贝进系统,你可以选择在device.mk或者preinstall.mk目录添加以下定义

    1
    2
    PRODUCT_COPY_FILES += 
    $(LOCAL_PATH)/install_apk.sh:system/bin/install_apk.sh

    至此,Android预装apk可以完成了。

  • 相关阅读:
    POJ 2184 Cow Exhibition (01背包变形)(或者搜索)
    ACM-ICPC如何起步[转]
    查看centos中的用户和用户组和修改密码
    CentOS7安装并配置PostgreSQL
    在Win10下,python3和python2同时安装并解决pip共存问题
    Django-用户-组-权限
    linux系统磁盘满了,怎么解决?
    DRF (Django REST framework) 中的路由Routers
    DRF (Django REST framework) 中的视图扩展类
    DRF (Django REST framework) 中的视图类
  • 原文地址:https://www.cnblogs.com/lijianming180/p/12258800.html
Copyright © 2011-2022 走看看