目錄
一.保護 Android應用
1.Android 平臺的安全模型
- 爲防止應用 訪問用戶數據 或 屬於其他應用的數據,Android 平臺實現了 內核級安全
- Android 實現了應用簽名,實現了在安裝期間,自動將唯一 Linux用戶ID 和 組ID 分配給所有應用的概念
- Android的安全機制:
- Android內核級安全性
- 每個程序分配一個用戶ID
- 要求對應用進行簽名
- 通過共享實現程序間數據訪問
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權限
- 在啓動活動 或 將結果返回給活動時,發出調用的組件可以設置:
- Intent.FLAG_GRANT_READ_URI_PERMISSION
- Intent.FLAG_GRANT_WRITE_URI_PERMISSION
- 上面兩個權限,允許接收組件訪問特定於此 URI 的數據,即使它沒有訪問內容提供者的權限
二.測試 Android應用
- 測試對於確定以下事項至關重要:
- 應用是否滿足最終用戶的需求
- 應用是否準備好供最終用戶使用
- 是否存在導航問題
- 音頻和視頻質量是否符合要求
- 考慮和測試以下因素:
- 方向改變(橫屏、豎屏)
- 設備配置變化(語言設置)
- 電池壽命
- 對外部資源的依賴(是否需要網絡、地圖、聯繫人信息等)
- 使用Junit 測試應用:
- 測試應用時,會創建 Test 應用,通過 AndroidManifest.xml文件的<instrumentation> 元素,鏈接到原始應用
- Test 應用包括每個測試用例的單獨類,通過擴展 JUnit 的 TestCase類 創建測試用例類
- 最後,通過調用 Assert類 執行斷言
- 測試分類:
- 初始化測試:onCreate() 內執行的代碼
- UI 測試
- 狀態管理測試:應用中的代碼是否正確保存狀態
- 創建測試項目:
- setUp() 方法:構建測試用例時 調用,執行所有初始化任務
- tearDown() 方法:測試後 銷燬測試用例,釋放所有獲取的資源
- 爲應用實現的每個測試用例,都要單獨創建方法,方法名以 test開頭
- 創建測試項目後:
- 添加測試用例構造函數
- 添加 Setup() 方法
- 添加初始化測試
- 添加單元測試
三.部署 Android應用
- 在真正的 Android設備上安裝應用,稱爲部署 Android應用
- Android設備具有不同的 Android版本和硬件配置
- 部署時,應重點關注兼容性,記住硬件和軟件限制,多種屏幕大小
- 發佈應用之前,Android 要求對應用進行 數字簽名
- 準備發佈應用,必須:
- 在實際設備上全面測試創建的應用
- 添加最終用戶許可證協議 (EULA)
- 添加許可證支持
- 在清單文件中指定圖標和標籤
- 關閉日誌記錄/調試並移除數據文件
- 在編譯應用之前,必須:
- 指定應用版本,獲取加密密鑰
- 如果應用使用 MapView,請註冊 Map API 密鑰
- 在編譯應用之後,必須:
- 通過使用加密密鑰爲應用簽名
- 全面測試應用,以檢查它是否按預期運行
- 將應用發佈給移動設備用戶
- 對應用正確簽名,需要使用 私鑰
- 爲應用簽名之後,使用 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)