本站长期提供ROM下载,可以定制多国语言刷机包和和刷机方案。点击这里给我发消息

预安装教程实现apk的静默安装

ROM相关 半夏月 1378℃ 0评论

想知道什么是预安装功能、预安装的原理的,就慢慢的看帖子吧。直接想知道怎么添加的,那就跳过我这些废话,直接看添加教程吧,教程其实很简单。

   废话开始:

   每次刷完机后,大家都要安装一些自己经常使用的软件,不得不说这对我来说是一件痛苦的事。每次享受完刷机的乐趣后就要面对需要安装的一大堆软件。

   首次见到预安装技术是在G大的包里,一直没有时间研究。这几天终于给搞定了,对喜欢刷机的机油来说这确实可以省去刷完机后一个个安装软件的麻烦。今天的教程就是要教给大家怎样给自己的ROM添加预安装的功能。

    那么什么是预安装呢??其实为什么叫预安装,我也不知道。

    预安装其实就是一种静默安装,在不需要操作界面的情况下完成apk的安装。/system/app下的apk其实就是静默安装的,在刷完机首次开机时系统会自动完成其目录下apk 的安装。静默安装的命令是pm install [-l] [-r] PATHadb install命令背后也是调用的pm命令安装的。大家可以当成关键词谷歌一下,了解更多的内容。

    G大的预安装脚本,安装的是/system/preinstall/sdcart/preinstall下的apk。要实现这个功能,我们需要一个脚本,脚本用来干什么呢?主要功能是:判断是否是首次开机,是首次开机话就安装预定目录的apk,生成log。总不能每次开机都要安装一遍吧。

    脚本有了我们要的是在开机时启动这个脚本。那么就要修改初始化脚本init.rc了。init.rc是一个可配置的初始化文件,通常定制厂商可以配置额外的初始化配置,例如init.%PRODUCT%.rc。它会在系统的初始化过程中进行一些简单的初始化操作。这个脚本被直接安装到目标系统的根文件系统中,被 init可执行程序解析。 init.rc是在init启动后被执行的首个脚本。我们目标就是修改它。至于shell语法、init.rc的语法这里不做介绍。

   修改的思路,就是在init.rc中添加一个service,然后启动它。

   废话结束。

  教程开始,这里提供两种方法,也就是两种不同的思路。第一种方法我在2.3的系统上测试通过,但在4.0的系统上测试失败。第二种方法在2.34.0上均测试通过。那为什么还要说第一种方法呢,因为第一种方法可定制性比较强

自己使用的工具:

1、  解包打包boot.img是使用的厨房

2、  文本编辑器使用的是notepad++

方法一:1、将下载的附件中的init.local.rc放到ROM/system/etc目录下(如果原ROM没有这个文件的话),loadpreinstalls.sh放到/system/bin目录下。有init.local.rc这个文件的,在最后添加内容:

#Preinstall
on property:dev.bootcomplete=1
start loadpreinstalls

service loadpreinstalls /system/bin/logwrapper /system/bin/loadpreinstalls.sh
disabled
oneshot

2、解包你的boot.img,解包方法大家可以使用厨房,不做具体讲解。修改init.rcCM7是在:

# Run sysinit
exec /system/bin/sysinit

class_start default

前面添加:

# Include extra init file
import /system/etc/init.local.rc

其余的一些官方包添加到start sysinit这句话前面。
   其实添加到最后也是可以的,但最好添加到这里。因为这句话本该就在这。   
   最后打包你的boot.img。在/system下建立preinstall目录,放入你要装的apk就行了。普通用户可以在刷机前在SD上建立preinstall目录放入自己apkApk不得有空格,不得有中文字符。

方法二:
1、将附件中loadpreinstalls.sh放到/system/bin目录下

2、修改init.rc,在最后添加init.local.rc中的内容:

#Preinstall
on property:dev.bootcomplete=1
start loadpreinstalls

service loadpreinstalls /system/bin/logwrapper /system/bin/loadpreinstalls.sh
disabled
oneshot

最后打包boot.img就完成了。
添加方法其实很简单。对比两种方法,会发现第一种方法定制性很强。以后在不解包boot.img的情况下,可以在init.local.rc中添加自己以后可能需要到的各种东西。而第二种方法,你不得不再次解包boot.img了。
   至于第一种方法不能使用在4.0的原因,经查看last_kmsg日志文件,是因为:init:could not import file /system/etc/init.local.rc不能导入init.local.rcXDA上也有人反应CM9也是导入失败。至于原因尚且不知。
   其实别的方法还有很多,比方像G大一样,直接把脚本放到ramdisk里面。
   突然又想到另一种方法,那就时把loadpreinstalls.sh放到init.d下(如果你的ROM支持init.d的话),突然意识到这个方法,未实践。理论上是可以的。
loadpreinstalls.sh脚本的内容提取自G大。此脚本不对preinstall下的apk做任何判断,直接执行静默安装。我又在魔趣中提取了另一个脚本,魔趣的这个脚本会验证/system/etc/preinstallapkMD5,当匹配的时候会自动安装,不匹配的时候放弃安装。这样可以防止一些人替换掉自己的apk。但是其apkMD5是以本地文件明文保存的,是可以随意替换的,这样就比较鸡肋了。
   教程到此结束,欢迎大家反馈交流。

转载请注明:半夏月 » 预安装教程实现apk的静默安装

喜欢 (1)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址