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

相关推荐
2501_932750263 小时前
Android BottomNavigationView 入门介绍
android
Godikov5 小时前
硬件异步事件下的业务一致性:智能柜领取/归还流程的竞态设计
android
Godikov5 小时前
不用 Netty:Android 手写 TCP 客户端实战——自定义协议帧、粘包处理与可靠重连
android
事圆则缓5 小时前
Java 面向对象如何落到 Android View 体系
android
iPad协议个微协议6 小时前
# 微信自动营销系统如何基于 WechatApi 做事件驱动设计
android·微信·企业微信·个人开发·wechatapi·微信个人号开发
AirDroid_cn6 小时前
隐私沙盒:第三方应用读取剪切板内容如何拦截?
android·gitee
2501_915918418 小时前
怎么把 Python 写的 Flet 应用打包成 iOS App 并上架 App Store?
android·ios·小程序·https·uni-app·iphone·webview
邪修king10 小时前
Re:Linux系统篇(二十六):文件系统(二):Ext 文件系统底层详解:从 inode、块组到软硬链接,结合 Windows 讲透文件管理本质
android·java·linux
又见情义10 小时前
RK3568 Android 13 版本号管理实战:基于 ROCKCHIP_BUILD_NUMBER 的定制化方案
android
终端安全笔记11 小时前
iOS 27 强制 TLS 1.2:租赁设备的注册链路会在哪一环断
android·网络·安全·ios·智能手机