最近在做CTA认证的时候有个需求,需要预制两个应用为可卸载的方式,且恢复出厂设置之后,可以重新安装。

思路:

  1. 预制应用需要编译输出在/system/preinstall目录
  2. 系统首次运行的时候,需要通过脚本将输出的apk拷贝到/data/app目录

应用编译输出到指定目录,通过在Android.mk文件中添加如下字段实现:

LOCAL_MUDULE_PATH := $(PRODUCT_OUT)/system/preinstall

接下来需要实现应用的拷贝逻辑

#!/system/bin/sh
if [ ! -f "/data/app/installed" ]; thenchmod 777 /data/app/cp -rf /system/preinstall/* /data/app/echo "1" > /data/app/installedchmod -R 777 /data/app/*
fi

这段脚本的意思是

  1. 首先判断/data/app目录是否存在installed文件
  2. installed文件不存在的情况下,首先对/data/app 赋读写权限。
  3. 然后拷贝/system/preinstall下的所有文件夹到/data/app目录
  4. 创建installed文件,表示已经拷贝完成,下一次开机就不再执行
  5. 给/data/app下所有文件以及文件夹赋权限。

这里遇到了一个问题,使用notepad++编写脚本后push到/system/bin/目录运行,提示"if unmatched"的语法问题,一度以为系统将sh语法支持裁剪了,后面cat了install-recovery.sh查看后,发现系统是支持if语句的,是notepad++编写的字符格式有问题,我把install-recovery.sh pull下来,基于这个文件修改脚本再push就好了。

脚本编译好了之后,需要将其编译进系统里面,在device/xxx/common目录下找到base.mk,添加如下字段:

PRODUCT_COPY_FILES += preload.sh存放路径:preload.sh需要输出的路径
exp:
PRODUCT_COPY_FILES += device/qcom/common/preload.sh:system/bin/preload.sh

添加完成编译后,会发现out目录下的/system/bin中有preload.sh,且其会被打包进system.img

脚本输出到system分区了,还需要在开机启动的时候,执行这个脚本。一般都由init进程触发。

高通平台的init执行动作,描述在device/qcom/common/rootdir/etc/init.qcom.rc文件中。需要在该文件中添加如下代码:

service preload /system/bin/sh /system/bin/preload.shclass late_startuser rootgroup rootoneshot

添加完成后,因为在android 7.0的系统中存在selinux的安全监测,我们需要配置对应的策略。对应高通平台,需要修改device/qcom/sepolicy/msm8937/init_shell.te添加如下代码

allow qti_init_shell apk_data_file:dir { create read write open search getattr setattr add_name };
allow qti_init_shell apk_data_file:file { create read write open getattr setattr };

全部配置完成之后,重编系统,即可。

Android 7.0预制应用为可卸载相关推荐

  1. android 10.0 预制不可卸载app(RK 展讯 MTK平台都适用)

    1.概述 在10.0的系统产品进行定制化开发新手来说,对怎么预制apk感觉很陌生,但是也很简单的,可以把预制的apk放在vendor 目录下 也可以放在package/app下 配置好mk 让系统能编 ...

  2. android 8.0预装APK为可卸载

    需要在如下文件中配置下. vendor/mediatek/proprietary/frameworks/base / data/etc/pms_sysapp_removable_vendor_list ...

  3. 细数Android 7.0“牛轧糖”的五大缺陷:不支持悬浮窗口

    导语:当前,Android 7.0 Nougat(牛轧糖)已经开始被缓慢部署至全球各地的Android设备中.按照惯例,仍然是Nexus设备首先获得谷歌最新的移动操作系统,其他的智能手机则还需要等待一 ...

  4. visual studio 2017 中默认无法开发 Android 8.0 及以上系统的解决方案

    一般默认比较旧有两个原因,系统版本过旧,Visual Studio 版本过旧. 第一步,将windows 更新到最新版,必须是windows 10 并且更新到最新. 第二步,将visual studi ...

  5. Android 8.1 源码_启动篇(一) -- 深入研究 init(转 Android 9.0 分析)

    前言 init进程,它是一个由内核启动的用户级进程,当Linux内核启动之后,运行的第一个进程是init,这个进程是一个守护进程,确切的说,它是Linux系统中用户控件的第一个进程,所以它的进程号是1 ...

  6. Android 10.0 PackageManagerService(一)工作原理及启动流程-[Android取经之路]

    摘要:PackageManagerService是Android系统核心服务之一,在Android中的非常重要,主要负责APK.jar包等的管理. 阅读本文大约需要花费50分钟. 文章的内容主要还是从 ...

  7. Android 8.0 Oreo 国内可用测试平台上线

    Android 8.0 Oreo 已经发布两个月了,无数开发者已经跃跃欲试,想在这个全新版本的 Android 系统上让自己的应用一展身手,我们很清楚,Android 8.0 为了更流畅的系统,以及更 ...

  8. android 8.0 调系统拍照_Android通知栏微技巧,8.0系统中通知栏的适配

    为什么要进行通知栏适配? 不得不说,通知栏真是一个让人又爱又恨的东西. 通知栏是Android系统原创的一个功能,虽说乔布斯一直认为Android系统是彻彻底底抄袭iOS的一个产品,但是通知栏确实是A ...

  9. android 7.0 禁止 imei,Android一些适配

    # Android 版本适配重点 其他细节请查看官网对应版本:https://developer.android.com/preview ## 7.0 1. 后台优化 - 移除了以下静态注册广播通知( ...

最新文章

  1. Java引入依赖aar_java – 如何将JAR依赖项包含到AAR库中
  2. word笔记之选择性粘贴-设置默认粘贴为当前格式
  3. 第十五周程序阅读-范型程序设计(2)
  4. angular代码分析之异常日志设计
  5. MySQL基础之控制台常用命令
  6. orcad如何设置模块化设计_充气膜结构送风设置设计以及通风效果如何呢?
  7. oracle的排序分页,oracle 排序分页 高效sql语句
  8. centos 本地化配置
  9. comsol临时文件夹中有不支持的字符_文件名中不能包含的字符
  10. 聊聊近期的感受和10月文章精选!
  11. 平均值 oj 山东科技大学 c 语言作业
  12. USB学习笔记连载(十五):USB固件更新以及安装驱动
  13. msysgit中文问题
  14. 我们用大数据创造没人能理解的人工智能
  15. SVM(三),支持向量机,线性不可分和核函数
  16. 在线使用matlab,MATLAB在线版本使用介绍
  17. 【openv450-samples】像素点聚类EM 图像聚类目标检测
  18. Ps 原来排版证件照如此简单(╹ڡ╹ )
  19. 如何认识会计科目,看懂财务报表?
  20. 服务器 iis ftp配置文件,如何:在 IIS 中创建和配置 FTP 站点

热门文章

  1. java检测工具_常用Java代码质量检测评估工具
  2. unity3D射击游戏
  3. matlab 脉冲压缩算法,线性调频脉冲压缩原理及其MATLAB仿真+程序
  4. 广和通“乘风破浪”:坚持全球化战略,推动全球5G物联网发展
  5. 自动判断QQ是否在线,并显示在线状态
  6. M1芯片已适配达芬奇DaVinci Resolve苹果M1处理器安装新版达芬奇17教程(适配最新M1芯片处理器款mac,支持Big sur )
  7. 机器人动力学与控制学习笔记(十四)————RBF网络自适应控制
  8. 用友U8采购暂估案例教程2单到回冲
  9. 坚持写日记的好处,原来这么重要
  10. 左手曾国藩,右手胡雪岩读书笔记