客户需求:需要在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可以完成了。

Android系统使用Shell脚本预装apk的更多相关文章

  1. Android PAI (PlayAutoInstall)预装APK 功能

    最近刚找到工作,是手机方案公司,刚接触手机系统预装的APP,以及解决方案MTK平台下预装APP的bug,也接触到了Launcher的东西. 然后接触到了第一个需求 PAI预装APK功能 下面是我用到的 ...

  2. Android程序执行shell脚本

    在做Android应用时,经常需要执行shell脚本,以快速实现某些功能: 在Android应用程序中执行shell脚本可以省去一大堆繁琐的代码,还可以避免不必要的错误: 比如:拷贝文件夹时,可以执行 ...

  3. Linux常用的系统监控shell脚本

    http://www.linuxqd.com下面是我常用的几个Linux系统监控的脚本,大家可以根据自己的情况在进行修改,希望能给大家一点帮助.1.查看主机网卡流量 #!/bin/bash #netw ...

  4. Shell脚本查看apk签名信息

    用shell写了一个查看apk签名的脚本.代码很少也很简单 支持递归目录查询 #!/bin/bash #使用方法 ./getcertificate.sh xx.apk get_signature() ...

  5. centos系统将shell脚本改成systemctl启动的形式

    说明: CentOS 7的服务systemctl脚本存放在:/usr/lib/systemd/,有系统(system)和用户(user)之分,像需要开机不登陆就能运行的程序,就将程序存在系统服务里,即 ...

  6. Linux 系统监控shell脚本

    比较粗略的一个脚本:主要监控系统磁盘.CPU.内存.网络流量.tcp连接数等 代码如下: [root@test system_monitor_shell_script]# cat system_mon ...

  7. Android 签名工具 shell脚本

    signApk.sh #!/bin/bash #$1 signed and unaligned apk #$2 unsigned apk #$3 aligned apk #./signApk.sh t ...

  8. 多级菜单系统安装维护shell脚本实现企业级案例

    演示效果: 1.一级菜单 2.二级菜单 3.执行操作 脚本参考: #!/bin/bash #author lic(oldboy linux student) #date 1304 DISK_NO=&q ...

  9. 深入浅出 - Android系统移植与平台开发(三)- 编译并运行Android4.0模拟器

    作者:唐老师,华清远见嵌入式学院讲师. 1.   编译Android模拟器 在Ubuntu下,我们可以在源码里编译出自己的模拟器及SDK等编译工具,当然这个和在windows里下载的看起来没有什么区别 ...

随机推荐

  1. MySQL 基础知识梳理

    MySQL 的安装方式有多种,但是对于不同场景,会有最适合该场景的 MySQL 安装方式,下面就介绍一下 MySQL 常见的安装方法,包括 rpm 安装,yum 安装,通用二进制安装以及源码编译安装, ...

  2. java 之断言

    今天用idea的智能提示冒出一个assert关键字,愣是没看懂!!!还是太菜了.上网查了一下,这个关键字是断言. 什么是断言? 我也说不清楚,反正就是对jvm的操作.java的错误分为两种,一种叫er ...

  3. SimpleDateFormat 线程安全的解决方案--DateTimeFormatter

    SimpleDateFormat并不是线程安全的,因为在SimpleDateFormat中持有一个Calendar类对象在Parse 和Format方法时会调用calendar.setTime(dat ...

  4. token和refresh token

    https://www.cnblogs.com/minirice/p/9232355.html 在spring boot中结合OAuth2使用JWT时,刷新token时refresh token一直变 ...

  5. ui-choose|列表选择jQuery美化插件

    ui-choose是一款基于jQuery的列表选择美化插件.ui-choose可用于选项不太多的select.radio.checkbox等,提升用户体验. 使用方法 使用ui-choose列表美化插 ...

  6. 吴裕雄--天生自然 JAVASCRIPT开发学习:对象 实例(3)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  7. Java设计模-过滤器模式

    过滤器模式 过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接 ...

  8. python使用geopandas和shapely处理shp文件

    一.环境搭建 所需库:geopandas (以及前置库)  doc:http://geopandas.org/ shapely(以及前置库)  doc: 二.数据预处理 1.将shp文件进行切片 2. ...

  9. 13.1 CentOS系统启动流程介绍

    CentOS系统启动流程介绍 本章我们将学习 Linux 启动流程和内核模块管理相关的内容.通过本章我们将学习如下内容: Linux 系统的组成及特点 CentOS 系统的启动流程 开机启动成 gru ...

  10. linux下的时区修改

    Centos 7时区问题: 通常使用tzselect命令选择时区,今天在修改centos7的时区的时候,修改完以后时区还是没有发生变化,重启也是没有用的:通过网络的帮助了解到,在Centos和ubun ...