直接修改Android軟件數據庫來改變軟件設置實例一則

昨天把K860i刷了機,刷到了最新的CyanogenMod10.1,使用起來各種流暢舒服,不過卻由於內外置SD卡的掛載點的改變,造成了一些困擾,現記錄如下。

       

       平時裏由於極少把手機連接到電腦上傳文件,除非文件特別多特別大,一般都是通過WIFI網絡來把需要的文件傳到手機裏。原理很簡單,就是在手機上建一個FTP服務器,電腦上通過FTP工具把文件傳過來即可。如上圖就是我經常用的一個小米文件管理器,很簡單好用。

       刷機之前用的是官方ROM,它把外置的SD卡掛載在了內置SD卡的某一個目錄裏,所以小米文件管理默認開啓而且在其設置裏面無法更新的/mnt/sdcard這個幾乎100%的Android設備都存在的目錄就在FTP上使用就完全沒有問題,雖然麻煩些不過還是可以把文件傳到外置SD卡上。

       但是刷機之後問題出現了,這個ROM把內外置SD卡分別掛載到了/storage/sdcard0和/storage/sdcard1上,而默認符號鏈接/mnt/sdcard到了/storage/sdcard0也就是內置卡,這樣一來,直接通過小米文件管理的FTP功能就無法傳文件到外置SD卡上了。

       要更改這個也很簡單,都想的到直接把這個FTP的家目錄更改一下不就得了,關鍵是這個軟件的設置裏面沒有提供更改FTP家目錄的設置。於是我就想到直接修改小米文件管理器的數據來修改FTP的家目錄,當然這只是一個想法,嘗試一下便知道可不可行,因爲如果小米文件管理器沒有使用生成的數據來控制FTP家目錄而是直接強制指定/mnt/sdcard寫在了軟件的程序代碼裏面,那就無法了。後面的事實證明,其還是使用了用戶數據寫入數據庫的方式來存儲設置的,結果很完美。下面是解決的過程。


       一些必要的前提知識補充:
       Android系統對於每個安裝的軟件,都會分配空間,用於儲存軟件本身和軟件數據,軟件本身也就是apk文件了,所有用戶安裝的apk軟件都位於/data/app目錄,正常方法安裝的apk都會在這裏以包名顯示,如com.tencent.qq.apk。而Android系統會給每個軟件分配專用的文件夾用於存放軟件運行所需要的數據,如軟件設置,從internet上下載的用於顯示的內容數據(如微博的內容)等等,每個軟件的用戶數據都是以包名爲目錄名,儲存在/data/data目錄裏面。一般意義上的清除某個軟件的數據,其實質也就是刪除了對應的文件夾裏面的內容。
       Android系統的所有數據存儲,都使用的是sqlite3數據庫,這是一種單文件型的數據庫,體積小,提供的API使用方法靈活,所以Android在系統級集成了它,用於所有apk軟件的數據存儲。它完全符合SQL的ACID原則,一般的軟件都會把設置項之類的東西存儲在sqlite3數據庫中,我們只要找到所需的鍵值,把它修改成我們所要值就算完成了。
       同時,由於使用的Linux內核,Android系統的文件權限自然是用的Linux的那一套,rwxrwxrwx,以及用戶和用戶組。對於每個安裝的apk軟件,系統都會給其分配唯一的用戶名和用戶組,當然在Android裏面這些東西對用戶都是透明的,不像桌面Linux系統那樣會被用戶注意到,所以一般用戶也不需要知道這些。


       下面開始進行我們要的操作。

       1、首先就是要找到這個小米文件管理器的包名,因爲只有找到了包名我們才能找到它的數據存放在哪裏,直接查看它的應用信息,4.2系統很方便地在app名稱下面就顯示了包名(我記得4.1是沒有這個的)。如下圖。

       2、找到包名之後我們要進入到其用戶數據目錄裏面,找到數據庫文件。果然,在/data/data/com.android.mifileexplorer的database目錄裏面,我們找到了這個文件,就是它。如下圖。


       3、把這個mifileexplorer這個文件拷到/sdcard目錄,傳到電腦上,以方便我們對其進行操作。

       4、去http://www.sqlite.org官網下載適合於Windows的sqlite3.exe,我們就會用它來對這個數據庫文件進行修改。Windows並沒有集成這個,Linux和MacOSX都已經自帶了這個sqlite3的工具,不需要下載。

       5、下面開始修改(下面會用到標準SQL語句和sqlite3的特殊操作命令)。
       先看一下這個數據庫裏面有幾個表:.tables。
       再看一下所有的表結構是怎麼樣的:.schema。
       再來看看錶裏面有沒有我們想要的存儲的FTP家目錄的路徑:select * from network。
       果然,從輸出的結果,我們看到了remote列有一個值是/storage/sdcard0,我們只要把這個值修改成/storage/,自然FTP的家目錄就修改了,那麼我們就可以在FTP工具裏面直接讀寫內外置卡了。
       嘗試修改這個值:update network set remote='/storage/'。
       再看一下修改成功了沒有:select * from network。可以看到,值已經發生了變化。

       到這裏修改路徑的工作已經完成了一大半了,當然我們看到了還有一個2121的值,這個是小米文件管理器的FTP的端口號,如果有需要的話也可以修改的。
  

       6、現在我們把這個修改好的數據庫文件再要放回原處,以驗證是否修改成功。
       這裏要注意一個重要的地方,如果我們是直接用RE管理器把文件放回原處,一定要改權限和文件的所有者,特別是文件的所有者。上面說過,每個app都會有一個唯一的用戶名和用戶組,我們用RE管理器是必須在設備獲取了ROOT權限之後,以root用戶的身份把文件寫回原路徑的,這樣肯定就會產生問題,最直接的表現就是app直接FC了。所以我們可以參照database目錄裏面其它文件的所有者和權限信息,用RE管理器改成一樣的就可以了(圖中是u0_a85用戶和組)。如下圖。



       7、把小米文件管理器從緩存的進程中清理掉,再重新打開它,開啓FTP,會看到提示的信息已經變化了,這樣就說明已經成功了,在FTP工具裏面打開該FTP,可以看到已經可以正常讀取到sdcard0和sdcard1了。如下圖。

      


       至此,所有工作都已經完成。實際上還可以用一個更簡單的方法,把手機連接到PC,用cmd裏面的adbshell進入到手機的終端,直接進入對應的目錄便可以直接用sqlite3(Android也自帶了這個)更新數據庫文件,這樣到底是更方便了還是更麻煩了,大家自己可以嘗試一下。



       本文僅做拋磚引玉,類似的直接修改數據庫的還有很多方案,遇到有些問題實在無法解決時,可以嘗試用這個來試試看。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章