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

相关推荐
xvch37 分钟前
Kotlin 2.1.0 入门教程(七)
android·kotlin
望风的懒蜗牛1 小时前
编译Android平台使用的FFmpeg库
android
浩宇软件开发1 小时前
Android开发,待办事项提醒App的设计与实现(个人中心页)
android·android studio·android开发
ac-er88882 小时前
Yii框架中的多语言支持:如何实现国际化
android·开发语言·php
苏金标3 小时前
The maximum compatible Gradle JVM version is 17.
android
zhangphil3 小时前
Android BitmapShader简洁实现马赛克,Kotlin(一)
android·kotlin
iofomo7 小时前
Android平台从上到下,无需ROOT/解锁/刷机,应用级拦截框架的最后一环,SVC系统调用拦截。
android
我叫特踏实8 小时前
SensorManager开发参考
android·sensormanager
五味香10 小时前
Java学习,查找List最大最小值
android·java·开发语言·python·学习·golang·kotlin
graceyun15 小时前
C语言进阶习题【1】指针和数组(4)——指针笔试题3
android·java·c语言