客户需求:需要在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. 吴裕雄--天生自然 PYTHON3开发学习:面向对象

    class MyClass: """一个简单的类实例""" i = 12345 def f(self): return 'hello wor ...

  2. 从list中取N个随机生成一个集合

    在工作中发现有很多有序算法,较少见到一些可用的无序随机算法.无序随机算法的目的是让客户感觉每次都不一样,因为一直看一样的会审美疲劳哈. 在jdk自带一种CollectionUtils.shuffle& ...

  3. Django数据库查询优化-事务-图书管理系统的搭建

    数据库查询优化 优化:虽然减轻了数据库的压力,但查询速度大大的减慢 ORM内所有的语句操作,默认都是惰性查询,只有你在真正的需要数据的时候才会走数据, 如果你只是写ORM语句时,是不会走数据库的,这样 ...

  4. mysql常用方法案例

    SELECTms.id,ms.name,ms.address,ms.mobile AS phone,ms.UUID,(case when ce.score is null then 0 else ce ...

  5. 记录ionic 最小化应用时所遇的问题

    ionic3与ionic4最小化插件安装不一样: ionic3安装方法: $ ionic cordova plugin add cordova-plugin-appminimize $ npm ins ...

  6. 吴裕雄--天生自然python学习笔记:python 用pygame模块检测键盘事件和鼠标事件

    用户可通过键盘输入来操控游戏中角色的运动,取得键盘事件的方法有以下两种 : 常用的按键与键盘常数对应表 : 按下右箭头键,蓝色小球会 向 右移动:按住右箭头键不放 , 球体会快速 向 右移 动, 若到 ...

  7. day18-5个内置方法

    # 1. __str__方法: 必须return class Goods: def __str__(self): return 'apple' g = Goods() print(g) #apple, ...

  8. 扩增|feather evolution

    Wool vs feather 扩增方法:1.Gene Duplication2.Genome Duplication3.Cluster 哺乳动物毛发和鸟类的羽毛,都来自于角蛋白. 羽毛进化图 DNA ...

  9. 对Java8新的日期时间类的学习(一)

    引用自Java译站http://it.deepinmind.com/java/2015/03/17/20-examples-of-date-and-time-api-from-Java8.html 除 ...

  10. Spring+Mybais整合

    简单的来说,Spring主要用于在业务层(当然spring也有数据库交互的模块,个人觉得spring在这方面有一点不如mybatis),而mybatis主要用于数据持久化,在一个完整的项目中无论是业务 ...