背景
基于定制平板系统开发应用,能获得安卓源码层的支持。
Android8.1系统。
目标
- 默认获取所需全部权限,不再弹窗询问授权。
- 静默升级安装新版本。
实现
获取系统应用权限
通过sharedUserId
这个配置,将当前应用进程配置为系统应用进程,可获取所有权限。
原理
通过Shared User id,拥有同一个UserId的多个APK可以配置成运行在同一个进程中,所以默认就是可以互相访问任意数据,同时可以访问其他APK的数据目录下的数据库和文件,就像访问本程序的数据一样。
为了防止其他应用拿到sharedUserId并滥用,Android系统限制了相同的userId情况下,必须要使用同样的签名才能安装在同一设备上。故,如果要设置为系统共享进程,必须要和系统应用签名一致。
系统给应用签名的逻辑:
系统源码中build/target/product/security
目录中有四组默认签名供Android.mk
在编译APK使用,通过指定LOCAL_CERTIFICATE
字段来实现,分别是:
testkey
:普通APK,默认情况下使用。platform
:该APK完成一些系统的核心功能。经过对系统中存在的文件夹的访问测试,这种方式编译出来的APK所在进程的UID为system。shared
:该APK需要和home/contacts进程共享数据。media
:该APK是media/download系统中的一环
普通应用则使用testkey
,若要为系统应用,可指定为platform
。
原理及介绍参考该文章:Android的权限机制之—— “沙箱”机制sharedUserId和签名
实现
参考该文章实现:Android apk 系统签名
1. 前提:
应用签名不能是自定义签名,需要是系统签名。签名文件需要找系统提供厂商提供,包含platform.pk8
、platform.x509.pem
、signapk.jar
等几个文件,如果这一步不能提供,那通过配置sharedUserId
的方式无望。
2、配置sharedUserId
在AndroidManifest.xml
中的manifest
节点增加:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.moore.systemapk"
android:sharedUserId="android.uid.system">
</manifest>
3、签名
方式一:
在系统源码层,将应用Android.mk
中的LOCAL_CERTIFICATE
配置为platform
,即对应原理中的四个默认类型中的system应用类型
方式二:
打好未签名的apk包,通过命令方式,对应用进行签名。
java -jar signapk.jar platform.x509.pem platform.pk8 unsigned.apk signed.apk
把你对apk名和路径,替换unsigned.apk
,signed.ap