1, 如何将带源码的 APK 预置进系统?

2, 如何将无源码的APK预置进系统?

3, 如何预置APK使得用户可以卸载,恢复出厂设置时不能恢复?

4, 如何预置APK使得用户可以卸载,并且恢复出厂设置时能够恢复?

 方法:

一、如何将带源码的APK预置进系统?

1)     在 packages/apps 下面以需要预置的 APK的 名字创建一个新文件夹,以预置一个名为Test的APK 为例

2)     将 Test APK的Source code 拷贝到 Test 文件夹下,删除 /bin 和 /gen 目录

3)     在 Test 目录下创建一个名为 Android.mk的文件,内容如下:

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional

LOCAL_SRC_FILES := $(call all-subdir-java-files)

LOCAL_PACKAGE_NAME := Test

include $(BUILD_PACKAGE)

4)     打开文件 build/target/product/${Project}.mk (其中 ${Project} 表示工程名)

将 Test 添加到 PRODUCT_PACKAGES 里面。

5)     重新 build 整个工程

二、如何将无源码的 APK 预置进系统?

1)     在 packages/apps 下面以需要预置的 APK 名字创建文件夹,以预置一个名为Test的APK为例

2)     将 Test.apk 放到 packages/apps/Test 下面

3)     在  packages/apps/Test 下面创建文件 Android.mk,文件内容如下:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

# Module name should match apk name to be installed

LOCAL_MODULE := Test

LOCAL_MODULE_TAGS := optional

LOCAL_SRC_FILES := $(LOCAL_MODULE).apk

LOCAL_MODULE_CLASS := APPS

LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)

LOCAL_CERTIFICATE := PRESIGNED

include $(BUILD_PREBUILT)

4)     打开文件 build/target/product/${Project}.mk (其中 ${Project} 表示工程名)

将 Test 添加到 PRODUCT_PACKAGES 里面。

5)     将从Test.apk解压出来的 so库拷贝到alps/vendor/mediatek/${Project}/artifacts/out/target/product/${Project}/system/lib/目录下,若无 so 库,则去掉此步;

6)     重新 build 整个工程

注:Google在KK上修改protection Level为System的permission控管机制

如果App使用System Level的permission,需要預置到/system/priv-app底下 (原在/system/app)。

举例来讲:

关于获取副SD卡的写入权限的案例,App需要在AndroidManifest.xml宣告WRITE_MEDIA_STORAGE permission获取副卡的写入权限

(Ref: KK/alps/frameworks/base/core/res/AndroidManifest.xml)

已知android.permission.WRITE_MEDIA_STORAGE属于SystemOrSignature level的permission,定义如下:

KK上,您需要采用以下方法,获取该permission:

修改Android.mk,增加LOCAL_PRIVILEGED_MODULE := true,以声明app需要放在/system/priv-app下。

三、如何预置APK使得用户可以卸载,恢复出厂设置时不能恢复?

1)     在 packages/apps 下面以需要预置的 APK 名字创建文件夹,以预置一个名为Test的APK为例

2)     将 Test.apk 放到 packages/apps/Test 下面;

3)     在  packages/apps/Test 下面创建文件 Android.mk,文件内容如下:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

# Module name should match apk name to be installed

LOCAL_MODULE := Test

LOCAL_MODULE_TAGS := optional

LOCAL_SRC_FILES := $(LOCAL_MODULE).apk

LOCAL_MODULE_CLASS := APPS

LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)

LOCAL_CERTIFICATE := PRESIGNED

LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)

include $(BUILD_PREBUILT)

4)     打开文件 build/target/product/${Project}.mk (其中 ${Project} 表示工程名)

将 Test 添加到 PRODUCT_PACKAGES 里面。

5)     重新 build 整个工程

注意:这个比不能卸载的多了一句

LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)

四、如何预置APK使得用户可以卸载,并且恢复出厂设置时能够恢复?

有两种方法:

方法一:预置apksystem/vendor/operator下面

具体做法如下:

packages/apps下面以需要预置的 APK 名字创建文件夹,以预置一个名为Test的APK为例:

1)     将Test.apk 放到 packages/apps/Test 下面;

2)     在packages/apps/Test下面创建文件 Android.mk,文件内容如下:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

# Module name should match apk name to be installed

LOCAL_MODULE := Test

LOCAL_MODULE_TAGS := optional

LOCAL_SRC_FILES := $(LOCAL_MODULE).apk

LOCAL_MODULE_CLASS := APPS

LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)

LOCAL_CERTIFICATE := PRESIGNED

LOCAL_MODULE_PATH := $(TARGET_OUT)/vendor/operator/app

include $(BUILD_PREBUILT)

3)     打开文件 build/target/product/${Project}.mk (其中 ${Project} 表示工程名), 将 Test 添加到 PRODUCT_PACKAGES 里面

4)     重新 build 整个工程

方法二:使用MTK_SPECIAL_FACTORY_RESET,再配合.keep_list / .restore_list

为了让用户在将预置的 APK 卸载后,恢复出厂设置时能恢复,敝司做了一个 Feature,但在ALPS.GB.TDFD.MP.V1.7和ALPS.GB.FDD2.MP.V4.7版本后支持,若贵司版本低于此版本,请申请 Patch ALPS00092543

大致的做法是:
  - 在vendor/mediatek/project_name/artifacts/out/target/product/project_name/system目录下新建一个名为appbackup的文件夹,将该应用的apk文件copy到appbackup文件夹下
  - 在mediatek/config/project_name/ProjectConfig.mk文件中添加定义:MTK_SPECIAL_FACTORY_RESET=yes
   - 在vendor/mediatek/project_name/artifacts/out/target/product/project_name/data/app下创建一个.restore_list,并且在其中添加语句:
/system/appbackup/xxx.apk(注意,.restore_list中的每一行都要以"/system” 开头)

当卸载了data/app下的apk后,再恢复出厂设置,系统会从 .restore_list 中读取apk的名字,然后从 appbackup 文件中把apk重新拷贝到data/app下,从而恢复data/app下已经卸载了的apk。

同时,还需要在vendor/mediatek/project_name/artifacts/out/target/product/project_name/data/app目录下创建一个空文件,命名为.keep_list(.keep_list的用途是,如果安装了A,B,C三个APK到DATA,在恢复出厂设置时,想要将A保留,那么就将A写入到.KEEP_LIST,这样,A会被保留,B,C会被删除。如果没有这个文件,那么所有的APK都会被保留。具体可以参考FAQ03437和FAQ05341)。

以上操作过程,DCC 上面也有相应的文档可供参考,文档的名字叫: Android SD upgrade application note.docx,里面有一项:MTK special factory reset,就详细地介绍了以上操作步骤。

注:该方法从kk开始不建议使用,原因:从KK版本开始,DVM取dex文件的路径变成了绝对路径,而PMS和installd用的都是文件路径,如果用MTK_SPECICAL_FACTORY_RESET配合.restore_list的方式恢复apk的话,这种上下不sync会导致一些问题,比如:恢复出厂设置后三方应用报错、恢复出厂设置后user版本move to phonestorage报错、多次恢复出厂设置开机提示"Android系统正在升级"等。

Android系统(274)---如何预置APK相关推荐

  1. Android系统静默安装预置应用宝

    Android系统预置应用宝 如果直接按照常规方案预置应用宝到system/app下的话,会报好多Selinux错误,导致应用闪退 而应用宝又申请了好多并不需要的权限例如su 本来的方案是第一次开机时 ...

  2. Android 系统预装添加第三方apk到data/app

    对于第三方apk预装入系统时如果将apk装入system/app目录下,由于第三方apk带有自己的.so文件,此时会出现apk无法打开的情况. 解决方法: 1:解压apk,将里面的.so文件放入dev ...

  3. android系统精简掉music.apk后设置铃声的方法

    2012-09-10 更新: 今天无意中发觉,"360优化大师",里面也可以 设置 来电铃声 和 短信铃声 由于这个 软件设置 真的很简单,就不截图了: 打开优化大师-->向 ...

  4. Android 系统(180)---Android.mk入门

    Android.mk入门 这篇Blog主要记录向系统源码添加模块时使用的Makefile,和NDK编程使用的makefile有一些差异. Android的mk文件是有很强的套路的,下面我在我的< ...

  5. android预置app可卸载实现,Android系统预制可自由卸载apk

    在我们都痛恨手机厂商预装着一堆无用的app时,是否考虑怎么实现将app预装在data区,让用户可以自由卸载,做一个有良心的厂商,下面就把来说说如何实现预装app能够让用户卸载. 系统识别的app位置 ...

  6. Android: android 如何预置APK

    转自:http://blog.csdn.net/sergeycao/article/details/8198205 一.如何将带源码的APK预置进系统? 1) 在 packages/apps 下面以需 ...

  7. android 内置apk方法,Android预置Apk方法

    因为工作需要,经常要开发和合入系统App,所以在此开篇作为收集和记录Android合入系统应用的方法,以备日后查阅. 一.预置apk方法 Case 1:如何将带源码的APK预置进系统 在 packag ...

  8. Android系统编译时集成三方APK

    1. 前言 最近在学习Android系统开发,在开发过程中可能要到将三方apk集成到系统中的需求.目前我了解的方法有两种. 一种是在系统编译完毕之后,再将三方apk文件放置到系统目录之下.参考如何将a ...

  9. 更改apk安装包对android系统等级要求

    此篇文章解决的为问题: █问题1.系统等级与apk等级不匹配. █问题2.更改api等级后的签名问题. ================================= 1.工具准备: 解压缩too ...

最新文章

  1. [公告]向大家汇报服务器的情况
  2. PCL、XPS转换成PDF的控件activePDF Meridian​
  3. wxpython设置listctrl选中行_Excel办公实操,进行给特定行(列),重复打印与避免打印...
  4. Linux下下载JDK
  5. 做了这么多项目才知道「模态弹窗」是这么用的
  6. 怎么在表格中转换html格式,图解Excel与Html格式之间的互相转换
  7. python是什么意思-python中class是什么意思
  8. Memcached启动提示:cann't run as root without the -u switch
  9. 云物大智题库--人工智能
  10. kernel中的memtest
  11. win7系统如何开启打印服务器配置,win7系统怎么添加打印服务器端口
  12. 2022计算机类投稿心得(须知)
  13. win10 蓝牙耳机 连接后输出 没有耳机选择 的 解决办法
  14. JS-Global对象
  15. PostgreSQL 透明加密(TDE,FDE) - 块级加密
  16. rockyLinux 初体验PostgreSQL15详细安装教程
  17. Git rebase(变基)操作详解
  18. php导入excel先检查,php 如何在导入Excel数据时检查Mysql数据库内容是否存在,避免重复录入?:怎么样筛选excel表格重复的数据库...
  19. MySQL ERROR 1064 (42000)
  20. 一起学英语第二季第六期

热门文章

  1. Keil综合(01)一些常见文件类型的作用和功能说明
  2. vapor mysql_vapor MySQL 作为Cache
  3. 动态加载子节点_简易数据分析 10 | Web Scraper 翻页—抓取「滚动加载」类型网页...
  4. Spanning Tree Protocol介绍
  5. [计算机系统] - 链接
  6. c语言ics什么意思,[转载]C网来话筛选(ICS)业务及实现
  7. 【Gamma】 Phylab 发布说明
  8. Linux 文件IO管理 - POSIX
  9. UWP锁、解屏后无法响应操作
  10. 使用五种方法获取文件扩展名