如何为非系统应用签名,使其成为系统应用?
问题来源:有些时候,我们需要更高的权限来完成某项需求,比如说,我们的需求是,从网页上获取时间来更新系统时间,这时,需要在AndroidManifest.xml中添加我们需要的权限
<uses-permission android:name="android.permission.SET_TIME"/>
<uses-permission android:name="android.permission.SET_TIME_ZONE"/>
需要修改系统时钟和设置时区的权限,但是这些权限普通应用时拿不到的,这就需要我们将普通app提升为系统app。
解决方式:通过Android studio安装到虚拟机或者实体机中,通过adb shell进入Android的命令行,切换到root用户,执行mount -o rw,remount,rw /system使得/system为可读可写模式,如果执行完命令后没有效果,可以执行如下的指令或重试。
adb root
adb disable-verity
adb reboot
adb remount
adb shell
mount -o rw,remount /system
/system为可读可写后,执行如下指令
mv -f /data/app/包名 /system/app/
reboot
上述步骤做完后,可以在Android系统上查看app的信息,发现app只能停用,无法卸载,说明app已提升为系统应用。
如何卸载系统app或者特权app?看如下指令
pm uninstall -k --user 0 包名
mount -o rw,remount,rw /system
rm -fr /system/app/包名*
如何使非系统应用成为特权应用?
问题的来源:
在提升为系统应用后,依旧没有获取到相应的权限,这是我们将应用提升为特权应用。
解决方法:
1.需要将特权app在AndroidMainfest.xml 中申请的权限,然后添加相应的权限到特许白名单中(frameworks/base/data/etc/privapp-permissions-platform.xml)
在Android系统中有这么一个文件/etc/permissions/privapp-permissions-platform.xml,这个就是上述所说的特许白名单。我们可以将它copy一份出来,修改后在放回去。如下图
按照文件中其他应用的方式,我们也可以这么做
<privapp-permissions package="包名">
<permission name="android.permission.SET_TIME" />
<permission name="android.permission. SET_TIME_ZONE" />
</privapp-permissions>
Ok, 特许白名单白名单就完成了。
2.将我们生成好的app进行签名替换
在Android源码里有这么三个文件platform.x509.pem、platform.pk8、platform.pem可供下载,另外我们还需要signapk.jar,如下图
signapk.bat中的内容如下
@echo off
java -jar "%~dp0\signapk.jar" "%~dp0\platform.x509.pem" "%~dp0\platform.pk8" %1 %2
我们可以编写一个CreateApk.bat的批处理文件,内容如下:
@echo off
signapk.bat app-release.apk 1.apk
之后将生成app-release.apk复制到这个文件夹,双击CreateApk.bat,生成了替换签名的1.apk了。
然后通过
adb install -t 绝对路径\1.apk安装app
mount -o rw,remount,rw /system
mv -f /data/app/包名* /system/priv-app/
mount -o ro,remount,ro /system
reboot
ok,完成。现在我们的应用就是特权app了。
如果安装的应用在启动的时候报错那么,在gradle.properties中加入android.injected.testOnly=false
如何格式化U盘?
可以通过su root newfs_msdos -F 32 -O android -c 8 /dev/block/vold/public:8,0
来格式化U盘设备。
如何在终端中启动app?
am start -m 包名/.Activity类名
如何获取Android系统的property?
getprop
如何设置Android系统的property?
setprop 属性名 属性值