一、现在我想做个系统级的app, 需要有android.permission.WRITE_SECURE_SETTINGS,AndroidManifest.xml里面添加android:sharedUserId="android.uid.system",app的源码我是放在系统源码的packages/app/下面编译的,把编译出来的文件push到机子system/app/下面,开机后无法安装,提示
Failed to scan /system/app/InstallApkDemo: Signature mismatch for shared user: SharedUserSetting{d6c8eba android.uid.system/1000}
二、无法安装提示log,原因是在android 6.0及以后,WRITE_SETTINGS权限的保护等级已经由原来的dangerous升级为signature,这意味着我们的APP需要用系统签名或者成为系统预装软件才能够申请此权限。
三、解决方案是Android.mk 添加 LOCAL_CERTIFICATE := platform ,使用platform来签名,这样的话这个apk就拥有了和system相同的签名,因为系统级别的签名也是使用的platform来签名,此时使用android:sharedUserId="android.uid.system"才有用!参数platform意思为系统签名,编译出来的APK所在进程的UID为system。
四、测试ok,该系统app可以写settings数据库里面的值了。
五、应用程序的Android.mk中有一个LOCAL_CERTIFICATE字段,由它指定用哪个key签名,未指定的默认用testkey.
1、testkey:普通APK,默认情况下使用。
2、platform:该APK完成一些系统的核心功能。经过对系统中存在的文件夹的访问测试,这种方式编译出来的APK所在进程的UID为system。
3、shared:该APK需要和home/contacts进程共享数据。
4、media:该APK是media/download系统中的一环。
六、参考文章