【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 -> 刷机 -> 开机 一条龙即可。

相关推荐
shaominjin12325 分钟前
单例模式:设计模式中的“独一无二“之道
android·单例模式·设计模式
千里马学框架41 分钟前
windows系统上aosp15上winscope离线html如何使用?
android·windows·html·framework·安卓窗口系统·winscope
码住懒羊羊42 分钟前
【C++】模板进阶 | 继承
android·java·c++
urkay-44 分钟前
Android 线程详解
android·java·kotlin·iphone·androidx
aqi001 小时前
FFmpeg开发笔记(八十七)采用Kotlin的手机开源播放器VLC-Android
android·ffmpeg·音视频·流媒体
峥嵘life2 小时前
Android EDLA项目导入mainline包后蓝牙签名报错分析解决
android·gitee
灵猫小西3 小时前
Android耗时卡顿原因排查工具Profiler
android·profiler·耗时卡顿
gfdgd xi3 小时前
好消息:KMRE 安卓模拟器现可在Debian/GXDE使用
android·python·架构·bug·deepin·龙芯
La Pulga4 小时前
【STM32】FLASH闪存
android·c语言·javascript·stm32·单片机·嵌入式硬件·mcu
游戏开发爱好者85 小时前
iOS 崩溃日志分析工具全指南,多工具协同构建稳定性分析体系
android·macos·ios·小程序·uni-app·cocoa·iphone