Android課堂筆記(十二)——保護、測試、部署 Android應用

目錄

一.保護 Android應用

二.測試 Android應用

三.部署 Android應用


一.保護 Android應用

1.Android 平臺的安全模型

  • 爲防止應用 訪問用戶數據 或 屬於其他應用的數據,Android 平臺實現了 內核級安全
  • Android 實現了應用簽名,實現了在安裝期間,自動將唯一 Linux用戶ID 和 組ID 分配給所有應用的概念
  • Android的安全機制:
  1. Android內核級安全性
  2. 每個程序分配一個用戶ID
  3. 要求對應用進行簽名
  4. 通過共享實現程序間數據訪問

1.1 實現內核級安全性

  • Android操作系統基於Linux內核,Linux 內核通過 將應用相互隔離以及與系統隔離,確保設備安全性
  • Android安全架構包括: Linux 內核(Kernel) + 沙盒(Sandbox)技術
  • 每個應用在安裝時唯一分配一個用戶ID,用於標誌該應用,只有該應用可訪問程序內的私有數據
  • 程序包安裝後,用戶ID不變,同一程序包在不同設備上ID可能不同,不同程序包在同一設備上用戶ID肯定不同
  • Android 安全性模型的優勢有: 保護組件、保護API、訪問控制策略、訪問限制、唯一簽名
  • Android 安全性模型的限制有: 可能無法自定義權限,沒有相應機制使用戶能夠只授予應用特定權限

1.2 應用簽名

  • 首先對應用 簽名,然後才能 發佈 給全世界 Android用戶 使用
  • 所有 Android應用(.apk 文件)都需要:使用證書進行數字簽名
  • 證書可:識別應用作者,並幫助應用間建立信任關係
  • 證書的基本要求:區分應用作者,這允許 Android系統授予 或 拒絕授予應用簽名級權限

1.3 共享用戶訪問

  • <manifest>元素的 android:sharedUserId 屬性:使兩個應用在同一進程中運行,A應用可以訪問B應用數據
<manifest xmlns:android=http://schemas.android.com/apk/res/android package="com.sampleapackage.myapp"
android:sharedUserId="com.sampleapackage.myapp.share"
android:versionName="1.0">

2.權限

  • 權限是:應用級別的安全機制,它允許用戶限制對應用組件的訪問

2.1 系統權限

  • 如果應用需要訪問受限制的資源/組件,它必須在清單文件中使用 <uses-permission> 聲明所需權限,如:
  • <uses-permission android:name="android.permission.INTERNET"> </uses-permission>
  • 查看設備當前定義的權限:adb shell pm list permissions -s
  • android.Manifest包 的 Manifest.permission類 提供的一些 系統權限:
  • ACCESS_NETWORK_STATE:訪問網絡信息狀態
  • ACCESS_WIFI_STATE:訪問 WIFI狀態
  • BLUETOOTH:藍牙
  • BROADCAST_SMS:發送信息廣播接收器
  • CALL_PHONE:撥打電話
  • CAMERA:相機
  • CHANGE_WIFI_STATE:改變 WIFI狀態
  • INSTALL_PACKAGES
  • READ_SMS/RECEIVE_SMS/SEND_SMS
  • SET_ALARM:設置鬧鈴
  • WRITE_CONTACTS
  • WRITE_EXTERNAL_STORAGE
  • WRITE_SMS

2.2 自定義權限

  • A.針對整個應用的權限:
  • 應用定義自己的權限,在清單文件中用: <permission> 
  • 應用使用別的應用自己定義的權限,在清單文件中用:<uses-permission>,name屬性應和別的應用一致
  •  <permission> 標記屬性:

屬性

描述

android:name

權限名稱,任意且唯一,必須寫

android:protectionLevel 

應用面臨的風險級別,通常是 dangerous

android:label

向用戶顯示的權限名稱

android:description

向用戶顯示的權限描述

// APP1 系統配置文件:設置權限
    <!-- 自定義一個權限,用於保護想保護的組件,如活動,服務,內容提供者等 -->
    <!-- 必須給權限的name屬性,其他屬性可選,描述在strings.xml中定義引用-->
    <permission 
        android:name="com.andy.permission.START_MAIN_ACTIVITY"
        android:label="啓動主活動"
        android:logo="@string/hello_world"
        android:description="@string/desc"
        android:protectionLevel="dangerous"
        android:icon="@drawable/ic_launcher">
    </permission>

// APP2 系統配置文件:設置權限 名字必須和 APP1 一致
    <uses-permission android:name="com.andy.permission.START_MAIN_ACTIVITY"/>
  • B.針對單個組件的權限: 
  • 考慮 Android 清單文件中的 <activity>標記  /  <service>標記
  • <activity> /<service> 標記中的 android:permission屬性 限制其他應用 啓動此 活動 / 服務 的能力
  • 調用這些方法:startActivity() 和 startActivityForResult() ,期間將檢查該權限
  • 調用這些方法:startService()、stopService() 和 bindService(),期間將檢查該權限
  • 調用者沒有所需的權限,將拋出 SecurityException異常
  • ==============================================================================
  • 考慮 Android 清單文件中的 <receiver>標記:
  • <receiver> 標記中的 android:permission屬性 限制其他應用發送廣播的能力
  • 調用 sendBroadcast(),試圖發送廣播時,會檢查此權限
  • 調用者沒有所需的權限,不會引發任何異常
  • 想要控制哪些廣播接收器應能夠接收此廣播: sendBroadcast(myIntent, REQUIRED_PERMISSION);
  • ==============================================================================
  • 考慮 Android 清單文件中的 <provider>標記:
  • <provider> 標記中的 android:permission屬性 限制其他應用發送廣播的能力
  • android:readPermission:控制從提供者進行讀取
  • android:writePermission:控制向提供者進行寫入

2.3 URI權限

  • 在啓動活動 或 將結果返回給活動時,發出調用的組件可以設置:
  1. Intent.FLAG_GRANT_READ_URI_PERMISSION
  2. Intent.FLAG_GRANT_WRITE_URI_PERMISSION 
  • 上面兩個權限,允許接收組件訪問特定於此 URI 的數據,即使它沒有訪問內容提供者的權限

二.測試 Android應用

  • 測試對於確定以下事項至關重要:
  1. 應用是否滿足最終用戶的需求
  2.  應用是否準備好供最終用戶使用
  3.  是否存在導航問題
  4. 音頻和視頻質量是否符合要求
  • 考慮和測試以下因素:
  1. 方向改變(橫屏、豎屏)
  2. 設備配置變化(語言設置)
  3. 電池壽命
  4. 對外部資源的依賴(是否需要網絡、地圖、聯繫人信息等)
  • 使用Junit 測試應用:
  1. 測試應用時,會創建 Test 應用,通過 AndroidManifest.xml文件的<instrumentation> 元素,鏈接到原始應用
  2. Test 應用包括每個測試用例的單獨類,通過擴展 JUnit 的 TestCase類 創建測試用例類
  3. 最後,通過調用 Assert類 執行斷言
  • 測試分類:
  1. 初始化測試:onCreate() 內執行的代碼
  2. UI 測試
  3. 狀態管理測試:應用中的代碼是否正確保存狀態
  • 創建測試項目:
  1. setUp() 方法:構建測試用例時 調用,執行所有初始化任務
  2. tearDown() 方法:測試後 銷燬測試用例,釋放所有獲取的資源
  3. 爲應用實現的每個測試用例,都要單獨創建方法,方法名以 test開頭
  • 創建測試項目後:
  1. 添加測試用例構造函數
  2. 添加 Setup() 方法
  3. 添加初始化測試
  4. 添加單元測試

三.部署 Android應用

  • 在真正的 Android設備上安裝應用,稱爲部署 Android應用
  • Android設備具有不同的 Android版本和硬件配置
  • 部署時,應重點關注兼容性,記住硬件和軟件限制,多種屏幕大小
  • 發佈應用之前,Android 要求對應用進行 數字簽名
  • 準備發佈應用,必須:
  1. 在實際設備上全面測試創建的應用
  2. 添加最終用戶許可證協議 (EULA)
  3. 添加許可證支持
  4. 在清單文件中指定圖標和標籤
  5. 關閉日誌記錄/調試並移除數據文件
  • 在編譯應用之前,必須:
  1. 指定應用版本,獲取加密密鑰
  2. 如果應用使用 MapView,請註冊 Map API 密鑰
  • 在編譯應用之後,必須:
  1. 通過使用加密密鑰爲應用簽名
  2. 全面測試應用,以檢查它是否按預期運行
  3. 將應用發佈給移動設備用戶
  • 對應用正確簽名,需要使用 私鑰
  • 爲應用簽名之後,使用 zipalign工具 對齊應用,與 Android SDK 一起存放在 tools 目錄
  • 確保所有未壓縮的數據:從特定的字節對齊方式開始
  • 對齊已簽名的應用:zipalign -v 4 yourprojectname-unaligned.apk yourprojectname.apk
  • 將應用發佈到 Android市場,使用 Google 賬號註冊服務
  • 註冊併發布應用:http://market.android.com/publish
  • 更新應用:必須確保 android:versionCode 和 android:versionName 屬性 已經在清單文件中更新
  • 確保 包的名稱 和 密鑰,與現有版本所用的一致
  • 包名稱與簽名證書不匹配,那麼會被當作新應用,不會通知用戶更新
  • 每個 APK 針對 不同配置的設備,被視作獨立的應用版本,可發佈不同的 APK
  •  Android 設備通用尺寸:大 (640dp x 480dp)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章