前言
系统APP拥有高于普通APP的权限,可以访问一些普通APP无权访问的资源,可以操作一些普通APP无权操作的系统函数,可以不弹窗直接获取权限。本文介绍把APP声明为系统级,如何获取系统级权限,如何在系统中嵌入系统APP,如何给予权限白名单等操作。
本文基于Android 8.1.0(API 27)撰写,其他系统版本可能有些许差异。
先决条件
你需要有AOSP源码,并且能编译打包生成ROM。
APP侧
在manifest中声明为系统级APP
<?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
,这个名字不能改
内容如下:
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.mk
或DeviceCommon.mk
文件
在include
之后的行,添加以下内容:
PRODUCT_PACKAGES += APP目录名称
这样就成功把这个APP添加到了编译目标中,如果不做这个步骤的话,编译结束后的ROM里就没有这个APP。
配置framework权限白名单
打开frameworks/base/data/etc/privapp-permissions-platform.xml
这个文件,在<permissions>
标签的内部添加需要的权限:
<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 -> 刷机 -> 开机 一条龙即可。