1. 程式人生 > >[Android]AndroidManifest.xml之permission淺談

[Android]AndroidManifest.xml之permission淺談

概述

昨天群友在群裡丟了一個日誌資訊,說Jpush的服務初始化異常,我就幫忙下了個Demo集成了下。發現是自定義使用者許可權的出錯了。下面獻上我的分析。

09-05 21:22:45.279: D/JPush(21334): [PushService] Action: init PushService
09-05 21:22:45.279: D/JPush(21334): [AndroidUtil] action:checkValidManifest
09-05 21:22:54.289: E/JPush(21334): [AndroidUtil] The permission should be defined - com
.machinebook.customer.permission.JPUSH_MESSAGE 09-05 21:22:54.293: W/JPush(21334): [PushService] JPush running checked failed! 09-05 21:22:54.308: D/JPush(21334): [PushService] onStartCommand - intent:Intent { act=cn.jpush.android.intent.REPORT cmp=com.machinebook.customer/cn.jpush.android.service.PushService
(has extras) }, pkg:com.machinebook.customer, connection:0 09-05 21:22:54.308: D/JPush(21334): [PushService] onStartCommand - not valid JPush running - Should not be here. 09-05 21:22:54.308: D/JPush(21334): [PushService] onStartCommand - intent:Intent { act=cn.jpush.android.intent.INIT cmp=com.machinebook.customer
/cn.jpush.android.service.PushService (has extras) }, pkg:com.machinebook.customer, connection:0 09-05 21:22:54.308: D/JPush(21334): [PushService] onStartCommand - not valid JPush running - Should not be here.

上面的日誌可以看見,我初始化失敗了。搜尋JPUSH Android常見問題說我沒有沒有正確的定義permision,請新增許可權。檢視後發現我下面沒有新增這行許可權。

    <!-- 自定義許可權 -->
    <permission
        android:name="com.machinebook.customer.permission.JPUSH_MESSAGE"
        android:protectionLevel="signature" />

    <!--使用者許可權請求-->
    <uses-permission android:name="com.machinebook.customer.permission.JPUSH_MESSAGE" />

許可權

許可權是一種限制,用於限制對部分程式碼或裝置上資料的訪問。 施加限制是為了保護可能被誤用以致破壞或損害使用者體驗的關鍵資料和程式碼。

每種許可權均由一個唯一的標籤標識。標籤通常指示受限制的操作。 例如,以下是由 Android 定義的一些許可權:

android.permission.CALL_EMERGENCY_NUMBERS 
android.permission.READ_OWNER_DATA 
android.permission.SET_WALLPAPER 
android.permission.DEVICE_POWER

一個功能最多隻能由一種許可權保護。

如果應用需要訪問受許可權保護的功能,則必須在清單檔案中使用 元素宣告應用需要該許可權。 但是,將應用安裝到裝置上之後,安裝程式會通過檢查簽署應用證書的頒發機構並(在某些情況下)詢問使用者,確定是否授予請求的許可權。 如果授予許可權,則應用能夠使用受保護的功能。 否則,其訪問這些功能的嘗試將會失敗,並且不會向用戶傳送任何通知。

此外,應用也可以使用許可權保護自己的元件(Activity、服務、廣播接收器和內容提供程式)。 它可以採用由 Android 定義(如 android.Manifest.permission 中所列)或由其他應用宣告的任何許可權。或者,它也可以定義自己的許可權。新許可權用 元素來宣告。 例如,Activity 可受到如下保護:

<manifest . . . >
    <permission android:name="com.example.project.DEBIT_ACCT" . . . />
    <uses-permission android:name="com.example.project.DEBIT_ACCT" />
    . . .
    <application . . .>
        <activity android:name="com.example.project.FreneticActivity"
                  android:permission="com.example.project.DEBIT_ACCT"
                  . . . >
            . . .
        </activity>
    </application>
</manifest>

請注意,在此示例中,DEBIT_ACCT 許可權不僅是通過 元素來宣告,而且其使用也是通過 元素來請求。要讓應用的其他元件也能夠啟動受保護的 Activity,就必須請求其使用許可權,即便保護是由應用本身施加的亦如此。

同樣還是在此示例中,如果將 permission 屬性設定為在其他位置(例如,android.permission.CALL_EMERGENCY_NUMBERS)宣告的許可權,則無需使用 元素再次宣告。 但是,仍有必要通過 請求使用它。

一個許可權隱含的潛在風險,並指示決定是否准予許可請求它的應用程式時,系統應遵循的程式,Standard permissions有一個預定義的和永久的ProtectionLevel。如果您在應用程式中建立自定義許可權,您可以定義下面列出的值之一的ProtectionLevel屬性。如果沒有的ProtectionLevel為自定義許可權定義,系統分配的預設(“正常”)。

Android protectionLevel分4個級別:

“normal”
“dangerous”
“signature”
“signatureOrSystem”

image

  • 如果定義的是前面兩種normal或者dangerous, 我們自己的應用需要去訪問其對應受保護的資源時只需要在androidManifest.xml中新增相同的uses-permission就行了
  • 如果是signature, 我們僅僅新增對許可權的使用還不行, 必須同時具有相同的簽名。
  • 如果是signatureOrSystem(這種許可權的應用第三方的應用無法單獨訪問), 不僅要有相同的簽名,而且簽名必須是系統簽名,此外可能還需要android : sharedUserId=”android.uid.system”。

深入原始碼

系統定義許可權主要來自於兩處:
- framework/base/core/res/AndroidManifest.xml
檢視原始碼

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="android" coreApp="true" android:sharedUserId="android.uid.system"
    android:sharedUserLabel="@string/android_system_label">
    <!-- ================================================ -->
    <!-- Special broadcasts that only the system can send -->
    <!-- ================================================ -->
    <eat-comment />
    <protected-broadcast android:name="android.intent.action.SCREEN_OFF" />
    <protected-broadcast android:name="android.intent.action.SCREEN_ON" />
    <protected-broadcast android:name="android.intent.action.USER_PRESENT" />
    <protected-broadcast android:name="android.intent.action.TIME_SET" />
    <protected-broadcast android:name="android.intent.action.TIME_TICK" />
    <protected-broadcast android:name="android.intent.action.TIMEZONE_CHANGED" />
    <protected-broadcast android:name="android.intent.action.DATE_CHANGED" />
    <protected-broadcast android:name="android.intent.action.BOOT_COMPLETED" />
    <protected-broadcast android:name="android.intent.action.PACKAGE_INSTALL" />
    <protected-broadcast android:name="android.intent.action.PACKAGE_ADDED" />
    <protected-broadcast android:name="android.intent.action.PACKAGE_REPLACED" />
    <protected-broadcast android:name="android.intent.action.MY_PACKAGE_REPLACED" />
    <protected-broadcast android:name="android.intent.action.PACKAGE_REMOVED" />
    <protected-broadcast android:name="android.intent.action.PACKAGE_FULLY_REMOVED" />
....
  • framework/base/data/etc/platform.xml

靜態讀取

在6.0以前,APP在第一次安裝的時候,就會讀取我們的配置清單檔案,告知使用者APP獲取的許可權。這時候我們就可以選擇是否全部授權了。

動態讀取

6.0以後,系統原始碼加入了動態讀取許可權,也就是說,當某個功能使用到的時候,在去彈窗提示使用者。大大的加入了靈活性和安全性。

這裡說的比較簡單,有興趣的可以自行搜尋下其他文章。

思維拓展:

有興趣的還可以研究一下幾個問題。
為什麼Jpush要自定義許可權,對應用有什麼好處?

從上面的API來看,當第三方要讀取我們的資料時候,如果設定signature,那麼可以提高對我們自己應用資料的保護。如果是這樣我們平常來做應用的時候,如果想提高APP資料的安全,是不是相應的也可以構造自己的許可權加以利用。

  1. App安裝流程,如何從原始碼的角度分析,系統怎麼讀取manifest檔案?
  2. 6.0的動態申請許可權,如何做適配?

剩下的兩個問題都是大坑,今天不談了,有興趣的可以自行深究下。

參考文件

相關推薦

[Android]AndroidManifest.xmlpermission

概述 昨天群友在群裡丟了一個日誌資訊,說Jpush的服務初始化異常,我就幫忙下了個Demo集成了下。發現是自定義使用者許可權的出錯了。下面獻上我的分析。 09-05 21:22:45.279: D/JPush(21334): [PushService]

Android 安全(一)》AndroidManifest.xmlallowBackup屬性

前言 " android:allowBackup"是一個是否允許備份系統和使用者資料的屬性。 當這個標誌被設定為true時應用程式資料可以在手機未獲取 ROOT 的情況下通過adb除錯工具來備份和恢復。 案例分析 從應用商城裡下載一個“密碼本”之類的應用。 1. 使用An

工具系列郵件--工具怎樣改變你的工作效率

ear 驅動 tracking 有一個 develop prop 第一次 ren 關聯 關於提高個人工作效率有非常多方法。如計劃工作、時間意識。集中精力、避免並行;

Java學習final

重寫 四種方法 變量 無法 設計 三種 fin 改變 img final的意思就是“這個值不能變”。 Final修飾變量時: final的變量可以直接賦值; 可以先聲明,後賦值; 也可以指向一個引用,但是一旦指向一個引用後則不能更改到其他的引用。 用來修飾數據,包括成員

51CTO微職位一次通過PMP經驗

基本 屬於 真題 培訓 ppt 做的 完全 重要性 提交 參加工作已有十余年,期間做過IDC數據中心運維,WEB產品研發,做過前端、框架和方案設計,做過IT類開發、實施、系統集成以及地產智能化建設等大小項目幾十個,隨著年齡增長,轉到技術支持和運維管理,工作重心也逐步轉向項目

Lyndon的量化修煉路——趨勢指標取參方法

//文章內容為中州期貨上海分公司所有 //期市妖風大,小心被刮飛。本文不構成任何實質性建議,也不對任何依此進行的交易結果負責 目前市場多許多投資者仍然依託趨勢指標作為交易參考,其中,指標計算過程中給定的引數對交易結果具有相當大的影響,恰當的引數可以讓本來可謂之

android AndroidManifest.xml檔案中怎樣設定訪問網路的許可權

Android訪問網路的許可權是android.permission.INTERNET。 宣告許可權的方式:開啟 AndroidManifest.xml檔案在application節點之前增加 <uses-permission android:na

Android-AndroidManifest.xml預設啟動的Activity(探索篇01)

AndroidManifest.xml-->預設啟動  MusicBrowserActivity      <activity android:name=".MusicBrowserActivity" android:theme="@

HadoopHDFS---DN、NN、SNN

Hadoop淺談         在瞭解HDFS之前必須介紹一下hadoop以及hadoop和HDFS之前的關係:Hadoop是一個由Apache基金會所開發的分散式系統基礎架構。使用者可以在不瞭解分散式底層細節的情況下,開發分散式程式。充分利用叢集的威力進行高速運算和儲存

iOS開發Warning

Warning 對於一個coding有潔癖的人來說,warning在他們眼中和error沒什麼區別,就像是一口痰卡在喉嚨中,吐不出來,咽不下去,甚是難受。 我雖然不是一個“處女座”特性的人,但是在專案上線之前,還是要儘量保證 0 bug,0 error和 0 warning

Android AndroidManifest.xml檔案的android:supportsRtl屬性詳解

Android Studio新建工程的AndroidManifest檔案裡會有一個supportsRtl屬性,並且預設是true,那這個屬性到底有什麼用呢,顧名思義就是“支援RTL”,那RTL又是神馬鬼

[珠璣櫝]程式碼正確性:迴圈不變式、斷言、debug

  這個主題和程式碼的實際寫作有關,而且內容和用法相互交織,以下只是對於其內容的一個劃分。《程式設計珠璣》上只用了兩個章節20頁左右的篇幅介紹,如果希望能獲得更多的例項和技巧,我比較推崇《程式設計實踐》 (Practise of Programming)、《程式設計精粹:編寫高質量C語言程式碼》(Writin

ASP.NET旅--Asp.net的執行機制(二)

      上節中我們從Http請求在Asp.net中的執行過程進行了分析,但是對於真正核心的東西我們並沒有說明,那接下來我們將問題上拋,從底層類和物件的建立層面上來看Asp.net的執行機制。 三、Asp.net底層執行機制    1、理解HTTP.SYS      

Unity與Android——Androidmanifest.xml檔案的介紹

說明: 在Unity開發移動平臺相關應用程式時,難免會涉及到一些必要的外掛(如:社會化分享外掛ShareSDK、Umeng;增強現實開發Vufoia;掃描二維碼外掛等一些列),每一種外掛分開使用時特別好用,無需特殊配置,使用Example案例就能快速上手使用。然後,當有時同

【架構篇】Android移動app架構設計

前言 架構,又名軟體架構,是有關軟體整體結構與元件的抽象描述,用於指導大型軟體系統各個方面的設計。 軟體架構設計目標: 1.可靠性(Reliable)。軟體架構的可靠是產品設計的前提。 2.安全性(Secure)。軟體架構的安全性是

android回撥機制的

之前在其他語言看到函式指標的時候整個人都大為驚豔,怎麼可以這麼簡單.把方法作為一個引數傳遞到另一個方法然後在處理完邏輯之後直接呼叫這個方法來形成回撥。而可惜我大java竟然不支援。 又是一句how to play。 沒有函式指標沒關係,我們引入callbac

HttpURLConnection方法setRequestProperty()

【問題】關於從網上下載一個檔案分多個執行緒同時下載。主要使用到HttpURLConnection物件的setRequestProperty(String key,String value);方法簡單說一下如何使用,setRequestProperty()方法嚴格上講是Http

eBay API時間

       常用US eBayAPI的開發者 ,應該會經常用SOAP去請求API。        在請求API時,免不了帶入時間,比如TradingAPI中的GetItemTransactions。在取item一定時間段內的transaction時,我們會帶入ModTimeFrom和ModTimTo。

WEB安全Token

Token,就是令牌,最大的特點就是隨機性,不可預測。一般黑客或軟體無法猜測出來。 那麼,Token有什麼作用?又是什麼原理呢? Token一般用在兩個地方——防止表單重複提交、anti csrf攻擊(跨站點請求偽造)。 兩者在原理上都是通過session token

android (八)Binder

 本文主要內容的:        Java層Binder結構,Java層Binder呼叫的資訊流,Native層Binder的框架結構,Native層Binder呼叫資訊流向。      在這裡寫下對binder的理解,說到Binder間程序通訊,Linux那麼多程序間通