当前位置: 首页 > news >正文

安卓8预装可卸载应用

环境

系统:Android 8
CPU:MTK
理论上改法适用于其他平台,比如展讯。
不适用于安卓11。安卓11请参照android 11®预装APP到data/app目录

实现

假设要内置test这个应用。
第一步把test添加到系统编译配置中,不同平台或cpu文件不一样。
比如:
device/mediateksample/xx/device.mk
PRODUCT_PACKAGES += test
然后是创建Android.mk, 这一步很关键,很多种写法都可能要问题。

错误写法1

Adroid.mk有问题的写法

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)LOCAL_MODULE := testapp
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_PRIVILEGED_MODULE := true
LOCAL_MODULE_PATH :=  $(TARGET_OUT)/system/vendor/operator/app
include $(BUILD_PREBUILT)

错误写法2

另外一种写法是针对Android新版本的,在安卓8中不能这么写
LOCAL_MODULE_PATH := $(TARGET_OUT)/system/vendor
这种改法会出错:
Non-symlink out/target/product/xx/system/vendor detected!
You cannot install files to out/target/product/xx/system/vendor while building a separate vendor.img!

错误写法3

使用这个目录也有问题:
$(TARGET_OUT)/system/vendor/operator/app
2023-11-01 08:02:24.012 635-635/system_process I/PackageManager: /vendor/operator/app/xx changed; collecting certs
2023-11-01 08:02:24.174 635-635/system_process W/PackageManager: Failed to scan /vendor/operator/app/test: Failed to collect certificates from /vendor/operator/app/test/test.apk

错误写法4

也不能放data/app/目录下
注意如果这么写,可能会出错

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := test
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_PRIVILEGED_MODULE := true
LOCAL_DEX_PREOPT:=false
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
include $(BUILD_PREBUILT)

2023-11-01 08:01:01.132 634-634/system_process W/PackageManager: Failed to scan /data/app/test: Failed to collect certificates from /data/app/xx/text.apk

正确写法

Android.mk要按这样写:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := test
LOCAL_POST_PROCESS_COMMAND := $(shell mkdir -p $(TARGET_OUT_DATA_APPS)/$(LOCAL_MODULE)
LOCAL_POST_PROCESS_COMMAND := $(shell cp -r $(LOCAL_PATH)/$(LOCAL_MODULE).apk $(TARGET_OUT_DATA_APPS)/$(LOCAL_MODULE)/)

修改PackageManagerService.java,注释掉PackageManagerException(INSTALL_FAILED_INVALID_INSTALL_LOCATION
否则启动会报这个异常。

diff --git a/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java b/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
index a4f6eab106..b9f07bf849 100644
--- a/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -11795,11 +11795,12 @@ public class PackageManagerService extends IPackageManager.Stub+ " but expected at " + known.codePathString+ "; ignoring.");}
-                    } else {
+                    } /*else {throw new PackageManagerException(INSTALL_FAILED_INVALID_INSTALL_LOCATION,"Application package " + pkg.packageName+ " not found; ignoring.");}
+               //帅得不敢出门    */}}

作者:帅得不敢出门 原创文件谢绝转载

相关文章:

  • [数据结构]HashSet与LinkedHashSet的底层原理学习心得
  • Git 标签管理
  • Jupyter Markdown 插入图片
  • Kettle 安装配置
  • SpringSecurity和JWT实现认证和授权
  • 聊聊logback的ThrowableProxyConverter
  • prometheus基础,结合node_exporter监控节点
  • 【数组】-Lc15-三数之和(排序+for循环+滑动窗口)
  • 详细学习Pyqt5的10种容器(Containers)
  • 【自动化测试】pytest 用例执行中print日志实时输出
  • WEBAPI返回图片显示在VUE前端
  • 设置随机种子保证网络可复现性
  • JAVA代码优化:Spring中redis的工具类
  • Java Web——动态Web开发核心-Servlet
  • 短线买入卖出有哪些交易技巧?
  • 11111111
  • Brief introduction of how to 'Call, Apply and Bind'
  • CSS 专业技巧
  • Docker 笔记(2):Dockerfile
  • Java超时控制的实现
  • Laravel核心解读--Facades
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • mac修复ab及siege安装
  • PHP 7 修改了什么呢 -- 2
  • Selenium实战教程系列(二)---元素定位
  • spring security oauth2 password授权模式
  • 初识 webpack
  • 对超线程几个不同角度的解释
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 前端js -- this指向总结。
  • 如何编写一个可升级的智能合约
  • 入门到放弃node系列之Hello Word篇
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 回归生活:清理微信公众号
  • ​MySQL主从复制一致性检测
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ​比特币大跌的 2 个原因
  • ​决定德拉瓦州地区版图的关键历史事件
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • #{}和${}的区别?
  • (13):Silverlight 2 数据与通信之WebRequest
  • (4)(4.6) Triducer
  • (C语言)fread与fwrite详解
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (层次遍历)104. 二叉树的最大深度
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (转)shell调试方法
  • (转)母版页和相对路径
  • (转)项目管理杂谈-我所期望的新人
  • .aanva
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .Net Remoting(分离服务程序实现) - Part.3
  • .net6 webapi log4net完整配置使用流程