Android编程实现系统重启与关机的方法
作者:炫_愛羊 发布时间:2022-01-09 20:56:49
本文实例讲述了Android编程实现系统重启与关机的方法。分享给大家供大家参考,具体如下:
最近在做个东西,巧合碰到了sharedUserId 的问题,所以收集了一些资料,存存档备份。
安装在设备中的每一个apk文件,Android 给每个 APK 进程分配一个单独的用户空间,其 manifest 中的 userid 就是对应一个 Linux 用户都会被分配到一个属于自己的统一的 Linux 用户 ID,并且为它创建一个沙箱,以防止影响其他应用程序(或者其他应用程序影响它)。
用户 ID 在应用程序安装到设备中时被分配,并且在这个设备中保持它的永久性。
通过 Shared User id 拥有同一个User id的多个APK可以配置成运行在同一个进程中.所以默认就是可以互相访问任意数据. 也可以配置成运行成不同的进程,同时可以访问其他APK的数据目录下的数据库和文件.就像访问本程序的数据一样.
对于一个 APK 来说,如果要使用某个共享 UID 的话,必须做三步:
1、在 Manifest 节点中增加 android:sharedUserId 属性。
2、在 Android.mk 中增加 LOCAL_CERTIFICATE 的定义。
如果增加了上面的属性但没有定义与之对应的 LOCAL_CERTIFICATE 的话,APK是安装不上去的。
提示错误是:
Package com.test.MyTest has no signatures that match those in shared user android.uid.system; ignoring!
也就是说,仅有相同签名和相同 sharedUserID 标签的两个应用程序签名都会被分配相同的用户ID。
例如所有和 media/download 相关的 APK 都使用 android.media 作为 sharedUserId 的话,那么它们必须有相同的签名 media。
3、把 APK 的源码放到 packages/apps/ 目录下,用 mm 进行编译。
举例说明一下。
系统中所有使用android.uid.system作为共享UID的APK,都会首先在manifest节点中增加:
android:sharedUserId="android.uid.system"
然后在 Android.mk 中增加
LOCAL_CERTIFICATE := platform
可以参见Settings等。
系统中所有使用 android.uid.shared 作为共享 UID 的 APK,都会在 manifest 节点中增加
android:sharedUserId="android.uid.shared"
然后在 Android.mk 中增加
LOCAL_CERTIFICATE := shared
可以参见Launcher等
系统中所有使用 android.media 作为共享 UID 的 APK,都会在 manifest 节点中增加
android:sharedUserId="android.media"
然后在 Android.mk 中增加
LOCAL_CERTIFICATE := media
可以参见Gallery等。
另外,应用创建的任何文件都会被赋予应用的用户标识,并且正常情况下不能被其他包访问。
当通过 getSharedPreferences(String,int)、openFileOutput(String、int)或者 openOrCreate Database(String、int、SQLiteDatabase.CursorFactory)
创建一个新文件时,开发者可以同时或分别使用MODE_WORLD_READABLE 和MODE_WORLD_RITEABLE 标志允许其他包读/写此文件。当设置了这些标志后,这个文件仍然属于自己的应用程序,但是它的全局读/写和读/写权限已经设置,所以其他任何应用程序可以看到它。
关于签名:
build/target/product/security 目录中有四组默认签名供 Android.mk 在编译APK使用:
1、testkey: 普通 APK,默认情况下使用。
2、platform:该 APK 完成一些系统的核心功能。经过对系统中存在的文件夹的访问测试,这种方式编译出来的 APK 所在进程的 UID 为 system。
3、shared: 该APK需要和home/contacts进程共享数据。
4、media:该APK是media/download系统中的一环。
应用程序的 Android.mk 中有一个 LOCAL_CERTIFICATE 字段,由它指定用哪个 key 签名,未指定的默认用 testkey
在应用层如何通过代码实现 Android 系统的重启,分享给大家。
这篇文章是在 android 系统开发的基础之上进行实践的,所以如果你是纯粹的 app 开发,可能要让你失望了。
该代码在真机上测试成功,在模拟器上面测试失败。
在 linux 下面,重启 pc,非 root 用户需要执行 sudo reboot,所以在 android 下重启机器也需要一定的权限。
应用程序界面:
1. 新建一个 android 工程 reboot
2. 编写 Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_PACKAGE_NAME := reboot
LOCAL_CERTIFICATE := platform
include $(BUILD_PACKAGE)
# Use the folloing include to make our test apk.
include $(call all-makefiles-under,$(LOCAL_PATH))
具体含义可自行查阅资料。注意:
LOCAL_CERTIFICATE := platform
3. 编写补充 AndroidMenifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="mark.zhang"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="7" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:sharedUserId="android.uid.system" >
<activity
android:label="@string/app_name"
android:name=".RebootActivity" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
注意:
android:sharedUserId="android.uid.system"
4. 编写逻辑代码 RebootActivity.java
package mark.zhang;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class RebootActivity extends Activity {
// 是否显示关机确认的对话框
// false 不显示确认关机的对话框,直接关机
// true 显示确认关机的对话框,让用户选择是否确认关机
public static final boolean showShutdownDialog = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
/**
* 发送广播.
*
* @param view
*/
public void onReboot(View view)
{
Intent reboot = new Intent(Intent.ACTION_REBOOT);
reboot.putExtra("nowait", 1);
reboot.putExtra("interval", 1);
reboot.putExtra("window", 0);
sendBroadcast(reboot);
}
/**
* 启动 Activity.
*
* @param view
*/
public void onShutdown(View view)
{
public void onShutdown(View view)
{
Intent shutdown = new Intent(Intent.ACTION_REQUEST_SHUTDOWN);
shutdown.putExtra(Intent.EXTRA_KEY_CONFIRM, showShutdownDialog);
shutdown.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(shutdown);
}
}
}
注意:
Intent.ACTION_REQUEST_SHUTDOWN
Intent.EXTRA_KEY_CONFIRM
会报错,这是因为该属性是 {@hide} 的。
不要担心放到系统编译就可以了,注意下面的步骤即可。
5. 将整个工程放到 android 源码里面编译
a. 手动复制 reboot 到 src/packages/app 下面
b. mm -j4 开始编译(可以参考 《Android入门之源码开发基础教程》)
如果编译成功,在 /out/target/product/generic/system/app 目录下面,会多一个 reboot.apk 文件。
6. 安装 apk
该 apk 必须放到 system/app 下面,即 adb push reboot.apk /system/app
思考:
关机或者重启,一个是发送广播,一个是启动 Activity。
通过查找相应的 action 或者 string 资源(如关机关键字)就可以找到对应的类。
我们知道,framwork 的 mk 文件、资源文件等都在:
/frameworks/base/core/res、frameworks/base/core/res/res
比如关机的那个 Activity 就是 ShutDownActiviy,其又调用 ShutdownThread.shutdown。
重启的相关的类在 WatchDog.java(定义了相关的量), 其内部类 RebootRequestReceiver 是主要代码。
继续追踪你就会了解整个流程了。
希望本文所述对大家Android程序设计有所帮助。


猜你喜欢
- 前言:mybatisplus 可以说是对mybatis更好的拓展,一些简单的增删改查的操作已经被作者实现,我们只需引用即可。1.数据库建表这
- Executor接口基于以下方法可以完成增,删,改查以及事务处理等操作。事实上,mybatis中的所有数据库操作是通过调用这些方法实现的。p
- 今天学习了Map集合的几种方法,尤其是遍历Map集合感觉尤为重要,所以发出来供大家学习和自己复习以用。众所周知Map集合里存储元素是以键值对
- 0x00 前言在一些比较极端情况下,C3P0链的使用还是挺频繁的。0x01 利用方式利用方式在C3P0中有三种利用方式http baseJN
- 前言标签(Label)控件是最常用的控件,在任何Windows应用程序中都可以中都可以看到标签控件。标签控件用于显示用户不能编辑的文件或图像
- 实现多文件的上传,基于标准的http来实现。1.多文件上传MyUploader类的实现:/** * * 同步上传多个文件 * 基于标准的h
- 问题(1)条件锁是什么?(2)条件锁适用于什么场景?(3)条件锁的await()是在其它线程signal()的时候唤醒的吗?简介条件锁,是指
- 在Java中,线程有5中不同状态,分别是:新建(New)、就绪(Runable)、运行(Running)、阻塞(Blocked)和死亡(De
- 概述从今天开始, 小白我将带大家开启 Jave 数据结构 & 算法的新篇章.循环队列循环队列 (Circular Queue) 是一
- 包括了写入和读取功能. 写入的时候, 如果文件不存在会自动创建. 如果对应的键已经存在, 则自动覆盖它的值. 读取的时候, 如果对应的文件不
- 如何下载并配置JDK 15进入官网下载JDK 15。官网地址:https://www.oracle.com/index.html脚本之家下载
- 前言上一篇讲了普通轮询、加权轮询的两种实现方式,重点讲了平滑加权轮询算法,并在文末留下了悬念:节点出现分配失败时降低有效权重值;成功时提高有
- 前言最近在参与一个银行项目-某银行安防系统-反洗钱需求的开发,银行项目的离不开身份证号码,身份证号码作为我国公民的唯一标识,有这非同寻常的意
- hystrix参数使用方法通过注解@HystrixCommand的commandProperties去配置,如下就是hystrix命令超时时
- 输出为MP4需要用到ffmpeg相关的文件,我打包的库已经带了,去官网找的库可以在这个目录找到:2:添加这些引用:3:两个全局变量://用来
- 一、前言本文主要来介绍一个实际案例就是如何通过这个框架来修改系统的地理位置信息来实现隐藏功能,在如今社交工具的发展特别是微信,他有一个实时位
- 本文实例为大家分享了java代码统计小程序,供大家参考,具体内容如下可以测试每周你的工作量package rexExp;import jav
- 目录 * 仓库的配置1、 下载sonatype Nexus来搭建 * 2 安装nexus服务3、创建 * 仓库4、配置 * 信息中央仓库的配置三个仓
- 前言先简单介绍下我们的使用场景,线上5台Broker节点的kafka承接了所有binlog订阅的数据,用于Flink组件接收数据做数据中台的
- 自微信出现以来取得了很好的成绩,语音对讲的实现更加方便了人与人之间的交流。今天来实践一下微信的语音对讲的录音实现,这个也比较容易实现。在此,