2010/12/30

android 遠端搖控 remote control -- keyevent

android 要遠端控制的話,大抵上是用 adb 來實作,這邊的遠端其實不是網路理論上的那種 client server....

話說回來,光看 adb 的說明,可能還感覺不出遠端控制的效用,但是底下資訊幫著看的話,效果就大不同:

adb shell input text wirelessadb
adb shell input keyevent 66

上面是會讓 android 輸入 wirelessadb 然後送 "enter" 鍵,通常輸入文字是搜尋,所以代表可以查 wirelessadb
為了幫助我那可憐的有限記憶,底下把 keyevent 中能用的 key code 簡單的列下來,有篇非常好的文章值得有興趣的人進一步去研讀:
0 --> "KEYCODE_UNKNOWN"
1 --> "KEYCODE_MENU"
2 --> "KEYCODE_SOFT_RIGHT"
3 --> "KEYCODE_HOME"
4 --> "KEYCODE_BACK"
5 --> "KEYCODE_CALL"
6 --> "KEYCODE_ENDCALL"
7 --> "KEYCODE_0"
8 --> "KEYCODE_1"
9 --> "KEYCODE_2"
10 --> "KEYCODE_3"
11 --> "KEYCODE_4"
12 --> "KEYCODE_5"
13 --> "KEYCODE_6"
14 --> "KEYCODE_7"
15 --> "KEYCODE_8"
16 --> "KEYCODE_9"
17 --> "KEYCODE_STAR"
18 --> "KEYCODE_POUND"
19 --> "KEYCODE_DPAD_UP"
20 --> "KEYCODE_DPAD_DOWN"
21 --> "KEYCODE_DPAD_LEFT"
22 --> "KEYCODE_DPAD_RIGHT"
23 --> "KEYCODE_DPAD_CENTER"
24 --> "KEYCODE_VOLUME_UP"
25 --> "KEYCODE_VOLUME_DOWN"
26 --> "KEYCODE_POWER"
27 --> "KEYCODE_CAMERA"
28 --> "KEYCODE_CLEAR"
29 --> "KEYCODE_A"
30 --> "KEYCODE_B"
31 --> "KEYCODE_C"
32 --> "KEYCODE_D"
33 --> "KEYCODE_E"
34 --> "KEYCODE_F"
35 --> "KEYCODE_G"
36 --> "KEYCODE_H"
37 --> "KEYCODE_I"
38 --> "KEYCODE_J"
39 --> "KEYCODE_K"
40 --> "KEYCODE_L"
41 --> "KEYCODE_M"
42 --> "KEYCODE_N"
43 --> "KEYCODE_O"
44 --> "KEYCODE_P"
45 --> "KEYCODE_Q"
46 --> "KEYCODE_R"
47 --> "KEYCODE_S"
48 --> "KEYCODE_T"
49 --> "KEYCODE_U"
50 --> "KEYCODE_V"
51 --> "KEYCODE_W"
52 --> "KEYCODE_X"
53 --> "KEYCODE_Y"
54 --> "KEYCODE_Z"
55 --> "KEYCODE_COMMA"
56 --> "KEYCODE_PERIOD"
57 --> "KEYCODE_ALT_LEFT"
58 --> "KEYCODE_ALT_RIGHT"
59 --> "KEYCODE_SHIFT_LEFT"
60 --> "KEYCODE_SHIFT_RIGHT"
61 --> "KEYCODE_TAB"
62 --> "KEYCODE_SPACE"
63 --> "KEYCODE_SYM"
64 --> "KEYCODE_EXPLORER"
65 --> "KEYCODE_ENVELOPE"
66 --> "KEYCODE_ENTER"
67 --> "KEYCODE_DEL"
68 --> "KEYCODE_GRAVE"
69 --> "KEYCODE_MINUS"
70 --> "KEYCODE_EQUALS"
71 --> "KEYCODE_LEFT_BRACKET"
72 --> "KEYCODE_RIGHT_BRACKET"
73 --> "KEYCODE_BACKSLASH"
74 --> "KEYCODE_SEMICOLON"
75 --> "KEYCODE_APOSTROPHE"
76 --> "KEYCODE_SLASH"
77 --> "KEYCODE_AT"
78 --> "KEYCODE_NUM"
79 --> "KEYCODE_HEADSETHOOK"
80 --> "KEYCODE_FOCUS"
81 --> "KEYCODE_PLUS"
82 --> "KEYCODE_MENU"
83 --> "KEYCODE_NOTIFICATION"
84 --> "KEYCODE_SEARCH"
85 --> "TAG_LAST_KEYCODE"

2010/12/28

svn server on win-xp

自從兩年多前寫過一篇 svn 至今,終於「穩定」下來了,現在來寫一下 subversion server 安裝的部份。

先轉述一篇好文章的話:
匪夷所思的是國內資訊軟體公司中的資訊工程師似乎對其非常陌生」,
沒有 CVS/SVN 這類版本控制工具,任何修改程式碼的動作都會增加 programmer 大腦記憶體的負擔, programmer 將會浪費許多時間在搜尋與比對程式碼的工作之上』


subversion 原先由 CollabNet 維護,目前由 Apache 納入其專案中,可以至 Apache Subversion 專案查詢相關資訊。


---server---


1. 下載: 自 VisualSVN 下載最新的 binary, 我目前抓到的是 2.1.5
2. 執行它....這不必我多說,它是個 MSI 檔,可以自動進行大部份自動安裝工作,內含 svn server 2.1.5, 及 apache 2.2.17, svn client 1.6.15
3. 在安裝中,我選的是『Use Windows authentication』,畫面如下

4. 安裝之後,會問你要不要執行 VisualSVN Server Manager, 可以不執行,也可以叫出來看,當然看完可以按右上角的叉叉關掉,背景的 server 仍然會一直跑。畫面如下:
5. 接下來算是要維持日常的 server 維護工作,第一件事當然就是準備倉庫給 client 使用。做法很簡單,透過上面的管理界面跟檔案總管非常相像的按右鍵新增即可,畫面如下。仔細看的話,其實我是在最上層用『Create New Repository」新增了 EE1 這個倉庫,並在其下用『新增』『Project Structure』的方式新增了 android-testsuite 及 mfg-dll 兩個專案:
6. 檢查一下硬碟。根據上面的設定,我是把倉庫(Repository)放在 D:\SVN, 會發現 D:\SVN 確實有 EE1, 可是 D:\SVN\EE1\ 卻沒有 android-testsuite, 或是 mfg-dll 兩個目錄!!! 這是為什麼?原因是 EE1 是倉庫,而 android-testsuite, mfg-dll 兩個只是倉庫中的存貨。所有存貨都是在版本控制內的實體,而 subversion 並不是依靠存實體檔案的方式來控管,因此,請勿自行處理 D:\SVN\ 下面的目錄或檔案,這樣很容易損毀 subversion server system.

7, 接下來就是 client 端的操作了,可以看我那篇 svn 裡面的『TortoiseSVN (Client端) 使用流程』 一節。或是繼續往下看

---client---

1. 上傳新專案,通常新專案都是寫好一堆檔案了,此時可以一批次的上傳,在裝好 subversion client 之後,在要上傳的目錄按滑鼠右鍵,選擇 TortoiseSVN-->Import 即可,畫面如下

2. 在 Import 畫面照理說,應該填上面 server Manager 新增出來的倉庫網址,不過我習慣在一個倉庫裡放不同的 Project,其觀念與正統版本控制不太相符,但是帳號比較好管理。畫面如下:
  值得注意的是,我在硬碟中的目錄名稱是 SDC_FactoryDLL,而在 svn server  放的卻是 mfg-dll ,兩個可以是不一致。而完整的 subversion url 是 https://an970100770.quanta.corp:8443/svn/EE1/mfg-dll 而不是倉庫 url https://an970100770.quanta.corp:8443/svn/EE1

3. 如此一來,svn server 已經有所有檔案,而你原來上傳的目錄是在尚未管理的原始狀態。我這麼說你可能不是很懂,底下有兩個作法可以讓你體驗,看你喜歡哪一種挑選之實作一下:
  a. 刪除原來的整個目錄
  b. 選一個跟原來的目錄不同層的新工作目錄
然後.....在新工作目錄下,用滑鼠右鍵選 SVN Checkout, 在 url of repository 中填入 https://an970100770.quanta.corp:8443/svn/EE1/mfg-dll 即可完成工作,不過 Checkout Directory 則仍然會是倉庫的網址,我是另外存到相對應的目錄。畫面如下。當然第一次免不了要輸入帳號密碼。因為我在設定 svnserver 時用的是 windows 的認證機制,因此請填入你登入 windows 的帳號密碼即可。


檢查一下新下載的目錄,會發現每一層新的目錄都會多了一個 .svn 的子目錄,代表目前正受版本控制當中。

4. 若你想移除檔案的話,請不要直接刪除,而是透過 TortoiseSVN-->delete 來操作,因為這樣才會通知 server 做刪檔動作,若只是透過檔案總管操作刪檔的話,server  並不知道你要刪檔,這樣一來下次與系統同步更新時又會把你想刪除的檔抓下來。

5. 當你修改完程式之後,可以在檔案總管發現目錄變成紅色的驚嘆號,代表該目錄已經有被更動,你可以選擇馬上上傳到 server, 或是等工作到一段落後再上傳,畫面如下:



6. 所謂上傳到 svn server, 其實就是 svn commit 命令,畫面如下
7. 以上已經可以完成大部份的工作....不過最強的不是上傳檔案,否則你大概也會想說還不如直接壓縮來放就好。我們來看看一個基本的操作,跟前一版比對,畫面如下:
你可以發現右邊是新版的,它把變動的部份用黃色標註出來了

8. 若養成好習慣的話,每次上傳更新檔時都寫 log 訊息的話,這樣你可以透過 svn log 去取得上傳的 log 訊息,畫面如下:

9. 這樣一來,你知道了每次的更改,也就能隨時回到你想要的版本去,畫面中有個選項我一直沒提,就是 HEAD, 這代表最新的版本,例如我要回到「最原始」的狀態,以這邊來說是 revision 12....那就 checkout 的畫面填入 12, 要回到最新的版本,就勾選 HEAD, 勾選回到 revision 13 的畫面如下:


2010/12/27

android eclipse setup for ubuntu 10.10 64bit

寫過一篇android build on ubuntu 10.10,其實早就寫好關於 android app 的部份,只是並非寫在這兒,底下就貼一下。

* URL: http://developer.android.com/sdk/index.html
* Quick Start
  o Prepare your development computer
  o Download and install the SDK starter package
  o Install the ADT Plugin for Eclipse
  o Add Android platforms and other components to your SDK

Install Android SDK, Java, Eclipse

  * Host Environment: Ubuntu 10.04
  * Eclipse: sudo apt-get install eclipse eclipse-jdt
  * Start Eclipse:
    o 應用程式 ==> 軟體開發 ==> eclipse

Install ADT with Eclipse v3.5(Galileo)

  * URL: http://developer.android.com/sdk/eclipse-adt.html
  * Start Eclipse, then select Help > Install New Software.
  * In the Available Software dialog, click Add....
  * In the "Name" field: Android Plugin
  * In the "Location" field:
     https://dl-ssl.google.com/android/eclipse/
  * Click OK.
  * In the Available Software view:
    o Check the Developer Tools
      + Make sure check Android DDMS and Android Development Tools.
    o Click Next.
  * Click Next to read and accept the license agreement and install any dependencies, then click Finish.
  * Restart Eclipse.

Configuring the ADT Plugin

  * Select Window > Preferences
  * Select Android from the left panel.
  * SDK Location ==> click Browse ==> locate your downloaded SDK directory, such as "/home/wade/src/android/android-sdk-linux_86"
  * Click Apply, then OK.

Adding Android Platforms and Other...

  * URL: http://developer.android.com/sdk/adding-components.html
  * Windows --> Android SDK & AVD Manager

Install a Platform

  * In the Android SDK and AVD Manager, choose Available Packages in the left panel.
  * Click the repository site checkbox to display the components available for installation.
  * Select at least one platform to install, and click Install Selected. If you aren't sure which platform to install, use the latest version.

Create an AVD(做一次就好)

  * In Eclipse, choose Window > Android SDK and AVD Manager.
  * Select Virtual Devices in the left panel.
  * Click New.
     The Create New AVD dialog appears.
  * Type the name of the AVD, such as "my_avd".
  * Choose a target. The target is the platform (that is, the version of the Android SDK, such as 2.1) you want to run on the emulator.
      You can ignore the rest of the fields for now.
  * Click Create AVD.

Create a New Android Project

  * From Eclipse, select File > New > Project.
  * Select "Android" -> "Android Project" and click Next.
  * Fill in the project details with the following values:
    o Project name: HelloAndroid
    o Application name: Hello, Android
    o Package name: com.example.helloandroid (or your own private namespace)
    o Create Activity: HelloAndroid
    o Click Finish.

Construct the UI

Run the Application

  The Eclipse plugin makes it easy to run your applications:
  * Select Run > Run.
  * Select "Android Application".
    o Select Target Device
    o Project > Properties > Run/Debug Settings > Edit > Target > ....
  * For the first time to run android app, it will show "Select a way to run ...".
     Please select "Android Application"

Start Emulator(有兩個方法)

# Eclipse
  * By Project-->Run to start emulator with installation app
  * Window --> Android SDK and AVD Manager --> Virtual Devices, and then....
Select a device --> Start

# Command Line
  * $ export DISPLAY=:0.0
  $ emulator -system system.img -data userdata.img -ramdisk ramdisk.img

wifi 二三事

底下內容其實要找相關文獻很容易,我也一直懶得寫,但是剛好看到有人寫英文的,就順手翻譯下來。本文目的就是在命令列處理無線網路。底下的命令幾乎都要 root 權限,請自行取得,或是前面加上 sudo

.第一步是先透過 ifconfig -a 來查無線網路的裝置,不同的 Linux distribution 或是不同的無線網卡會有不同的命名方式,有的是 eth1, 有的是 wlan0,底下就假設是 wlan0
.再來用 iwlist wlan0 scan 來掃瞄 Access Point,舉例如下:
Cell 01 - Address: 00:11:22:33:44:55
          ESSID:"network-essid"
          Mode:Master
          Channel:11
          Frequency:2.462 GHz (Channel 11)
          Quality=100/100  Signal level:-47dBm  Noise level=-100dBm
          Encryption key:off
          .
          .
          .
.接下來可以用 iwconfig 來設定 essid, iwconfig wlan0 essid network-essid
.說穿了,就是用 iwconfig 來設定,還有很多項目可以設定,譬如頻率: iwconfig wlan0 freq 2.422G, or...
.以 channel 的方式來設定頻率相關資訊: iwconfig wlan0 channel 3,
.若在吵雜的環境中上網不良,可以試試修改「重試」次數: iwconfig wlan0 retry 16
.訊息不良的環境,甚至需要把封包切分小單位,譬如 iwconfig wlan0 frag 512
.有些網路卡不會馬上生效,必須加上這個: iwconfig wlan0 commit

以上用 iwconfig 來設定的全部選項可以放在一起,另外還有兩個命令可以用來幫助你 debug 無線網卡,一個是 iwspy 及 iwpriv

2010/12/24

monkey 又一章

寫過一篇Monkey 教學文件,不過那篇算是抄來的。

在 android /data/system/ 下有一個檔叫 packages.xml, 打開來看,會看到很多安裝的套件資訊,舉例來說,你可以找 <package 開頭的部份來看,此時你就可以知道有哪些套件可以進行 monkey 測試。

底下擷取部份內容說明一下....例如 第一個 <package name="com.android.soundrecorder" codePath="/system/app/SoundRecorder.apk"....

此時可以下 monkey -p com.android.soundrecorder -v 50 來對錄音軟體進行測試

<packages>
<package name="com.android.soundrecorder" codePath="/system/app/SoundRecorder.apk" nativeLibraryPath="/data/data/com.android.soundrecorder/lib" flags="1" ft="12d124faa98" it="12d124faa98" ut="12d124faa98" version="9" userId="10006">
<package name="android" codePath="/system/framework/framework-res.apk" flags="1" ft="12d12461578" it="12d12461578" ut="12d12461578" version="9" sharedUserId="1000">
<package name="com.android.launcher" codePath="/system/app/Launcher2.apk" nativeLibraryPath="/data/data/com.android.launcher/lib" flags="1" ft="12d124fae80" it="12d124fae80" ut="12d124fae80" version="9" userId="10023">
<package name="com.android.defcontainer" codePath="/system/app/DefaultContainerService.apk" nativeLibraryPath="/data/data/com.android.defcontainer/lib" flags="1" ft="12d124f7fa0" it="12d124f7fa0" ut="12d124f7fa0" version="9" userId="10024">
<package name="com.android.providers.contacts" codePath="/system/app/ContactsProvider.apk" nativeLibraryPath="/data/data/com.android.providers.contacts/lib" flags="1" ft="12d124f7fa0" it="12d124f7fa0" ut="12d124f7fa0" version="9" sharedUserId="10010">
<package name="com.android.settings" codePath="/system/app/Settings.apk" nativeLibraryPath="/data/data/com.android.settings/lib" flags="1" ft="12d1250bff0" it="12d1250bff0" ut="12d1250bff0" version="9" sharedUserId="1000">
<package name="com.android.quicksearchbox" codePath="/system/app/QuickSearchBox.apk" nativeLibraryPath="/data/data/com.android.quicksearchbox/lib" flags="1" ft="12d12496520" it="12d12496520" ut="12d12496520" version="110" userId="10028">
<package name="com.android.protips" codePath="/system/app/Protips.apk" nativeLibraryPath="/data/data/com.android.protips/lib" flags="1" ft="12d12547cf8" it="12d12547cf8" ut="12d12547cf8" version="1" userId="10026">
<package name="com.android.providers.applications" codePath="/system/app/ApplicationsProvider.apk" nativeLibraryPath="/data/data/com.android.providers.applications/lib" flags="1" ft="12d124f6c18" it="12d124f6c18" ut="12d124f6c18" version="9" sharedUserId="10010">
<package name="com.android.contacts" codePath="/system/app/Contacts.apk" nativeLibraryPath="/data/data/com.android.contacts/lib" flags="1" ft="12d1253b9a8" it="12d1253b9a8" ut="12d1253b9a8" version="9" sharedUserId="10010">
<package name="com.android.inputmethod.latin" codePath="/system/app/LatinIME.apk" nativeLibraryPath="/data/data/com.android.inputmethod.latin/lib" flags="1" ft="12d12548c98" it="12d12548c98" ut="12d12548c98" version="9" userId="10001">
<package name="com.android.phone" codePath="/system/app/Phone.apk" nativeLibraryPath="/data/data/com.android.phone/lib" flags="1" ft="12d12501028" it="12d12501028" ut="12d12501028" version="9" sharedUserId="1001">
<package name="com.android.calculator2" codePath="/system/app/Calculator.apk" nativeLibraryPath="/data/data/com.android.calculator2/lib" flags="1" ft="12d12549080" it="12d12549080" ut="12d12549080" version="9" userId="10014">
<package name="com.android.providers.drm" codePath="/system/app/DrmProvider.apk" nativeLibraryPath="/data/data/com.android.providers.drm/lib" flags="1" ft="12d124f8f40" it="12d124f8f40" ut="12d124f8f40" version="9" sharedUserId="10016">
<package name="com.android.htmlviewer" codePath="/system/app/HTMLViewer.apk" nativeLibraryPath="/data/data/com.android.htmlviewer/lib" flags="1" ft="12d124f9710" it="12d124f9710" ut="12d124f9710" version="9" userId="10017">
<package name="com.android.systemui" codePath="/system/app/SystemUI.apk" nativeLibraryPath="/data/data/com.android.systemui/lib" flags="1" ft="12d1254bf60" it="12d1254bf60" ut="12d1254bf60" version="9" sharedUserId="1000">
<package name="com.android.term" codePath="/system/app/Term.apk" nativeLibraryPath="/data/data/com.android.term/lib" flags="1" ft="12d124fc9d8" it="12d124fc9d8" ut="12d124fc9d8" version="9" userId="10018">
<package name="com.android.providers.calendar" codePath="/system/app/CalendarProvider.apk" nativeLibraryPath="/data/data/com.android.providers.calendar/lib" flags="1" ft="12d124f7bb8" it="12d124f7bb8" ut="12d124f7bb8" version="9" sharedUserId="10012">
<package name="com.android.bluetooth" codePath="/system/app/Bluetooth.apk" nativeLibraryPath="/data/data/com.android.bluetooth/lib" flags="1" ft="12d125459d0" it="12d125459d0" ut="12d125459d0" version="9" userId="10022">
<package name="com.android.speechrecorder" codePath="/system/app/SpeechRecorder.apk" nativeLibraryPath="/data/data/com.android.speechrecorder/lib" flags="1" ft="12d124fc208" it="12d124fc208" ut="12d124fc208" version="9" userId="10015">
<package name="com.android.development" codePath="/system/app/Development.apk" nativeLibraryPath="/data/data/com.android.development/lib" flags="1" ft="12d12544648" it="12d12544648" ut="12d12544648" version="1" userId="10000">
<package name="com.android.packageinstaller" codePath="/system/app/PackageInstaller.apk" nativeLibraryPath="/data/data/com.android.packageinstaller/lib" flags="1" ft="12d124fae80" it="12d124fae80" ut="12d124fae80" version="9" userId="10027">
<package name="com.android.calendar" codePath="/system/app/Calendar.apk" nativeLibraryPath="/data/data/com.android.calendar/lib" flags="1" ft="12d125461a0" it="12d125461a0" ut="12d125461a0" version="9" userId="10003">
<package name="com.android.providers.telephony" codePath="/system/app/TelephonyProvider.apk" nativeLibraryPath="/data/data/com.android.providers.telephony/lib" flags="1" ft="12d124fc9d8" it="12d124fc9d8" ut="12d124fc9d8" version="9" sharedUserId="1001">
<package name="com.android.browser" codePath="/system/app/Browser.apk" nativeLibraryPath="/data/data/com.android.browser/lib" flags="1" ft="12d124f8388" it="12d124f8388" ut="12d124f8388" version="9" userId="10002">
<package name="com.android.providers.subscribedfeeds" codePath="/system/app/AccountAndSyncSettings.apk" nativeLibraryPath="/data/data/com.android.providers.subscribedfeeds/lib" flags="1" ft="12d124f6c18" it="12d124f6c18" ut="12d124f6c18" version="9" sharedUserId="1000">
<package name="com.android.music" codePath="/system/app/Music.apk" nativeLibraryPath="/data/data/com.android.music/lib" flags="1" ft="12d125484c8" it="12d125484c8" ut="12d125484c8" version="9" userId="10008">
<package name="com.android.camera" codePath="/system/app/Camera.apk" nativeLibraryPath="/data/data/com.android.camera/lib" flags="1" ft="12d12546970" it="12d12546970" ut="12d12546970" version="1" userId="10011">
<package name="com.svox.pico" codePath="/system/app/PicoTts.apk" nativeLibraryPath="/data/data/com.svox.pico/lib" flags="1" ft="12d124fb268" it="12d124fb268" ut="12d124fb268" version="1" userId="10021">
<package name="com.cooliris.media" codePath="/system/app/Gallery3D.apk" nativeLibraryPath="/data/data/com.cooliris.media/lib" flags="1" ft="12d12549468" it="12d12549468" ut="12d12549468" version="30682" userId="10013">
<package name="com.android.email" codePath="/system/app/Email.apk" nativeLibraryPath="/data/data/com.android.email/lib" flags="1" ft="12d124fa6b0" it="12d124fa6b0" ut="12d124fa6b0" version="230000" userId="10020">
<package name="com.android.providers.downloads.ui" codePath="/system/app/DownloadProviderUi.apk" nativeLibraryPath="/data/data/com.android.providers.downloads.ui/lib" flags="1" ft="12d124f8f40" it="12d124f8f40" ut="12d124f8f40" version="9" sharedUserId="10016">
<package name="com.android.providers.userdictionary" codePath="/system/app/UserDictionaryProvider.apk" nativeLibraryPath="/data/data/com.android.providers.userdictionary/lib" flags="1" ft="12d124fcdc0" it="12d124fcdc0" ut="12d124fcdc0" version="9" sharedUserId="10010">
<package name="com.android.spare_parts" codePath="/system/app/SpareParts.apk" nativeLibraryPath="/data/data/com.android.spare_parts/lib" flags="1" ft="12d124fbe20" it="12d124fbe20" ut="12d124fbe20" version="9" userId="10005">
<package name="com.android.deskclock" codePath="/system/app/DeskClock.apk" nativeLibraryPath="/data/data/com.android.deskclock/lib" flags="1" ft="12d12547528" it="12d12547528" ut="12d12547528" version="202" userId="10009">
<package name="com.android.providers.settings" codePath="/system/app/SettingsProvider.apk" nativeLibraryPath="/data/data/com.android.providers.settings/lib" flags="1" ft="12d124fba38" it="12d124fba38" ut="12d124fba38" version="9" sharedUserId="1000">
<package name="android.tts" codePath="/system/app/TtsService.apk" nativeLibraryPath="/data/data/android.tts/lib" flags="1" ft="12d124fcdc0" it="12d124fcdc0" ut="12d124fcdc0" version="9" userId="10019">
<package name="com.android.mms" codePath="/system/app/Mms.apk" nativeLibraryPath="/data/data/com.android.mms/lib" flags="1" ft="12d124fbe20" it="12d124fbe20" ut="12d124fbe20" version="9" userId="10025">
<package name="com.android.provision" codePath="/system/app/Provision.apk" nativeLibraryPath="/data/data/com.android.provision/lib" flags="1" ft="12d124fb268" it="12d124fb268" ut="12d124fb268" version="9" userId="10004">
<package name="com.android.providers.media" codePath="/system/app/MediaProvider.apk" nativeLibraryPath="/data/data/com.android.providers.media/lib" flags="1" ft="12d124f9af8" it="12d124f9af8" ut="12d124f9af8" version="9" sharedUserId="10016">
<package name="com.android.providers.downloads" codePath="/system/app/DownloadProvider.apk" nativeLibraryPath="/data/data/com.android.providers.downloads/lib" flags="1" ft="12d124f8b58" it="12d124f8b58" ut="12d124f8b58" version="9" sharedUserId="10016">
<package name="com.android.certinstaller" codePath="/system/app/CertInstaller.apk" nativeLibraryPath="/data/data/com.android.certinstaller/lib" flags="1" ft="12d124f77d0" it="12d124f77d0" ut="12d124f77d0" version="9" userId="10007">
<package name="com.android.server.vpn" codePath="/system/app/VpnServices.apk" nativeLibraryPath="/data/data/com.android.server.vpn/lib" flags="1" ft="12d124fd1a8" it="12d124fd1a8" ut="12d124fd1a8" version="9" sharedUserId="1000">
</packages>