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

安卓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.");
                     }
+               //帅得不敢出门    */
                 }
             }

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


http://www.kler.cn/news/156474.html

相关文章:

  • 关于开展人工智能专业人员“自然语言及语音处理设计开发工程师”专项培训的通知
  • 2.Ansible的copy模块,我最常用的模块
  • 动能资讯 | 智能音箱—万物物联新纽带
  • SSL证书 免费
  • MacOS14 Sonoma 安装 Flutter 开发环境
  • CRM助力销售:提升效率与业绩的双刃剑!
  • undo log 具体怎么回滚事务,如何查询慢 SQL 产生的原因
  • 1688API接口系列,1688开放平台接口使用方案(商品详情数据+搜索商品列表+商家订单类)
  • 数据库SQL中的三个语句:DROP、TRUNCATE 、DELETE 以上三种的区别? 效率?
  • JavaWeb | 验证码 、 文件的“上传”与“下载”
  • 8g-pwm
  • 【程序员 | 交流】程序员情商修炼指南系列 (沟通是有效合作一大利器)
  • 人工智能算法
  • 分享78个节日PPT,总有一款适合您
  • 「Swift」取消UITableView起始位置在状态栏下方开始
  • [足式机器人]Part2 Dr. CAN学习笔记-Ch0-1矩阵的导数运算
  • SAP ABAP ALV创建动态树形菜单
  • harmonyOS学习笔记之stateStyles
  • Python工具类函数—时间转换处理 进阶版
  • qnx learning
  • 轻量级网络结构的目标检测算法——Yolov8介绍
  • 深入理解和使用volatile关键字
  • 【MODBUS】Modbus 主从模式的部署方式
  • 为什么 AWS 数据库不讲 HTAP
  • TVS器件的概述和应用!|深圳比创达电子EMC
  • 解决分布式React前端在本地开发环境的跨域问题
  • 记录一次docker搭建tomcat容器的网页不能访问的问题
  • fork使用git可视化管理工具
  • 什么是迁移学习
  • Pytorch当中transpose()和permute()函数的区别