客户需求:需要在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. python集合运算

    用 |,& 代替 并 和交 的运算.+, -代替并和差集.

  2. 使用spark

    更新说明 免密码登录 for f in `cat ~/machines`; do scp .ssh/id_dsa.pub $f:~/ ssh $f "cat id_dsa.pub >& ...

  3. Qt QGraphicsScene||GraphicsView函数刷新多次内存溢出问题

    需将QGraphicsScene *scene = new QGraphicsScene;放入上面声明头文件中声明: cpp文件中声明: 使用: 需要添加这个 scene->clear(); 这 ...

  4. [SDOI2019]移动金币(博弈论+阶梯Nim+按位DP)

    首先可以把问题转化一下:m堆石子,一共石子数不超过(n-m)颗,每次可以将一堆中一些石子推向前一堆,无法操作则失败,问有多少种方法使得先手必胜? 然后这个显然是个阶梯Nim,然后有这样的结论:奇数层异 ...

  5. [数学][欧拉降幂定理]Exponial

    Exponial 题目 http://exam.upc.edu.cn/problem.php?cid=1512&pid=4 欧拉降幂定理:当b>phi(p)时,有a^b%p = a^(b ...

  6. 项目中关于RPC 和rocketMQ使用场景的感受

    在花生待的这半年,切身体会了系统之间交互场景的接口技术实现方式,个人总结.仅供参考: 1.关于rpc接口,一般情况下 都是同步的.A系统的流程调用B系统.等着B返回,根据返回结果继续进行A接下来的流程 ...

  7. ready vs onload

    1 ready事件:当DOM载入就绪,可以查询,操纵时绑定一个要执行的函数.它可以极大地提高web应用程序的响应速度. 2  onload事件:js中的方法,网页的所有元素.图片全部加载完毕才执行这个 ...

  8. python+selenium自动化测试之登录

    selenium_login.py import unittest from selenium import webdriver class LoginTest(unittest.TestCase): ...

  9. css样式表----------样式属性(背景与前景、边界和边框、列表与方块、格式与布局)

    一.背景与前景 (1).背景 line-height: 1.5 !important;">90; /*背景色(以样式表为主,样式表优先.)*/ background-image:url ...

  10. 学会使用数据讲故事——Excel研究网络研讨会

    编者按:在数据密集型研究的新时代,Excel将成为研究者讲故事的强大工具.在即将举行的Excel研究网络研讨会中,我们将与你探讨如何用新的方式来寻找.查询.分析数据并实现数据可视化.Office 36 ...