1 了解用户进程与系统进程
对于用户自己编写的应用程序apk来说它本身跑到机器上只是一个用户进程
用户进程的特点
- 1 由用户去启动和关闭的进程
- 2 运行在用户权限下,只能访问用户自己的资源
- 3 用户进程的apk一般位于/data/app/下且apk名称也是随机生成
系统进程的特点
- 1 由系统来启动和管理进程
- 2 具有更高的系统权限,可以访问系统的相关资源
- 3 系统进程的apk一般为/system/目录下,且apk名称也来自你编写的mk文件
俩者不同之处
直观体验来说
- 1 所在目录
- 2 进程启动和管理
2 如何设置用户进程变为系统进程
首先设置用户应用程序的AndroidManifest.xml文件添加相关属性
<manifest xmlns:android="[http://schemas.android.com/apk/res/android](http://schemas.android.com/apk/res/android)"
package="com.xxxx"
android:sharedUserId="android.uid.system"
coreApp="true">
<application
android:persistent="true"/>
- 1 首先定义 android:sharedUserId="android.uid.system" ,他保证应用程序共享用户id,而多个进程如果都共享相同的userid,他们是可以互相访问内部数据的,这也就存在了危险性
- 2 coreApp 设置核心应用程序,一般适用于只有服务的进程,确保这些关键服务可以在系统启动时得到优先加载和初始化,从而提高系统的稳定性和可靠性。本身也是存在风险的
- 3 android:persistent 设备重启后自动启动
其次配置应用程序要设置platform签名,保证具有系统级别的权限和信任
build.gradle配置
signingConfigs {
config {
storeFile file('platform.keystore')
storePassword 'android'
keyAlias 'platform'
keyPassword 'android'
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.config
}
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.config
}
}
而且要有平台签名文件
配置完成后你编译的apk会包含系统签名,保证你可以具有系统权限
最后就简单看下应用程序mk的编写
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := xxxx
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := .apk
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := xxx.apk
LOCAL_CERTIFICATE := platform
LOCAL_PRIVILEGED_MODULE := true
LOCAL_DEX_PREOPT := false
LOCAL_PROGUARD_ENABLED := disabled
include $(BUILD_PREBUILT)
这种主要是针对你目录下的apk文件在系统编译时对文件进行编译打包,放入指定目录,在系统运行时就可以识别该应用程序
最后在device目录下的device.mk定义系统额外加载的模块
PRODUCT_PACKAGES += xxx
所以这些模块会在系统启动后自动安装到设备上,并且进程也启动了
好了,配置完上述这些,你的进程就是系统进程了,apk也会放在system目录下
pm list packages -f |grep xxxxx(进程名)
这个命令可以查看你的进程的apk所在路径,来帮助你判断你的进程文件是否位于系统目录