Android应用的开发(基于Android 8)遇到的问题

如何为非系统应用签名,使其成为系统应用?

       问题来源:有些时候,我们需要更高的权限来完成某项需求,比如说,我们的需求是,从网页上获取时间来更新系统时间,这时,需要在AndroidManifest.xml中添加我们需要的权限

<uses-permission android:name="android.permission.SET_TIME"/>
<uses-permission android:name="android.permission.SET_TIME_ZONE"/>

需要修改系统时钟和设置时区的权限,但是这些权限普通应用时拿不到的,这就需要我们将普通app提升为系统app。

Android应用的开发(基于Android 8)遇到的问题

 

 

 

       解决方式:通过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一份出来,修改后在放回去。如下图

 Android应用的开发(基于Android 8)遇到的问题

 

 

按照文件中其他应用的方式,我们也可以这么做

<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,如下图

 Android应用的开发(基于Android 8)遇到的问题

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了。

 Android应用的开发(基于Android 8)遇到的问题

然后通过

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

 Android应用的开发(基于Android 8)遇到的问题

 

 

如何格式化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 属性名  属性值

Android应用的开发(基于Android 8)遇到的问题

上一篇:Android开发环境的搭建(基于windows)


下一篇:tensorflow_keras_预训练模型_Applications接口的使用