kowala's home

kowala's home
這裡是我的學習筆記,陸續增加中。
http://kowala21.blogspot.com

2013-06-17

Android 檔案權限

有時,我們想要修改手機的開機畫面,開機音樂,或是字型,都需要用到檔案,這時就有必要去了解一下它的結構了。本文就是間單的來說明一下 Android 檔案權限。

Android 是架構在 Linux 之上,使用 java 去實作的系統,所以它的檔案系統就是 linux 的檔案系統,要更動就必須要有最高權限 root,所以彷間才會有很多破解 root 的手機,這些原因都是根源於此,如果我們想要修改我們的手機,把廠商植入的一些莫明其妙的服務拿掉,就需要來了解一下 Android 的檔案權限。

先來看看系統 apk 都在哪

# cd system/app
cd system/app
# ls -l
ls -l
-rw-r--r-- root     root       120554 2012-12-20 10:28 CalendarProvider.apk
-rw-r--r-- root     root       761891 2012-12-20 10:24 Email.apk
-rw-r--r-- root     root        52291 2012-12-20 10:24 MediaProvider.apk
-rw-r--r-- root     root        20544 2012-12-20 10:28 StorageMgr.apk
-rw-r--r-- root     root        70488 2012-12-20 10:25 Calculator.apk
-rw-r--r-- root     root         5475 2012-12-20 10:24 ScrCapService.apk
-rw-r--r-- root     root        34586 2012-12-20 10:24 HomeLocation.apk
-rw-r--r-- root     root       115089 2012-12-20 10:29 SystemUpdate.apk
...

就放在  /system/app 之中,各位可以看到,擁有者是 root,如果您想刪掉某個廠商植入的東東,那就進到這裡後,下個移除指令即可。

# rm DeviceRegister.apk
rm DeviceRegister.apk

當然,您必須先取得 root 權限。

開始我們的主題,檔案權限

我們可以看到,每個檔案前面都有 -rw-r--r-- root     root  ....
-rw-r--r-- 是檔案型態(File Type)+3組權限(rwx)組合,擁有人、群組、其他
第一個位元是 File Type,- 代表是檔案
d 是目錄;
- 是檔案;
l 為連結檔 (link file);
b 表示為裝置檔裡面的可供儲存的周邊設備,例如硬碟;
c 表示為裝置檔裡面的序列埠設備,例如鍵盤、滑鼠。

接著是3組權限(rwx)組合

r 代表可讀
w 代表可寫
x 代表可執行
- 代表無權限

上例中
第一組是 rw- ,代表擁有人權限是讀+寫+不可執行
第二組是 r-- ,代表群組權限是讀+不可寫+不可執行
第三組是 r-- ,代表其他權限是讀+不可寫+不可執行

rw-r--r-- 對應數值為 644, 如下表所示
 r w x
-----------
 0 0 0 = 0
 0 0 1 = 1
 0 1 0 = 2
 0 1 1 = 3
 1 0 0 = 4
 1 0 1 = 5
 1 1 0 = 6
 1 1 1 = 7

由右向左,第一個x是2^0,第二個w是2^1,第三個r是2^2
所以,對應值就是 r=4,w=2,x=1
然後看有什麼權限,就把它加起來就是權限值了。

如 755 = 111 101 101 = rwx r-x r-x

同理 sdcard 的權限是 rwxrwxrwx = 111 111 111 = 777
/system 的權限是 rwxr-xr-x = 111 101 101 = 755
/system/media 的權限是 rwxr-xr-x = 111 101 101 = 755
開機畫面 bootanimation.zip 的權限是 rw-r--r-- = 110 100 100 = 644

# ls -l /system/media
ls -l /system/media
-rw-r--r-- root     root       843308 2012-12-17 12:35 boot.wav < 開機音樂
-rw-r--r-- root     root       543788 2012-12-17 12:35 shutdown.wav  < 關機音樂
drwxr-xr-x root     root              2013-06-16 21:06 audio
-rw-r--r-- root     root       415635 2012-12-17 12:35 shutdownanimation.zip < 關機動畫
-rw-rw-rw- root     root      4995540 2013-06-17 01:10 bootanimation.zip < 開機動畫

bootanimation.zip 格式

在裡頭有一個檔 desc.txt是用來設定撥放的一些參數
以我的為例

320 480 30
p 1 0 part0
p 0 0 part1

圖片是 320*480 每秒 30 幅
第一回合 播放1次 間隔0幅 圖檔目錄part0
第二回合 播放無限次 間隔0幅 圖檔目錄part1

請注意:bootanimation.zip 千萬不要壓縮



參考資料
http://linux.vbird.org/linux_basic/0410accountmanager.php
http://www.cyut.edu.tw/~dywang/linuxSystem/node26.html
http://web.nchu.edu.tw/~jlu/cyut/android/animation.shtml

2013-05-26

BCB6 字串處理

BCB 本身提供一種字串形態 UnicodeString 很好用,也很容易轉型到其它型態,如 string, char... 等等,但本篇是要介紹古老的 std::string 用法,主要是用在函式間傳遞,理由是。。。我用習慣了 = =

以下分為兩個部分,第一是如何把字串傳址進去函式,然後函式幫您處理好,也不用還您,您就可以直接使用。
第二部分則是再進階,假如一個字串不夠用,那我就傳回一個字串陣列,這樣就夠酷吧,也許您可以再修改一下,就可以傳回自定義的結構資料。

先來看看結果,我只截取 API 上的 Memo 畫面,雖然有點醜,但不影響閱讀及程式的正確性。


第一部分、如何把字串傳址進去函式


第二部分、傳回一個字串陣列


最後,我還是把程式碼放在下面,方便複製使用。當然,Memo1 就是 BCB6 提供的文字集物件,這我就不說明了。

呼叫部分
//------------------------------------
    //測試字串傳址
    string str1;
    strTest1(str1);//傳址
    Memo1->Lines->Add(str1.c_str());

    //測試傳回字串陣列
    string *str2;//字串陣列
    str2=strTest2();//測試傳回字串陣列
    Memo1->Lines->Add(str2[0].c_str());
    Memo1->Lines->Add(str2[1].c_str());
    Memo1->Lines->Add(str2[2].c_str());
//-------------------------------------

函式部分
//--------------------------------------------------------------------
//測試字串傳址
void strTest1(string &str){
    str="測試字串傳址...";
}
//測試傳回字串陣列
typedef string * strArr;//給陣列傳回用,直接宣告編譯不會過
strArr strTest2(){
    string ss="測試傳回字串陣列...";
    string *str = new string[3];
    str[0]= "0:" ; str[0]+= ss;
    str[1]= "1:" ; str[1]+= "typedef string * strArr;";
    str[2]= "2:" ; str[2]+= "給陣列傳回用,直接宣告編譯不會過.";
    return str;
}
//--------------------------------------------------------------------

結果當然是秀出下面這樣

測試字串傳址...
0:測試傳回字串陣列...
1:typedef string * strArr;
2:給陣列傳回用,直接宣告編譯不會過.