【AOSP】打包为系统APP并获取系统级权限

前言

系统APP拥有高于普通APP的权限,可以访问一些普通APP无权访问的资源,可以操作一些普通APP无权操作的系统函数,可以不弹窗直接获取权限。本文介绍把APP声明为系统级,如何获取系统级权限,如何在系统中嵌入系统APP,如何给予权限白名单等操作。

本文基于Android 8.1.0(API 27)撰写,其他系统版本可能有些许差异。

先决条件

你需要有AOSP源码,并且能编译打包生成ROM。

APP侧

在manifest中声明为系统级APP

xml 复制代码
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:sharedUserId="android.uid.system"   <--添加这行
          package="com.dubhe.mysystemapp"> 

注意:声明为系统级APP后只能通过AOSP源码预装,无法在Android Studio中通过adb直接往手机上安装运行。

manifest中的权限声明和Activity等组件中的动态权限申请照常写。系统级APP只是默认通过而已,不是不需要声明和申请。

AOSP源码侧

配置APK编译脚本

packages/apps目录下新建一个目录,以APP的名字命名,此处例子为MySystemApp

把编译好的APK放到这个目录下,

然后在这个新建的目录下新建一个文件名为Android.mk这个名字不能改

内容如下:

yaml 复制代码
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

# APP的名字
LOCAL_MODULE := MySystemApp
LOCAL_MODULE_CLASS := APPS
# 在什么包下编译,可以为user、eng、tests、optional,optional代表在任何版本下都编译
LOCAL_MODULE_TAGS := optional
# 可以为testkey、platform、shared、media、PRESIGNED(使用原签名),platform代表为系统应用
# 此处必须写plantform
LOCAL_CERTIFICATE := platform
# APK文件名
LOCAL_SRC_FILES := MySystemApp.apk
# 不设置或者设置为false,安装位置为system/app,如果设置为true,则安装位置为system/priv-app
LOCAL_PRIVILEGED_MODULE := true
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)

include $(BUILD_PREBUILT)

配置device编译脚本

定位到device/厂商名称/设备名称目录下找到BoardConfig.mkDeviceCommon.mk文件

include之后的行,添加以下内容:

makefile 复制代码
PRODUCT_PACKAGES += APP目录名称

这样就成功把这个APP添加到了编译目标中,如果不做这个步骤的话,编译结束后的ROM里就没有这个APP。

配置framework权限白名单

打开frameworks/base/data/etc/privapp-permissions-platform.xml这个文件,在<permissions>标签的内部添加需要的权限:

xml 复制代码
<permissions>
 <privapp-permissions package="com.dubhe.mysystemapp">
        <permission name="android.permission.ACCESS_FINE_LOCATION" />
        <permission name="android.permission.ACCESS_NETWORK_STATE" />
        <permission name="android.permission.ACCESS_WIFI_STATE" />
        <permission name="android.permission.BLUETOOTH" />
        <permission name="android.permission.CHANGE_WIFI_STATE" />
        <permission name="android.permission.READ_PHONE_STATE" />
        <permission name="android.permission.READ_SMS" />
        <permission name="android.permission.SEND_SMS" />
        <permission name="android.permission.WRITE_SMS" />
        <permission name="android.permission.WRITE_SETTINGS" />
        <permission name="android.permission.READ_CALL_LOG" />
        <permission name="android.permission.READ_PHONE_STATE" />
        <permission name="android.permission.RECEIVE_SMS" />
        <permission name="android.permission.READ_SMS" />
        <permission name="android.permission.ACTIVITY_RECOGNITION" />
    </privapp-permissions>
</permissions>

在这个名单中的权限会被系统默认允许。注意包名要和APK的包名一致。

编译打包刷机运行

之后正常source-> lunch -> make -> 刷机 -> 开机 一条龙即可。

相关推荐
百锦再23 分钟前
Android Studio开发 SharedPreferences 详解
android·ide·android studio
青春给了狗34 分钟前
Android 14 修改侧滑手势动画效果
android
CYRUS STUDIO41 分钟前
Android APP 热修复原理
android·app·frida·hotfix·热修复
火柴就是我2 小时前
首次使用Android Studio时,http proxy,gradle问题解决
android
limingade2 小时前
手机打电话时电脑坐席同时收听对方说话并插入IVR预录声音片段
android·智能手机·电脑·蓝牙电话·电脑打电话
浩浩测试一下2 小时前
计算机网络中的DHCP是什么呀? 详情解答
android·网络·计算机网络·安全·web安全·网络安全·安全架构
青春给了狗4 小时前
Android 14 系统统一修改app启动时图标大小和圆角
android
pengyu4 小时前
【Flutter 状态管理 - 柒】 | InheritedWidget:藏在组件树里的"魔法"✨
android·flutter·dart
居然是阿宋6 小时前
Kotlin高阶函数 vs Lambda表达式:关键区别与协作关系
android·开发语言·kotlin
凉、介6 小时前
PCI 总线学习笔记(五)
android·linux·笔记·学习·pcie·pci