客户需求:需要在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. DRF一对多序列化和反序列化

    models.py # 商品分类 class Category(models.Model): name = models.CharField(max_length=32) # 商品 class Goo ...

  2. certutil

    计算摘要 certutil -hashfile inst.ini MD2 certutil -hashfile inst.ini MD5 certutil -hashfile inst.ini SHA ...

  3. 吴裕雄--天生自然python机器学习:基于支持向量机SVM的手写数字识别

    from numpy import * def img2vector(filename): returnVect = zeros((1,1024)) fr = open(filename) for i ...

  4. 共克时艰,停工不停学 Serverless 在线课堂免费开课

    二月份,Serverless 团队联合腾讯云大学与云+社区免费推出 Serverless 在线直播课程,课程涵盖 Serverless 架构解密.技术解析以及不同应用场景下的最佳实战指导,让你从 0 ...

  5. window下mysql安装步骤

    1. 官网下载mysql zip包 2. 解压后再D:\database\mysql\mysql-5.7.26-winx64下添加my.ini文件,文件内容如下: [mysql]# 设置mysql客户 ...

  6. 正则表达式grep学习(一)

    文本处理三剑客grep       文本过滤sed       流过滤awk       格式处理 正则表达式就是一些特殊字符组成的模式,赋予了他特定的含义 在大多数程序里,正则表达式都被置于两个正斜 ...

  7. JVM相关面试题

    1.JVM 基本机构 1.1 类加载子系统负责从文件系统或者网络中加载Class信息,加载的类信息存放于一块称为方法区的内存空间.除了类的信息外,方法区中可能还会存放运行时常量池信息,包括字符串字面量 ...

  8. Redhat6更改yum源 (转)

    最近虚拟机中安装了redhat6.3企业版,自带的yum用不起来,软件都找不到. 网上搜了一下说是没付钱...,需要改下yum源.操作步骤如下: 1.切换到yum源存放目录[root@rhel6 ~] ...

  9. 网站TDK三大标签SEO优化

    SEO(Search Engine Optimization)汉译为搜索引擎优化,是一种利用搜索引擎的规则提高网站在有关搜索 引擎内自然排名的方式. SEO 的目的是对网站进行深度的优化,从而帮助网站 ...

  10. 吴裕雄--天生自然 R语言开发学习:使用键盘、带分隔符的文本文件输入数据

    R可从键盘.文本文件.Microsoft Excel和Access.流行的统计软件.特殊格 式的文件.多种关系型数据库管理系统.专业数据库.网站和在线服务中导入数据. 使用键盘了.有两种常见的方式:用 ...