androidfilesystem
⑴ 如何打包安卓手機Zip升級包如何簽名不換Recovery,用官方Recovery
通過分析update.zip包在具體Android系統升級的過程,來理解Android系統中Recovery模式服務的工作原理。
我們先從update.zip包的製作開始,然後是Android系統的啟動模式分析,Recovery工作原理,如何從我們上層開始選擇system update到重啟到Recovery服務,以及在Recovery服務中具體怎樣處理update.zip包升級的,我們的安裝腳本updater-script怎樣被解析並執行的等一系列問題。分析過程中所用的Android源碼是gingerbread0919(tcc88xx開發板標配的),測試開發板是tcc88xx。
一、 update.zip包的目錄結構
|----boot.img
|----system/
|----recovery/
`|----recovery-from-boot.p
`|----etc/
`|----install-recovery.sh
|---META-INF/
`|CERT.RSA
`|CERT.SF
`|MANIFEST.MF
`|----com/
`|----google/
`|----android/
`|----update-binary
`|----updater-script
`|----android/
`|----metadata
二、 update.zip包目錄結構詳解
以上是我們用命令make otapackage 製作的update.zip包的標准目錄結構。
1、boot.img是更新boot分區所需要的文件。這個boot.img主要包括kernel+ramdisk。
2、system/目錄的內容在升級後會放在系統的system分區。主要用來更新系統的一些應用或則應用會用到的一些庫等等。可以將Android源碼編譯out/target/proct/tcc8800/system/中的所有文件拷貝到這個目錄來代替。
3、recovery/目錄中的recovery-from-boot.p是boot.img和recovery.img的補丁(patch),主要用來更新recovery分區,其中etc/目錄下的install-recovery.sh是更新腳本。
4、update-binary是一個二進制文件,相當於一個腳本解釋器,能夠識別updater-script中描述的操作。該文件在Android源碼編譯後out/target/proct/tcc8800/system bin/updater生成,可將updater重命名為update-binary得到。
該文件在具體的更新包中的名字由源碼中bootable/recovery/install.c中的宏ASSUMED_UPDATE_BINARY_NAME的值而定。
5、updater-script:此文件是一個腳本文件,具體描述了更新過程。我們可以根據具體情況編寫該腳本來適應我們的具體需求。該文件的命名由源碼中bootable/recovery/updater/updater.c文件中的宏SCRIPT_NAME的值而定。
6、 metadata文件是描述設備信息及環境變數的元數據。主要包括一些編譯選項,簽名公鑰,時間戳以及設備型號等。
7、我們還可以在包中添加userdata目錄,來更新系統中的用戶數據部分。這部分內容在更新後會存放在系統的/data目錄下。
8、update.zip包的簽名:update.zip更新包在製作完成後需要對其簽名,否則在升級時會出現認證失敗的錯誤提示。而且簽名要使用和目標板一致的加密公鑰。加密公鑰及加密需要的三個文件在Android源碼編譯後生成的具體路徑為:
out/host/linux-x86/framework/signapk.jar
build/target/proct/security/testkey.x509.pem
build/target/proct/security/testkey.pk8 。
我們用命令make otapackage製作生成的update.zip包是已簽過名的,如果自己做update.zip包時必須手動對其簽名。
具體的加密方法:$ java –jar gingerbread/out/host/linux/framework/signapk.jar –w gingerbread/build/target/proct/security/testkey.x509.pem gingerbread/build/target/proct/security/testkey.pk8 update.zip update_signed.zip
以上命令在update.zip包所在的路徑下執行,其中signapk.jar testkey.x509.pem以及testkey.pk8文件的引用使用絕對路徑。update.zip 是我們已經打好的包,update_signed.zip包是命令執行完生成的已經簽過名的包。
9、MANIFEST.MF:這個manifest文件定義了與包的組成結構相關的數據。類似Android應用的mainfest.xml文件。
10、CERT.RSA:與簽名文件相關聯的簽名程序塊文件,它存儲了用於簽名JAR文件的公共簽名。
11、CERT.SF:這是JAR文件的簽名文件,其中前綴CERT代表簽名者。
另外,在具體升級時,對update.zip包檢查時大致會分三步:①檢驗SF文件與RSA文件是否匹配。②檢驗MANIFEST.MF與簽名文件中的digest是否一致。③檢驗包中的文件與MANIFEST中所描述的是否一致。
三、 Android升級包update.zip的生成過程分析
1) 對於update.zip包的製作有兩種方式,即手動製作和命令生成。
第一種手動製作:即按照update.zip的目錄結構手動創建我們需要的目錄。然後將對應的文件拷貝到相應的目錄下,比如我們向系統中新加一個應用程序。可以將新增的應用拷貝到我們新建的update/system/app/下(system目錄是事先拷貝編譯源碼後生成的system目錄),打包並簽名後,拷貝到SD卡就可以使用了。這種方式在實際的tcc8800開發板中未測試成功。簽名部分未通過,可能與具體的開發板相關。
第二種製作方式:命令製作。Android源碼系統中為我們提供了製作update.zip刷機包的命令,即make otapackage。該命令在編譯源碼完成後並在源碼根目錄下執行。 具體操作方式:在源碼根目錄下執行
①$ . build/envsetup.sh。
②$ lunch 然後選擇你需要的配置(如17)。
③$ make otapackage。
在編譯完源碼後最好再執行一遍上面的①、②步防止執行③時出現未找到對應規則的錯誤提示。命令執行完成後生成的升級包所在位置在out/target/proct/full_tcc8800_evm_target_files-eng.mumu.20120309.111059.zip將這個包重新命名為update.zip,並拷貝到SD卡中即可使用。
這種方式(即完全升級)在tcc8800開發板中已測試成功。
2) 使用make otapackage命令生成update.zip的過程分析。
在源碼根目錄下執行make otapackage命令生成update.zip包主要分為兩步,第一步是根據Makefile執行編譯生成一個update原包(zip格式)。第二步是運行一個python腳本,並以上一步准備的zip包作為輸入,最終生成我們需要的升級包。下面進一步分析這兩個過程。
第一步:編譯Makefile。對應的Makefile文件所在位置:build/core/Makefile。從該文件的884行(tcc8800,gingerbread0919)開始會生成一個zip包,這個包最後會用來製作OTA package 或者filesystem image。先將這部分的對應的Makefile貼出來如下:
[python] view plainprint?
# -----------------------------------------------------------------
# A zip of the directories that map to the target filesystem.
# This zip can be used to create an OTA package or filesystem image
# as a post-build step.
#
根據上面的Makefile可以分析這個包的生成過程:
首先創建一個root_zip根目錄,並依次在此目錄下創建所需要的如下其他目錄
①創建RECOVERY目錄,並填充該目錄的內容,包括kernel的鏡像和recovery根文件系統的鏡像。此目錄最終用於生成recovery.img。
②創建並填充BOOT目錄。包含kernel和cmdline以及pagesize大小等,該目錄最終用來生成boot.img。
③向SYSTEM目錄填充system image。
④向DATA填充data image。
⑤用於生成OTA package包所需要的額外的內容。主要包括一些bin命令。
⑥創建META目錄並向該目錄下添加一些文本文件,如apkcerts.txt(描述apk文件用到的認證證書),misc_info.txt(描述Flash內存的塊大小以及boot、recovery、system、userdata等分區的大小信息)。
⑦使用保留連接選項壓縮我們在上面獲得的root_zip目錄。
⑧使用fs_config(build/tools/fs_config)配置上面的zip包內所有的系統文件(system/下各目錄、文件)的許可權屬主等信息。fs_config包含了一個頭文件#include「private/android_filesystem_config.h」。在這個頭文件中以硬編碼的方式設定了system目錄下各文件的許可權、屬主。執行完配置後會將配置後的信息以文本方式輸出 到META/filesystem_config.txt中。並再一次zip壓縮成我們最終需要的原始包。
第二步:上面的zip包只是一個編譯過程中生成的原始包。這個原始zip包在實際的編譯過程中有兩個作用,一是用來生成OTA update升級包,二是用來生成系統鏡像。在編譯過程中若生成OTA update升級包時會調用(具體位置在Makefile的1037行到1058行)一個名為ota_from_target_files的python腳本,位置在/build/tools/releasetools/ota_from_target_files。這個腳本的作用是以第一步生成的zip原始包作為輸入,最終生成可用的OTA升級zip包。
二 下面我們分析ota_from_target_files這個python腳本是怎樣生成最終zip包的。先講這個腳本的代碼貼出來如下:
[python] view plainprint?
import sys
if sys.hexversion < 0x02040000:
print >> sys.stderr, "Python 2.4 or newer is required."
sys.exit(1)
主函數main是python的入口函數,我們從main函數開始看,大概看一下main函數(腳本最後)里的流程就能知道腳本的執行過程了。
① 在main函數的開頭,首先將用戶設定的option選項存入OPTIONS變數中,它是一個python中的類。緊接著判斷有沒有額外的腳本,如果有就讀入到OPTIONS變數中。
② 解壓縮輸入的zip包,即我們在上文生成的原始zip包。然後判斷是否用到device-specific extensions(設備擴展)如果用到,隨即讀入到OPTIONS變數中。
③ 判斷是否簽名,然後判斷是否有新內容的增量源,有的話就解壓該增量源包放入一個臨時變數中(source_zip)。自此,所有的准備工作已完畢,隨即會調用該 腳本中最主要的函數WriteFullOTAPackage(input_zip,output_zip)
④ WriteFullOTAPackage函數的處理過程是先獲得腳本的生成器。默認格式是edify。然後獲得metadata元數據,此數據來至於Android的一些環境變數。然後獲得設備配置參數比如api函數的版本。然後判斷是否忽略時間戳。
⑤ WriteFullOTAPackage函數做完准備工作後就開始生成升級用的腳本文件(updater-script)了。生成腳本文件後將上一步獲得的metadata元數據寫入到輸出包out_zip。
⑥至此一個完整的update.zip升級包就生成了。生成位置在:out/target/proct/tcc8800/full_tcc8800_evm-ota-eng.mumu.20120315.155326.zip。將升級包拷貝到SD卡中就可以用來升級了。
四、 Android OTA增量包update.zip的生成
在上面的過程中生成的update.zip升級包是全部系統的升級包。大小有80M多。這對手機用戶來說,用來升級的流量是很大的。而且在實際升級中,我們只希望能夠升級我們改變的那部分內容。這就需要使用增量包來升級。生成增量包的過程也需要上文中提到的ota_from_target_files.py的參與。
下面是製作update.zip增量包的過程。
① 在源碼根目錄下依次執行下列命令
$ . build/envsetup.sh
$ lunch 選擇17
$ make
$ make otapackage
執行上面的命令後會在out/target/proct/tcc8800/下生成我們第一個系統升級包。我們先將其命名為A.zip
② 在源碼中修改我們需要改變的部分,比如修改內核配置,增加新的驅動等等。修改後再一次執行上面的命令。就會生成第二個我們修改後生成的update.zip升級包。將 其命名為B.zip。
③ 在上文中我們看了ota_from_target_files.py腳本的使用幫助,其中選項-i就是用來生成差分增量包的。使用方法是以上面的A.zip 和B.zip包作為輸入,以update.zip包作 為輸出。生成的update.zip就是我們最後需要的增量包。
具體使用方式是:將上述兩個包拷貝到源碼根目錄下,然後執行下面的命令。
$ ./build/tools/releasetools/ota_from_target_files -i A.zip B.zip update.zip。
在執行上述命令時會出現未找到recovery_api_version的錯誤。原因是在執行上面的腳本時如果使用選項i則會調用WriteIncrementalOTAPackage會從A包和B包中的META目錄下搜索misc_info.txt來讀取recovery_api_version的值。但是在執行make otapackage命令時生成的update.zip包中沒有這個目錄更沒有這個文檔。
此時我們就需要使用執行make otapackage生成的原始的zip包。這個包的位置在out/target/proct/tcc8800/obj/PACKAGING/target_files_intermediates/目錄下,它是在用命令make otapackage之後的中間生產物,是最原始的升級包。我們將兩次編譯的生成的包分別重命名為A.zip和B.zip,並拷貝到SD卡根目錄下重復執行上面的命令:
$ ./build/tools/releasetools/ota_form_target_files -i A.zip B.zip update.zip。
在上述命令即將執行完畢時,在device/telechips/common/releasetools.py會調用IncrementalOTA_InstallEnd,在這個函數中讀取包中的RADIO/bootloader.img。
而包中是沒有這個目錄和bootloader.img的。所以執行失敗,未能生成對應的update.zip。可能與我們未修改bootloader(升級firmware)有關。此問題在下一篇博客已經解決。
製作增量包失敗的原因,以及解決方案。
Android系統Recovery工作原理之使用update.zip升級過程分析(二)---update.zip差分包問題的解決
在上一篇末尾提到的生成差分包時出現的問題,現已解決,由於最近比較忙,相隔的時間也比較長,所以單列一個篇幅提示大家。這個問題居然是源碼中的問題,可能你已經製作成功了,不過我的這個問題確實是源碼中的一個問題,不知道是不是一個bug,下文會具體分析!
一、生成OTA增量包失敗的解決方案
在上一篇中末尾使用ota_from_target_files腳本製作update.zip增量包時失敗,我們先將出現的錯誤貼出來。
在執行這個腳本的最後讀取input_zip中RADIO/bootloader.img時出現錯誤,顯示DeviceSpecifiParams這個對象中沒有input_zip屬性。
我們先從腳本中出現錯誤的調用函數中開始查找。出現錯誤的調用地方是在函WriteIncrementalOTAPackage(443行)中的device_specific.IncrementalOTA_InstallEnd(),其位於WriteIncrementalOTAPackage()中的末尾。進一步跟蹤源碼發現,這是一個回調函數,他的具體執行方法位於源碼中/device/telechips/common/releasetools.py腳本中的IncrementalOTA_InstallEnd()函數。下面就分析這個函數的作用。
releasetools.py腳本中的兩個函數FullOTA_InstallEnd()和IncrementalOTA_InstallEnd()的作用都是從輸入包中讀取RADIO/下的bootloader.img文件寫到輸出包中,同時生成安裝bootloader.img時執行腳本的那部分命令。只不過一個是直接將輸入包中的bootloader.img鏡像寫到輸出包中,一個是先比較target_zip和source_zip中的bootloader.img是否不同(使用選項-i生成差分包時),然後將新的鏡像寫入輸出包中。下面先將這個函數(位於/device/telechips/common/releasetools.py)的具體實現貼出來:
我們的實際情況是,在用命令make otapackage時生成的包中是沒有這個RADIO目錄下的bootloader.img鏡像文件(因為這部分更新已被屏蔽掉了)。但是這個函數中對於從包中未讀取到bootloader.img文件的情況是有錯誤處理的,即返回。所以我們要從 出現的實際錯誤中尋找問題的原由。
真正出現錯誤的地方是:
target_bootloader=info.input_zip.read(「RADIO/bootloader.img」)。
出現錯誤的原因是:AttributeError:『DeviceSpecificParams』object has no attribute 『input_zip』,提示我們DeviceSpecificParams對象沒有input_zip這個屬性。
二、updater-script腳本執行流程分析:
先看一下在測試過程中用命令make otapackage生成的升級腳本如下:
[python] view plainprint?
assert(!less_than_int(1331176658, getprop("ro.build.date.utc")));
assert(getprop("ro.proct.device") == "tcc8800" ||
下面分析下這個腳本的執行過程:
①比較時間戳:如果升級包較舊則終止腳本的執行。
②匹配設備信息:如果和當前的設備信息不一致,則停止腳本的執行。
③顯示進度條:如果以上兩步匹配則開始顯示升級進度條。
④格式化system分區並掛載。
⑤提取包中的recovery以及system目錄下的內容到系統的/system下。
⑥為/system/bin/下的命令文件建立符號連接。
⑦設置/system/下目錄以及文件的屬性。
⑧將包中的boot.img提取到/tmp/boot.img。
⑨將/tmp/boot.img鏡像文件寫入到boot分區。
⑩完成後卸載/system。
三、總結
以上的九篇著重分析了Android系統中Recovery模式中的一種,即我們做好的update.zip包在系統更新時所走過的流程。其核心部分就是Recovery服務的工作原理。其他兩種FACTORY RESET、ENCRYPTED FILE SYSTEM ENABLE/DISABLE與OTA INSTALL是相通的。重點是要理解Recovery服務的工作原理。另外詳細分析其升級過程,對於我們在實際升級時,可以根據我們的需要做出相應的修改。
⑵ Android 許可權統計
<uses-permission
android:name="${applicationId}.permission.JPUSH_MESSAGE"
android:protectionLevel="signature" /> 激光推送
<uses-permission android:name="android.permission.INTERNET" /> 網路
<uses-permission android:name="android.permission.CALL_PHONE" /> 打電話
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />存儲
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />存儲
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />這是在sd卡內創建和刪除文件許可權,添加該許可權和
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />允許程序訪問Wi-Fi網路狀態信息
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />獲取網路信息狀態,如當前的網路連接是否有效
<uses-permission android:name="android.permission.READ_PHONE_STATE" />訪問電話狀態氏帶羨
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />允許一個程序訪問CellID或WiFi熱點來獲取粗略的位置
<uses-permission android:name="殲拍android.permission.RESTART_PACKAGES" />允許程序重新啟動其他程序
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />改變WiFi狀態
<uses-permission android:name="android.permission.GET_TASKS" />允許一個程序獲取信息有關當前或最近運行的任務,一個縮略行凳的任務狀態,是否活動等等
<uses-permission android:name="android.permission.RECORD_AUDIO" />允許程序錄制音頻
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />允許程序修改全局音頻設置
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 允許程序開機自動運行
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />屏幕常亮
<uses-permission android:name="android.permission.WRITE_SETTINGS" />讀寫系統設置
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 允許一個程序打開窗口使用 TYPE_SYSTEM_ALERT,顯示在其他所有程序的頂層
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />獲取精確位置
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />訪問定位額外命令
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />改變網路狀態
<uses-permission android:name="android.permission.READ_LOGS" />讀取系統日誌
<uses-permission android:name="android.permission.SET_DEBUG_APP" />設置調試程序
<uses-permission android:name="android.permission.GET_ACCOUNTS" />訪問賬戶Gmail列表
<uses-permission android:name="android.permission.USE_CREDENTIALS" />使用證書
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />管理賬戶
<uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />允許一個應用程序來管理文檔的訪問,通常是一個文檔選擇器部分
<uses-permission android:name="android.permission.REAL_GET_TASKS" />允許一個程序獲取信息有關當前或最近運行的任務,一個縮略的任務狀態,是否活動等等
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />允許程序禁用鍵盤鎖
<uses-permission android:name="android.permission.CAMERA" />請求訪問使用照相設備
<uses-permission android:name="android.permission.FLASHLIGHT" />使用閃光燈
照相設備並自動對焦拍照
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
⑶ Android 6.0 讀寫SD卡許可權問題
Android 6.0 下默認存儲SD卡,使用原生FMRadio生成的文件保存到內部存儲中
【預置條件】插入T卡【操作步驟】設置>存儲設備和USB>選擇SD卡為默認存儲>收音機錄音【實際結果】收音機的錄音文件未保存到T卡【預期結果】收音機的錄音文件保存到T卡【復現概率】10/10
此外,SoundRecorder默認存儲SD卡,生成的文件卻可以保存到SD卡中
1、收音機文件沒有保存到指定的SD卡目錄下,因此可能是文件的路徑不對。
2、進入設置中,切換默認存儲位置,內部存儲或者SD卡,每次切換都會修改系統中某一屬性值。
3、當收音機文件保存的時候,必須要讀取當前系統的默認存儲路徑,然後生成自己的文件路徑。
STEP1、初步解決方案,但沒有生效,引入新問題
對比 SoundRecorder ,根據GIT庫中,之前的同事的修改記錄,找到可能的解決方案,修改如下:
引入新的問題,此時,點擊 Start Recording 會提示內部錯誤。
分析Log發現,由於許可權拒絕,拋出IO異常
01-01 07:35:38.167 7467 7467 W System.err: java.io .IOException: open failed: EACCES (Permission denied)
STEP2、Android M 下SD卡讀寫許可權問題
分析由於許可權問題後,結合Android M new design,開始查找文檔,尋找解決Android M 下SD卡讀寫許可權問題
Android6.0中的運行時請求許可權
後來,試了好幾種方法,但都沒有用,以及報問題「EACCES (Permission denied)」
STEP3、再分析可能是運行時許可權問題
判斷APP運行時許可權如下:
發現此時,FMRadio對於的組許可權如下:
com.android.fmradio Groups: 1013 3002 3003 9997 50010
com.android.soundrecorder Groups: 1015 1023 3003 9997 50105
根據 系統許可權 的定義,有興趣的同學可以去看一下這個文件 system/core/include/private/android_filesystem_config.h
分析這些Gid發現:
1015 為sdcard_rw,1023 為media_rw許可權
因此,得出結論如下
1、首先修改AndroidManifest.xml文件,新增許可權,確保FMRadio應用級的許可權;
2、原生FMRadio使用過程中,會進行運行時的許可權檢查,故FMRadio運行時應該拿到了WRITE_EXTERNAL_STORAGE,以及READ_EXTERNAL_STORAGE許可權,
3、但是由於FMRadio本身不具備「1015,1023」組許可權,這些許可權無效,仍然無法對SD卡進行讀寫操作。
STEP4、最終解決方案
在 STEP1 的修改基礎上,在框架層,許可權對應組中給予FMRadio相應的組許可權,新增修改如下:
frameworks/base/data/etc/platform.xml
重編framework.jar, 將修改後的jar文件push到手機,重啟
此時,再檢查FMRadio對於的組許可權如下:
com.android.fmradio Groups: 1013** 1015 1023** 3002 3003 9997 50010
到此為止,
⑷ 安卓許可權詳細介紹
安卓許可權詳細介紹
開發android程序的時候常常會設計到各種許可權,程序執行需要讀取到安全敏感項必需在androidmanifest.xml中聲明相關許可權請求,各種許可權說明如下:
android.permission.ACCESS_CHECKIN_PROPERTIES
允許讀寫訪問」properties」或弊罩表在checkin資料庫中,改值可以修改上傳( Allows read/write accessto the 「properties」 table in the checkin database, to change valuesthat get uploaded)
android.permission.ACCESS_COARSE_LOCATION
允許一個程序訪問CellID或WiFi熱點來獲取粗略的位置(Allows an application to accesscoarse (e.g., Cell-ID, WiFi) location)
android.permission.ACCESS_FINE_LOCATION
允許一個程序訪問精良位置(如GPS) (Allows an application to access fine (e.g.,GPS) location)
android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
允許應用程序訪問額外的位置提供命令(Allowsan application to access extra location provider commands)
android.permission.ACCESS_MOCK_LOCATION
允許程序創建模擬位置提供用於測試(Allows an application to create mock locationproviders for testing)
android.permission.ACCESS_NETWORK_STATE
允許程序訪問有關GSM網路信息(Allowsapplications to access information about networks)
android.permission.ACCESS_SURFACE_FLINGER
允許程序使用SurfaceFlinger底層特性(Allows an application to useSurfaceFlinger』s low level features)
android.permission.ACCESS_WIFI_STATE
允許程序訪問Wi-Fi網路狀態信息(Allows applications to access information aboutWi-Fi networks)
android.permission.ADD_SYSTEM_SERVICE
允許程序發布系統級服務(Allows an application to publish system-levelservices).
android.permission.BATTERY_STATS
允許程序更新手機電池統計信息(Allows an application to update the collectedbattery statistics)
android.permission.BLUETOOTH
允許程序連接到已配衫鬧對的藍牙設備(Allowsapplications to connect to paired bluetooth devices)
android.permission.BLUETOOTH_ADMIN
允許程序發現和配對藍牙設備(Allows applications to discover and pair bluetoothdevices)
android.permission.BRICK
請求能夠禁用設備(非常危險)(Required to be able to disable the device (very*erous!).)
android.permission.BROADCAST_PACKAGE_REMOVED
允許程序廣播一個提示消息在一個應用卜賀程序包已經移除後(Allows an application to broadcast anotification that an application package has been removed)
android.permission.BROADCAST_STICKY
允許一個程序廣播常用intents(Allows an application to broadcast stickyintents)
android.permission.CALL_PHONE
允 許一個程序初始化一個電話撥號不需通過撥號用戶界面需要用戶確認(Allows an application to initiate aphone call without going through the Dialer user interface for theuser to confirm the call being placed.)
android.permission.CALL_PRIVILEGED
允 許一個程序撥打任何號碼,包含緊急號碼無需通過撥號用戶界面需要用戶確認(Allows an application to callany phone number, including emergency numbers, without goingthrough the Dialer user interface for the user to confirm the callbeing placed)
android.permission.CAMERA
請求訪問使用照相設備(Required to be able to access the camera device. )
android.permission.CHANGE_COMPONENT_ENABLED_STATE
允 許一個程序是否改變一個組件或其他的啟用或禁用(Allows an application to change whether anapplication component (other than its own) is enabled or not. )
android.permission.CHANGE_CONFIGURATION
允許一個程序修改當前設置,如本地化(Allows an application to modify the currentconfiguration, such as locale. )
android.permission.CHANGE_NETWORK_STATE
允許程序改變網路連接狀態(Allows applications to change network connectivitystate)
android.permission.CHANGE_WIFI_STATE
允許程序改變Wi-Fi連接狀態(Allows applications to change Wi-Fi connectivitystate)
android.permission.CLEAR_APP_CACHE
允許一個程序清楚緩存從所有安裝的程序在設備中(Allows an application to clear the caches ofall installed applications on the device. )
android.permission.CLEAR_APP_USER_DATA
允許一個程序清除用戶設置(Allows an application to clear user data)
android.permission.CONTROL_LOCATION_UPDATES
允許啟用禁止位置更新提示從無線模塊(Allows enabling/disabling location updatenotifications from the radio. )
android.permission.DELETE_CACHE_FILES
允許程序刪除緩存文件(Allows an application to delete cache files)
android.permission.DELETE_PACKAGES
允許一個程序刪除包(Allows an application to delete packages)
android.permission.DEVICE_POWER
允許訪問底層電源管理(Allows low-level access to power management)
android.permission.DIAGNOSTIC
允許程序RW診斷資源(Allows applications to RW to diagnostic resources. )
android.permission.DISABLE_KEYGUARD
允許程序禁用鍵盤鎖(Allows applications to disable the keyguard )
android.permission.DUMP
允許程序返回狀態抓取信息從系統服務(Allows an application to retrieve state mpinformation from system services.)
android.permission.EXPAND_STATUS_BAR
允許一個程序擴展收縮在狀態欄,android開發網提示應該是一個類似windowsmobile中的托盤程序(Allows an application to expand or collapse thestatus bar. )
android.permission.FACTORY_TEST
作為一個工廠測試程序,運行在root用戶(Run as a manufacturer test application,running as the root user. )
android.permission.FLASHLIGHT
訪問閃光燈,android開發網提示htcDream不包含閃光燈(Allows access to the flashlight )
android.permission.FORCE_BACK
允許程序強行一個後退操作是否在頂層activities(Allows an application to force a BACKoperation on whatever is the top activity. )
android.permission.FOTA_UPDATE
暫時不了解這是做什麼使用的,android開發網分析可能是一個預留許可權.
android.permission.GET_ACCOUNTS
訪問一個帳戶列表在Accounts Service中(Allows access to the list of accounts inthe Accounts Service)
android.permission.GET_PACKAGE_SIZE
允許一個程序獲取任何package佔用空間容量(Allows an application to find out the spaceused by any package. )
android.permission.GET_TASKS
允 許一個程序獲取信息有關當前或最近運行的任務,一個縮略的任務狀態,是否活動等等(Allows an application toget information about the currently or recently running tasks: athumbnail representation of the tasks, what activities are runningin it, etc.)
android.permission.HARDWARE_TEST
允許訪問硬體(Allows access to hardware peripherals. )
android.permission.INJECT_EVENTS
允 許一個程序截獲用戶事件如按鍵、觸摸、軌跡球等等到一個時間流,android 開發網提醒算是hook技術吧(Allows anapplication to inject user events (keys, touch, trackball) into theevent stream and deliver them to ANY window.)
android.permission.INSTALL_PACKAGES
允許一個程序安裝packages(Allows an application to install packages. )
android.permission.INTERNAL_SYSTEM_WINDOW
允許打開窗口使用系統用戶界面(Allows an application to open windows that are foruse by parts of the system user interface. )
android.permission.INTERNET
允許程序打開網路套接字(Allows applications to open network sockets)
android.permission.MANAGE_APP_TOKENS
允 許程序管理(創建、催後、 z- order默認向z軸推移)程序引用在窗口管理器中(Allows an application tomanage (create, destroy, Z-order) application tokens in the windowmanager. )
android.permission.MASTER_CLEAR目前還沒有明確的解釋,android開發網分析可能是清除一切數據,類似硬格機
android.permission.MODIFY_AUDIO_SETTINGS
允許程序修改全局音頻設置(Allows an application to modify global audiosettings)
android.permission.MODIFY_PHONE_STATE
允許修改話機狀態,如電源,人機介面等(Allows modification of the telephony state _power on, mmi, etc. )
android.permission.MOUNT_UNMOUNT_FILESYSTEMS
允許掛載和反掛載文件系統可移動存儲(Allows mounting and unmounting file systems forremovable storage. )
android.permission.PERSISTENT_ACTIVITY
允許一個程序設置他的activities顯示(Allow an application to make its activitiespersistent. )
android.permission.PROCESS_OUTGOING_CALLS
允許程序監視、修改有關播出電話(Allows an application to monitor, modify, or abortoutgoing calls)
android.permission.READ_CALENDAR
允許程序讀取用戶日歷數據(Allows an application to read the user』s calendardata.)
android.permission.READ_CONTACTS
允許程序讀取用戶聯系人數據(Allows an application to read the user』s contactsdata.)
android.permission.READ_FRAME_BUFFER
允許程序屏幕波或和更多常規的訪問幀緩沖數據(Allows an application to take screen shotsand more generally get access to the frame buffer data)
android.permission.READ_INPUT_STATE
允許程序返回當前按鍵狀態(Allows an application to retrieve the current state ofkeys and switches. )
android.permission.READ_LOGS
允許程序讀取底層系統日誌文件(Allows an application to read the low-level systemlog files. )
android.permission.READ_OWNER_DATA
允許程序讀取所有者數據(Allows an application to read the owner』s data)
android.permission.READ_SMS
允許程序讀取簡訊息(Allows an application to read SMS messages.)
android.permission.READ_SYNC_SETTINGS
允許程序讀取同步設置(Allows applications to read the sync settings)
android.permission.READ_SYNC_STATS
允許程序讀取同步狀態(Allows applications to read the sync stats)
android.permission.REBOOT
請求能夠重新啟動設備(Required to be able to reboot the device. )
android.permission.RECEIVE_BOOT_COMPLETED
允 許一個程序接收到 ACTION_BOOT_COMPLETED廣播在系統完成啟動(Allows an application toreceive the ACTION_BOOT_COMPLETED that is broadcast after thesystem finishes booting. )
android.permission.RECEIVE_MMS
允許一個程序監控將收到MMS彩信,記錄或處理(Allows an application to monitor incomingMMS messages, to record or perform processing on them. )
android.permission.RECEIVE_SMS
允許程序監控一個將收到簡訊息,記錄或處理(Allows an application to monitor incoming SMSmessages, to record or perform processing on them.)
android.permission.RECEIVE_WAP_PUSH
允許程序監控將收到WAPPUSH信息(Allows an application to monitor incoming WAP pushmessages. )
android.permission.RECORD_AUDIO
允許程序錄制音頻(Allows an application to record audio)
android.permission.REORDER_TASKS
允許程序改變Z軸排列任務(Allows an application to change the Z-order oftasks)
android.permission.RESTART_PACKAGES
允許程序重新啟動其他程序(Allows an application to restart otherapplications)
android.permission.SEND_SMS
允許程序發送SMS簡訊(Allows an application to send SMS messages)
android.permission.SET_ACTIVITY_WATCHER
允許程序監控或控制activities已經啟動全局系統中Allows an application to watch andcontrol how activities are started globally in the system.
android.permission.SET_ALWAYS_FINISH
允許程序控制是否活動間接完成在處於後台時Allows an application to control whetheractivities are immediately finished when put in the background.
android.permission.SET_ANIMATION_SCALE
修改全局信息比例(Modify the global animation scaling factor.)
android.permission.SET_DEBUG_APP
配置一個程序用於調試(Configure an application for debugging.)
android.permission.SET_ORIENTATION
允許底層訪問設置屏幕方向和實際旋轉(Allows low-level access to setting theorientation (actually rotation) of the screen.)
android.permission.SET_PREFERRED_APPLICATIONS
允 許一個程序修改列表參數PackageManager.addPackageToPreferred()和 PackageManager.removePackageFromPreferred()方法(Allows anapplication to modify the list of preferred applications with thePackageManager.addPackageToPreferred() andPackageManager.removePackageFromPreferred() methods.)
android.permission.SET_PROCESS_FOREGROUND
允
⑸ /bin/bash: xsltproc: 未找到命令 什麼意思 To Build Android Filesystem時出現.(TI-am335x)
應該安卓的環境沒有,或者環境變數沒配好
⑹ Android 的許可權管理是怎麼實現的
根據用戶的使用過程體驗,可以將 Android 涉及的許可權大致分為如下三類:
(1)Android 手機所有者許可權:自用戶購買 Android 手機後,用戶不需要輸入任何密碼,就具有安裝一般應用軟體、使用應用程序等的許可權;
(2)Android root 許可權:該許可權為 Android 系統的最高許可權,可以對所有系統中文件、數據進行任意操作。出廠時默認沒有該許可權,需要使用 z4Root 等軟體進行獲取,然而,並不鼓勵進行此操作,因為可能由此使用戶失去手機原廠保修的權益。同樣,如果將 Android 手機進行 root 許可權提升,則此後用戶不需要輸入任何密碼,都將能以 Android root 許可權來使用手機。
(3)Android 應用程序許可權:Android 提供了豐富的 SDK(Software development kit),開發人員可以根據其開發 Android 中的應用程序。而應用程序對 Android 系統資源的訪問需要有相應的訪問許可權,這個許可權就稱為 Android 應用程序許可權,它在應用程序設計時設定,在 Android 系統中初次安裝時即生效。值得注意的是:如果應用程序設計的許可權大於 Android 手機所有者許可權,則該應用程序無法運行。如:沒有獲取 Android root 許可權的手機無法運行 Root Explorer,因為運行該應用程序需要 Android root 許可權。
Android 系統許可權定義
Android 系統在 /system/core/private/android_filesystem_config.h 頭文件中對 Android 用戶 / 用戶組作了如下定義,且許可權均基於該用戶 / 用戶組設置。
在 Android 系統中,上述用戶 / 用戶組對文件的訪問遵循 Linux 系統的訪問控制原則,即根據長度為 10 個字元的許可權控制符來決定用戶 / 用戶組對文件的訪問許可權。該控制符的格式遵循下列規則:
第 1 個字元:表示一種特殊的文件類型。其中字元可為 d( 表示該文件是一個目錄 )、b( 表示該文件是一個系統設備,使用塊輸入 / 輸出與外界交互,通常為一個磁碟 )、c( 表示該文件是一個系統設備,使用連續的字元輸入 / 輸出與外界交互,如串口和聲音設備 ),「.」表示該文件是一個普通文件,沒有特殊屬性。
2 ~ 4 個字元:用來確定文件的用戶 (user) 許可權;
5 ~ 7 個字元:用來確定文件的組 (group) 許可權;
8 ~ 10 個字元:用來確定文件的其它用戶 (other user,既不是文件所有者,也不是組成員的用戶 ) 的許可權。
第 2、5、8 個字元是用來控制文件的讀許可權的,該位字元為 r 表示允許用戶、組成員或其它人可從該文件中讀取數據。短線「-」則表示不允許該成員讀取數據。
第 3、6、9 位的字元控制文件的寫許可權,該位若為 w 表示允許寫,若為「-」表示不允許寫。
第 4、7、10 位的字元用來控制文件的製造許可權,該位若為 x 表示允許執行,若為「-」表示不允許執行。
舉個例子,「drwxrwxr--2 rootroot40962 月 11 10:36 lu」表示的訪問控制許可權(黑色字體標明)為:因為 lu 的第 1 個位置的字元是 d,所以由此知道 lu 是一個目錄。第 2 至 4 位置上的屬性是 rwx,表示用戶 root 擁有許可權列表顯示 lu 中所有的文件、創建新文件或者刪除 lu 中現有的文件,或者將 lu 作為當前工作目錄。第 5 至 7 個位置上的許可權是 rwx,表示 root 組的成員擁有和 root 一樣的許可權。第 8 至 10 位上的許可權僅是 r--,表示不是 root 的用戶及不屬於 root 組的成員只有對 lu 目錄列表的許可權。這些用戶不能創建或者刪除 lu 中的文件、執行 junk 中的可執行文件,或者將 junk 作為他們的當前工作目錄。
Android 應用程序許可權申請
每個應用程序的 APK 包裡面都包含有一個 AndroidMainifest.xml 文件,該文件除了羅列應用程序運行時庫、運行依賴關系等之外,還會詳細地羅列出該應用程序所需的系統訪問。程序員在進行應用軟體開發時,需要通過設置該文件的 uses-permission 欄位來顯式地向 Android 系統申請訪問許可權。
⑺ android系統怎麼設置內部存儲的訪問許可權
Android支持外部存儲(case-insensitive filesystem with immutable POSIX permission classes and modes)。
外部存儲可以通過物理介質提供(如SD卡),也可以通過將內部存儲中的一部分封裝而成,設備可以有多個外部存儲實例。訪問外部存儲的許可權
從Android 1.0開始,寫操作受許可權WRITE_EXTERNAL_STORAGE保護。
從Android 4.1開始,讀操作受許可權READ_EXTERNAL_STORAGE保護。
從Android 4.4開始,應用可以管理在它外部存儲上的特定包名目錄,而不用獲取WRITE_EXTERNAL_STORAGE許可權。
比如,一個包名為com.example.foo的應用,可以自由訪問外存上的Android/data/com.example.foo/目錄。外部存儲對數據提供的保護較少,所以系統不應該存儲敏感數據在外部存儲上。
特別地,配置和log文件應該存儲在內部存儲中,這樣它們可以被有效地保護。對於多用戶的情況,一般每個用戶都會有自己獨立的外部存儲,應用僅對當前用戶的外部存儲有訪問許可權。Environment API的目錄
getDataDirectory():用戶數據目錄。
getDownloadCacheDirectory():下載緩存內容目錄。getExternalStorageDirectory():主要的外部存儲目錄。
但是這個目錄很可能當前不能訪問,比如這個目錄被用戶的PC掛載,或者從設備中移除,或者其他問題發生,你可以通過getExternalStorageState()來獲取當前狀態。
還有多用戶或者多外部存儲的情況,此文不再討論。為了不污染用戶的根命名空間,一般不會直接使用這個外部存儲的根目錄。
任何應用私有的文件的應該被放置在 Context.getExternalFilesDir返回的目錄下,在應用被卸載的時候,系統會清理的就是這個目錄。
另一些共享文件應該被放置在 (String)返回的目錄中。
寫這個路徑需要 WRITE_EXTERNAL_STORAGE許可權,讀需要 READ_EXTERNAL_STORAGE許可權,當然寫許可權默認包含了讀許可權。從KITKAT 即Android 4.4開始,如果你的應用只是需要存儲一些內部數據,可以考慮使用 :
getExternalFilesDir(String)或者getExternalCacheDir(),它們不需要獲取許可權。(String type)這個方法接收一個參數,表明目錄所放的文件的類型,傳入的參數是Environment類中的DIRECTORY_XXX靜態變數,比如DIRECTORY_DCIM等。
注意:傳入的類型參數不能是null,返回的目錄路徑有可能不存在,所以必須在使用之前確認一下,比如使用File.mkdirs創建該路徑。getRootDirectory()得到Android的根目錄。
isExternalStorageEmulated()設備的外存是否是用內存模擬的,是則返回true。(API Level 11)
isExternalStorageRemovable()設備的外存是否是可以拆卸的,比如SD卡,是則返回true。(API Level 9)Context API中的目錄
getExternalFilesDir(String type)是應用在外部存儲上的目錄。
和Environment類的(String type)方法類似,返回包含參數指定的特定類型文件的子目錄。
getExternalCacheDir()是應用的在外部存儲上的緩存目錄。從Android 4.4這兩個方法不需要讀寫許可權,是針對於本應用來說,如果要訪問其他應用的相關目錄,還是需要聲明讀寫許可權。
Android 4.4之前的版本要訪問的話還是要聲明讀寫許可權的,如果沒有在manifest中寫許可權,上面兩個get方法都會返回null。與上面兩個方法形成對比的是下面兩個方法:
getFilesDir()
getCacheDir()
這兩個方法得到的是內存上的目錄。這些目錄都是屬於應用的,當應用被卸載的時候,裡面的內容都會被移除,但是不要依賴於系統的操作。