2012年5月28日 星期一

Android應用程序如何訪問/sys和/proc等目錄下的系統文件

http://blog.csdn.net/silvervi/article/details/6315548


Android 下應用程序不能直接 獲得 root 權限,因此如果需要修改 /sys 或 /proc 等目錄下的文件時,有以下兩種方法可以選擇:

  1. 通過 service 或虛擬設備的方法將使得應用程序臨時 獲得 root 權限
  2. 對 /sys 或 /proc 目錄下的文件修改訪問權限,使得它們能夠被程序訪問

對於方法 1 ,可以參看我後續會寫到的一篇文章《如何使 Android 應用程序獲得 root 權限》,也可以在網上搜索別的相關文章。

這裡講講方法 2 。

為了理解方法 2 ,首先要知道 Android 上的權限機制。 Android 會為每個安裝在系統上的包( apk )配一個唯一的 linux userID ,名稱為 "app_" 加一個數字,比如 app_43 。這樣該應用程序的文件只對該用戶可見,也就是說,應用程序只能訪問相同 uid 和 gid 的文件。
另外,也可以通過 AndroidManifest.xml 修改應用程序的 uid 。如果將 android:sharedUserId 項的值改為其它apk 的 java package name ,則該應用程序和所指定的應用程序擁有相同的 uid ,可以訪問對方的文件。
通過 android:sharedUserId 還可以將應用程序提升為 system 權限。

有了上面的知識,這裡有三種方法來修改我們所要訪問的文件:
  1. 將文件改為 777 權限
  2. 將文件改為 apk 的 uid 和 gid
  3. 將文件修改為 system 的 uid ,同時將 apk 也提升為 system 權限

這三種方法都需要修改所要訪問系統文件的權限。要更改權限,在 init.rc 文件中添加相應的命令即可。下述命令就將 /dev/cpuctl/tasks 修改為 system 的 uid 和 gid ,並且將其權限更改為 777 。
chown system system /dev/cpuctl/tasks
chmod 0777 /dev/cpuctl/tasks

修改 init.rc 該文件需要修改 ramdisk.img ,具體修改方法可以網上搜索,也可以參看這篇文章最後的附錄。或者在源代碼中直接修改 init.rc 文件然後編譯即可。

下面依次分析一下上面提到的三種修改訪問文件的方法。第一種方法是最簡單的,不過安全性不好,僅僅可以作為實驗使用,不推薦;第二種方法將系統文件文件的 uid 修改後,拓展性不好,並且我不能確定每次分配給apk 的 uid 是否相同。我這裡試了幾次,重新安裝後 apk 的 uid 都是相同的,不過沒有找到相關文章,所以不敢用。最後我這裡採用第三種方法實現。

1)首先修改 init.rc
chown system system /sys/bus/usb/devices/testfile

這樣每次啟動後,系統都會執行 init.rc 文件將 testfile 的 uid 修改為 system ,這樣 uid 同問 system 的程序就能夠訪問該文件了。

2) 其次將 apk 提升為 system 權限

將 apk 提升為 system 權限需要目標系統中的簽名文件對 apk 進行簽名,因此這種方法僅適用於某個 rom ,不能用於所有 rom 。
具體的提升辦法網上有很多,這裡不再多說,可以參考這兩篇文章:

至此,我們的目標就達成了。

附 修改 ramdisk.img 的方法

在網上找到了一些修改 ramdisk.img 的方法,都有點問題,我這裡寫一下自己的流程。由於 ramdisk.img 是首先用 cpio 打包,再用 gzip 壓縮後的文件,因此在解壓和壓縮時都需要經歷這兩個步驟。

1)    mv ramdisk.img ramdisk.img.gz
2)    gunzip ramdisk.img.gz   #gunzip 解壓得到 ramdisk.gz
3)    cpio –iI ramdisk.gz   # 用 cpio 解壓上一步得到的文件
4)    修改 init.rc
5)    find. | cpio –o –H newc | gzip -9 > ramdisk.gz    #cpio 打包後, gzip 再壓縮
6)    mv ramdisk.gz ramdisk.img

2012年5月27日 星期日

NOVO7 TABLETS LATEST FIRMWARES & GUIDE

https://www.facebook.com/groups/177110959049953/doc/234229946671387/


LATEST FIRMWARES FOR AINOL NOVO7 ALLWINNER A10 TABLETS
=====================================================
Firmware Download Links Instruction:
=====================================================
IceCreamSandwich 4.0 for Ainol Novo7 Advanced:
Gingerbread 2.3 for Ainol Novo7 Advanced:
=====================================================
IceCreamSandwich 4.0 for Ainol Novo7 Advanced-II:
Advanced-II ICS-4.0.3_v1.1-Feiyu Patch: http://www.mediafire.com/?rymj48fn09wme
  • After installing Feiyu-Mod ICS 4.0.3_1.1-04.29 Expect to have White-Screen.
  • Wait at-least 3mins. and connect Tablet to PC and run Advanced-2 Patch.bat.
  • If you want to Re-Mapped your Home/Menu Buttons to Volume Buttons.
=====================================================
IceCreamSandwich 4.0 for Ainol Novo7 Elf:
Elf ICS-Feiyu TouchScreen Patch: http://www.mediafire.com/?9uayu318j39xq
  • Install via CWM Recovery (Feiyu-04.05.2012 has built-in CWM Recovery)
  • If you want to Re-Mapped your Home/Menu Buttons to Volume Buttons.
=====================================================
IceCreamSandwich 4.0 for Ainol Novo7 Aurora v1: -----February 2012 Batch
IceCreamSandwich 4.0 for Ainol Novo7 Aurora v2: -----March 2012 Batch
Aurora-v2 ICS-Feiyu TouchScreen Patch: http://www.mediafire.com/?fatay58f336b9
  • Install via CWM Recovery (Feiyu-Mod ROM has built-in CWM Recovery)
IceCreamSandwich 4.0 for Ainol Novo7 Aurora v3: -----April 2012 Batch
Aurora-v3 ICS-Feiyu TouchScreen Patch: http://www.mediafire.com/?xe2xajkxp6rcj
  • Install via CWM Recovery (Feiyu-Mod ROM has built-in CWM Recovery)
=====================================================
Feiyu-Mod ICS 4.0.3_1.1 Accelerometer Fix: http://www.mediafire.com/?19x41p5j9jb9zcy
  • Install via CWM Recovery (Feiyu-Mod ROM has built-in CWM Recovery)
Feiyu 4.0.3_1.1 Increase Int.Memory Patch: http://www.mediafire.com/?7fyol1lw96inbl8
  • Double-Click patch.exe and locate Feiyu_Mod ICS 4.0.3_1.1-04.29 img file.
  • After patching, re-flash the patched firmware to Tablet. 
=====================================================
=====================================================
FIRMWARE UPGRADING TOOLS AND DRIVERS
=====================================================
  • Extract into a Folder to PC and Double-Click LiveSuitPack.exe
  • Click "Continue Anyway" if ask to install ADB Driver.
  • If Device not found error appear while installing any Script.
  • Power-ON your Tablet > Go to System Settings > Developers Option.
  • Enable USB Debuging & Stay Awake. Connect Tablet to PC.
  • Open Device Manager and right-Click Android Device.
  • Install driver manually and Choose Downloaded Driver location.
=====================================================
=====================================================
FIRMWARE UPGRADING STEP BY STEP GUIDE
=====================================================
=====================================================
0. Download latest Firmware version for your Tablet and exract. There should be an .img file.
1. Rename the Firmware to "ICS_4.0.3" or "GB_2.3.4", and put it inside LiveSuitPack Folder.
2. Launch LiveSuit.exe (Take Note: LiveSuit.exe) and Follow the Steps below:
  • 1st pop-up window click YES.
  • 2nd pop-up window click FORMAT.
  • 3rd pop-up window click NEXT.
  • 4th pop-up window click YES.
  • 5th pop-up window locate your selected FW image file and click OPEN.
  • 6th pop-up window click FINISH.
3. For Novo7 Advanced, Hold-Press the +Volume Button and connect the Tablet to PC.
4. For Novo7 Advanced-II, Hold-Press the Back Button and connect the Tablet to PC.
5. For Novo7 Elf, Hold-Press the Menu Button and connect the Tablet to PC.
6. For Novo7 Aurora, Hold-Press the -Volume Button and connect the Tablet to PC.
7. As soon as you connect the USB Cable to PC while Hold-Press above Buttons,
8. Rapidly press the Power button 5 to 6 times without releasing the Button.
  • 7th pop-up window click: (YES = Complete Format) (NO = Re-Flash to same Firmware)
  • 8th pop-up window click: (YES = Complete Format)
9. You can now release the Buttons and wait for the upgrading to get finished.
  • 9th pop-up window click OK and Exit LiveSuit Program (Click Walking icon).
  • Disconnect your Tablet to PC and Power it up.
=====================================================
=====================================================
FIRMWARE UPGRADING FAILED?
Just Hold-Press Power button for 30seconds and Perform Upgrading again.
=====================================================
=====================================================
Gingerbread 2.3 After Finishing Firmware Upgrading:
1. Disconnect the tablet to PC and Power-ON your Tablet.
2. Go to Settings scroll down upto bottom and locate the [A] icon to change the Language.
3. Touch the very 1st option and choose English (US).
4. Go to Settings > Wireless and Networks > Wi-Fi Settings and Press Menu.
5. Click Advanced > Wi-Fi Sleep Policy and set it to NEVER.
6. Go to Settings > Applications > Development and turn-ON Stay Awake.
7. Go to Settings > Display > Screen Timeout and set it to 2mins above.
8. Go To Settings > Sound and disable Haptic Feedback (Vibrate).
9. Reboot your Tablet.
=====================================================
IceCreamSandwich 4.0 After Finishing Firmware Upgrading:
1. Disconnect the tablet to PC and Power-ON your Tablet.
2. Go to Settings scroll down upto bottom and locate the [A] icon to change the Language.
3. Touch the very 1st option and choose English (US).
4. Go to System Settings > Developers Option > Turn-ON USB Debugging & Stay Awake.
5. Go to System Settings > Display >Sleep and set it to 2mins above.
6. Go To Settings > Sound and set Vibrate to Never and Disable Vibrate on Touch.
7. Reboot your Tablet.
=====================================================
GOOGLE PLAY AND COMPLETE GOOGLE APPS SCRIPT:
CWM RECOVERY FOR ICS_4.0.3 NOVO7 TABLETS SCRIPT:
V6 SUPERCHARGER SCRIPT FOR ICE-CREAM-SANDWICH: 
=====================================================
Thanks... ivanz
=====================================================
Feel free to add Mediafire Mirror Link for Novo7 Tablets Latest Firmwares.

(Updater-Script)刷機腳本說明

http://bbs.anzhi.com/thread-4886647-1-1.html

這是Android系統來運行updater-scripts的Edify語言的基本介紹。
大部分的Edify命名都是函數,當調用這些函數結束的時候,會返回數據給腳本。當然,你也可以使用這些函數的返回值來確認成功與否,例如: 
ifelse(mount("yaffs2", "MTD", "system", "/system") == "system", ui_print("Successfully Mounted!"), ui_print("Mount Failed!"); 
這個命令會嘗試去掛載命名為“system”的“MTD”分區到“/system”。如果掛載成功,腳本會顯示“Successfully Mounted!” ,否則會顯示“Mount Failed!”。

現面是用在Edify的Updater-script中的函數例子: 

函數名稱: mount 
函數語法: mount(fs_type, partition_type, location, mount_point) 
參數詳解: fs_type--- --------------"yaffs2"或"ext4" 
partition_type----------"MTD"或"EMMC" 
location---------- -------分區(partition)或驅動器(device) 
mount_poin------------掛載文件系統的目標文件夾(target folder to mount FS) 
作用解釋:掛載一個文件系統到指定的掛載點
返回值:掛載成功則返回掛載點,失敗返回null 
函數示例: mount("MTD", "system", "/system");掛載system分區,設置返回指針"/system” 
        mount("vfat", "/dev/block/mmcblk1p2", "/system");掛載/dev/block/mmcblk1p2,返回指針"/system” 

函數名稱: is_mounted 
函數語法: is_mounted(mount_point ) 
參數詳解: mount_point-----------字符串,檢查是否已經掛載的掛載點
作用解釋:檢查文件系統是否掛載
返回值:掛載成功則返回掛載點,失敗返回null 
函數示例: 

函數名稱: unmount 
函數語法: unmount(mount_point) 
參數詳解: mount_point-----------字符串,要解除掛載的掛載點
作用解釋:解除文件系統掛載
返回值:解除掛載成功則返回掛載點,失敗返回null 
函數示例: unmount("/system");卸載/system分區

函數名稱: format 
函數語法: format(fs_type, partition_type, location) 
參數詳解: fs_type-----------------字符串,數據為"yaffs2"或"ext4" 
partition_type----------字符串, "MTD"或"EMMC" 
location-----------------字符串,分區(partition)或驅動器(device) 
作用解釋:格式化為指定的文件系統
函數示例: format("MTD ", "system");格式化system分區

函數名稱: delete 
函數語法: delete(file1, file2, ..., fileN) 
參數詳解:字符串,要刪除的文件
作用解釋:刪除一個文件。最少指定一個文件;多個文件可以做為多個參數指定
函數示例: delete("/data/zipalign.log");刪除文件/data/zipalign.log 

函數名稱: delete_recursive 
函數語法: delete_recursive(dir1, dir2,. ..,dirN) 
參數詳解:字符串,要遞歸刪除的目錄
作用解釋:刪除文件夾及其包含的所有內容。最少指定1個目錄;多個目錄可以做為多個參數指定
函數示例: delete_recursive ("/data/dalvik-cache");刪除文件夾/data/dalvik-cache 

函數名稱: show_progress 
函數語法: show_progress(frac, sec) 
參數詳解: frac------------ ----------進度完成數值
Sec----------------------總秒數
作用解釋:顯示在Recovery系統中進度
函數示例: show_progress(0.1, 10);show_progress下面的操作可能進行10s,完成後進度條前進0.1(也就是10%) 

函數名稱: set_progress 
函數語法: set_prograss(frac) 
參數詳解: frac------ ---------------進度數值
函數示例: 

函數名稱: package_extract_dir 
函數語法: package_extract_dir(package_path, destination_path) 
參數詳解: package_path----------字符串,升級包內要提取的目錄
        destination_path--------字符串,提取文件的目標目錄
作用解釋:提取升級包內目錄中的所有文件到指定的目標目錄
函數示例: package_extract_dir("system" , "/system");釋放ROM包裡system文件夾下所有文件和子文件夾至/system 

函數名稱: package_extract_file 
函數語法: package_extract_file(package_path)或package_extract_file(package_path, destination_path) 
參數詳解: package_path---- ------字符串,升級包內要提取的文件
destination_path-------字符串,提取文件的目標目錄
作用解釋:提取升級包內的單個文件到指定的目標目錄
函數示例: package_extract_file("my.zip", "/system");解壓ROM包裡的my.zip文件至/system 

函數名稱: file_getprop 
函數語法: file_getprop(file, key) 
參數詳解: file----- -----------------字符串,要檢查的文件名
        ​​Key----------------------字符串,返回數據中的文件的鍵名字
作用解釋:在格式"key"="value"的文件中取得文件屬性值
函數示例: 

函數名稱: symlink 
函數語法: symlink(target, src1, src2, ..., srcN) 
參數詳解: target-------------------字符串,符號鏈接的目標
        srcX ---------------- -----字符串,要創建的符號鏈接的目標點
作用解釋:在創建新的符號鏈接之前,要斷開已經存在的符號鏈接
函數示例: symlink("toolbox", "/system/bin/ ps");建立指向toolbox的符號鏈接/system/bin/ps 

函數名稱: set_perm 
函數語法: set_perm(uid, gid, mode, file1, file2, ..., fileN) 
參數詳解: uid---- ------------------用戶ID(user id) 
        Gid----------------------用戶組ID (group id) 
        Mode--------------------權限模式(permission mode) 
        fileX------------------ ---要設置許可的文件(file to set permission on) 
作用解釋:設置單個文件或一系列文件的權限,最少指定1個文件,前4個參數是必須的
函數示例: set_perm(0,2000, 0550, "system/etc/init.goldfish.sh");設置手機system中的etc/init.goldfish.sh的用戶為root,用戶組為shell,所有者以及所屬用戶組成員可以進行讀取和執行操作,其他用戶無操作權限)
這裡0代表用戶為root 
2000代表用戶組為shell 
我們來說明0550這組數據,這組數據的最後三位550,分別代表“所有者\組用戶\其他用戶”的權限,也就是我們在RE管理中“用戶\群組\其他”三行。我們以XXX來表示這三組權限,其中:
×=4讀的權限
×=2寫的權限
×=1執行的權限
我們必須首先了解用數字表示的屬性的含義:0表示沒有權限,1表示可執行權限,2表示可寫權限,4表示可讀權限,然後將其相加。所以數字屬性的格式應為3個從0到7的八進制數。
例如,如果想讓某個文件的屬主有"讀/寫"二種權限,需要把4(可讀)+2(可寫)=6(讀/寫)。若要rwx屬性則4+2+1=7;若要rw-屬性則4+2=6;若要rx屬性則4+1=5。
常用修改權限的命令:
Set_perm 0 0 0600 ××× (只有所有者有讀和寫的權限) 
Set_perm 0 0 0644 ××× (所有者有讀和寫的權限,組用戶只有讀的權限) 
Set_perm 0 0 0700 ××× (只有所有者有讀和寫以及執行的權限) 
Set_perm 0 0 0666 ××× (每個人都有讀和寫的權限) 
Set_perm 0 0 0777 ××× (每個人都有讀和寫以及執行的權限) 

函數名稱: set_perm_recursive 
函數語法: set_perm_recursive(uid, gid, dirmode, filemode, dir1, dir2, ...dirN) 
參數詳解: uid------------- ---------用戶ID(user id) 
        Gid----------------------用戶組ID(group id) 
        Dirmode---- ------------指定目錄內的目錄的權限
        Filemode---------------指定目錄內的文件的權限
        dirX------- --------------要設置權限的目標
作用解釋:設置單個目錄或一系列目錄的里面的所有文件的權限,最少指定1個目錄,5個參數都是必須的
函數示例: set_perm_recursive 0 0 0755 0644 SYSTEM:app;設置手機system/app文件夾及其中文件的用戶為root,用戶組為root,app文件夾權限為所有者可以進行讀、寫、執行操作,其他用戶可以進行讀取和執行操作,其中的文件的權限為所有者可以進行讀寫操作,其他用戶可以進行讀取操作

函數名稱: getprop 
函數語法: getprop(key) 
參數詳解: key----- ----------------字符串,想要係統返回的屬性
作用解釋:這個函數是用來返指定的屬性的值。它是用來從build.props文件中查詢手機的信息的。
函數示例: 

函數名稱: write_raw_image 
函數語法: write_raw_image(file, partition) 
參數詳解: file----------------------字符串,要讀取的Img源文件
        Partition-----------------字符串,要寫入Img文件的目標分區
作用解釋:這個函數是用來寫Img文件到分區
函數示例: write_raw_image( "/tmp/boot.img", "boot")將yaffs2格式的boot包直接寫入boot分區

函數名稱: apply_patch 
函數語法: apply_patch(srcfile, tgtfile, tgtsha1, tgtsize, sha1_1, patch_1, ..., sha1_x , patch1_x) 
參數詳解: srcfile-------------------字符串,要打補丁的源文件(要讀入的文件) 
        Tgtfile------ -------------字符串,補丁文件要寫入的目標文件
        tgtsha1-----------------字符串,寫入補丁文件的目標文件的sha1哈希值
sha1_x------------------字符串,要寫入目標文件的補丁數據的sha1哈希值patch1_x------- ---------字符串,實際上應用到目標文件的補丁
作用解釋:這個函數是用來打補丁到文件。
函數示例: 

函數名稱: apply_patch_check 
函數語法: apply_patch_check(file, sha1_1, ..., sha1_x) 
參數詳解: file----------------------字符串,要檢查的文件
        sha1_x------------------要檢查的哈希值
作用解釋:檢查文件是否已經被打補丁,或者能不能被打補丁。需要檢查“applypatch_check ”函數調用的源代碼。
函數示例: 

函數名稱: apply_patch_space 
函數語法: apply_patch_space(bytes) 
參數詳解: bytes-------------------檢查的字節的數字
作用解釋:檢查緩存來確定是否有足夠的空間來寫入補丁文件並返回一些數據。
函數示例: 

函數名稱: read_file 
函數語法: read_file(filename) 
參數詳解: filename----------------字符串,要讀取內容的文件名
​​作用解釋:這個函數返回文件的內容
函數示例: 

函數名稱: sha1_check 
函數語法: sha1_check(data)或sha1_check(data, sha1_hex, ..., sha1_hexN) 
參數詳解: data-------------- -------要計算sha1哈希值的文件的內容-必須是只讀文件格式
        sha1_hexN--------------文件數據要匹配的特定的十六進制sha1_hex哈希值字符串
作用解釋:如果只指定data參數,這個函數返回data參數的十六進制sha1_hex哈希值字符串。其他參數用來確認你檢查的文件是不是列表中的哈希值的一個。它返回匹配的哈希值,或者在沒有匹配任何哈希值時返回空。
函數示例: 

函數名稱: ui_print 
函數語法: ui_print(msg1, ..., msgN) 
參數詳解: msg----------------------字符串,要處理過程中輸出給用戶的信息
作用解釋:在腳本運行的時候,在控制台顯示的信息。最少要指定1個參數,你可以指定額外的msg參數,並且它們會連接起來輸了
函數示例: ui_print("It's ready!");屏幕打印It's ready! 

函數名稱: run_program 
函數語法: run_program(prog, arg1, .., argN) 
參數詳解: prog--------------------字符串,要執行的程序
        argN---------- ----------字符串,要執行的程序的運行參數
作用解釋:以指定的參執行程序
函數示例: run_program("/system/xbin/installbusybox.sh");運行installbusybox.sh腳本文件

函數名稱: ifelse 
函數語法: ifelse(condition, truecondition, falsecondition) 
參數詳解: condition----------------要運算的表達式
        Truecondition------ -----當值為True時執行的Edify腳本塊
        Falsecodnition-----------當值為False時執行的Edify腳本塊
作用解釋:這是If-then結構的Edify腳本語言。在真條件或非條件下語句可以是單條Edify命令或者腳本塊。腳本塊可以用圓括號來界定,用分號來隔開。
函數示例: 

函數名稱: abort 
函數語法: abort() 
參數詳解:沒有參數
作用解釋:中止腳本執行
函數示例: 

函數名稱: assert 
函數語法: assert(condition) 
參數詳解: condition------ ---------boolean 
作用解釋:如果condition參數的計算結果為False,則停止腳本執行,否則繼續執行腳本
函數示例: assert(package_extract_file("boot.img","/tmp/boot. img"),write_raw_image("/tmp/boot.img","boot"),delete("/tmp/boot.img")) 
執行package_extract_file,如果不返回錯誤則執行write_raw_image,如果write_raw_image不出錯則執行delete 文檔附件: