1. 程式人生 > >Android 系統重啟與關機

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"?>

    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 下面

如果編譯成功,在 /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 系統關機

最近在做個東西,巧合碰到了sharedUserId 的問題,所以收集了一些資料,存存檔備份。 安裝在裝置中的每一個apk檔案,Android 給每個 APK 程序分配一個單獨的使用者空間,其 manifest 中的 userid 就是對應一個 Linux 使用者都會被分配到

【樹莓派】RPi desktop系統關機掛起問題:plymouth-reboot.service

rect red see hat 系統重啟 其他 www. pyse exc 在基於intel平臺安裝的RPi desktop關機或者重啟時,會存在掛起的問題,一直卡著不動。 頁面停留在:plymouth-reboot.service。 經過查詢,可能的解決辦法如下:

Android Crash處理 崩潰後禁止預設崩潰後手動

轉載自:https://juejin.im/post/5a321db5f265da431b6d38ff 伸手黨福利:compile 'com.tuzhenlei:crashhandler:1.0.1' 詳情參見文件和demo:github地址 /**簡單初始化*/ //Cr

Android:如何快速對系統問題進行歸類

當手機發生系統重啟,即導致kernel重啟的異常時,會在手機中的/data/aee_exp目錄下儲存異常重啟的db。工程師可以通過GAT的bug report功能,或者直接通過adb pull,把對應的db從手機中抓回來。進一步,對於異常重啟的型別,需要通過GA

android app在系統繞過USB授權對話方塊,自動獲取USB許可權

最近由於專案需要參考了很多關於不修改android原始碼情況下實現遮蔽USB授權對話方塊的博文,結合自身實踐闡述給出細節的實現過程。當前實現的策略是開發一個android內部服務,用於響應需要使用USB授權的app的申請,app需要在使用USB之前主動申請我們自行開發的授權,

Android如何保證自己的服務被系統kill後又被系統

大家好: 今天是我第一次發表文章,希望大家以後多多支援。     我覺得現在網上Android 的各方面問題都有很多,我想以自己的方式來分享給大家,分享我所學所悟。網上Android基礎方面的東西更是遍地都是,所以我會寫一些Android基礎上深入研究的東西。希望大家一起相

系統

-s span nor letter orm san float import pla shutdown -r now系統重啟

使用虛擬機克隆CentOS 6.9系統網卡報錯問題的解決

才有 讀懂它 成功 使用虛擬機克隆CentOS6.9系統重啟網卡報錯問題的解決1.錯誤信息Bringing up interface eth0: Device eth0 does not seem to be present,delaying initialization.

ovs2.7 在系統後,再次使用時提示數據庫無法連接的問題。

detail 使用 art logs 解決方法 操作 分享 bsp mage 問題現象如下,ovs開始安裝後,對ovs的操作是正常的,但是,現在系統重啟後,OVS的操作第一條命令就失敗,如下: 問題解決方法: 參考 http://blog.csdn.net/xyq5

nginx mysql數據庫5.7 系統報錯

mysql 數據庫 系統重啟 前言生活生活奈若何???直接上幹貨!報錯如圖所示:InnoDB: To fix the problem and start mysqld:InnoDB: 1) If there is a permission problem in the file and mysql

linux關機指令

xwindow log init 標準 不同 lin com 指令 linu 重啟:reboot 關機下電:第一種 poweroff 第二種 shutdown -h 0 第三種 init 0 拓展:init命令 不同的運行級定義:(參考Red Hat

如何讓Win10在關機或註銷時自動關閉應用程序

文件的 tro 你在 def edit pan efault 修改註冊表 com 在Windows 10中,如果你的電腦上有未保存的文件,那麽當你嘗試重啟、關機或註銷時,Windows會阻止你,以便你完成對文件的保存。如果你在1分鐘之內不執行任何操作,那麽Windows 1

系統後,藍鯨CMDB報404故障

ges pts -s ner ext scripts rate images roc 故障:CMDB無法打開 原因:使用host解析域名,域名服務器無法解析域名 cat /etc/resolv.conf # Generated by NetworkManager name

Android群英傳知識點回顧——第九章:Android系統信息安全機制

class 以及 包名 bug 也有 不同的 ger class文件 訪問權限控制 9.1 Android系統信息獲取 9.1.1 android.os.Build 9.1.2 SystemProperty 9.1.3 Android系統信息實例

設置Django生產環境系統後的自動啟動項

系統默認 查看 usr cal 命令 after get chmod fig 前面,作者已經介紹了把Django部署到生產環境中的主要方法,現在我們來看一下如何設置項目開機啟動。 在把Django項目部署到生產環境中時,我們前面使用安裝包和源碼安裝了Nginx、uwsgi、

vnc server配置、啟動、連接

-s serve amp 裝包 when manager strong 端口 rpm -ivh 目前有兩種比較流行的方式:XDM(X display manager)方案和VNC方案,而我個人比較傾向於VNC方案,一是因為VNC方案配置起來相對比較容易,二是VNC方案支持多

centos7使用命令關機

安裝GNOME的朋友們首先切換到字元介面: 先登陸進入系統,進入圖形化介面: 然後按Ctrl+Alt+F6(筆記本的是Ctrl+Alt+shift+Fn),進入字元介面 (最小化安裝的直接輸入即可) 關機命令:shutdown或poweroff shutdown:sh

[Android]system_server例子

  system_server出現問題發生的重啟和開機重啟是不一樣的,只是system_server發生了重啟。其他系統程序如init,logd, vold等是沒有變化的。 直觀一點去觀察,可以採用kill -9 <system_server PID>去檢視。  

golang 呼叫win32 api 實現windows登出、關機

package main import ( "flag" "fmt" ) import ( . "github.com/CodyGuo/win" ) var ( arg string ) func init() { flag.StringVar(&arg, "uFlag

Ubuntu系統後DNS配置丟失

方案1 通過/etc/network/interfaces配置 通過向/etc/network/interfaces介面配置檔案追加dns-nameserver和dns-search項來永久儲存配置,儲存完成後執行"sudo service networing restart"重啟網路來