2011年9月28日 星期三

在adb中使用sqlite

Step:
1. adb shell
2. sqlite3 data/data/com.android.providers.settings/databases/settings.db
3. select * from system;         //show all value in this talbe.
4. update system set value="0" where name ="accelerometer_rotation";  
5. .database  //show database
6. .table         //show table
7. .quit        //exit
8. delete from system where id=0;   //delete
9. create table test(one varchar(10), two smallint);
10. insert into test values('goodbye', 20);
11. .help

2011年9月21日 星期三

將APK加到system.img

添加 HelloAndroid.apk
首先在 Android 源始碼建立一個目錄:
mkdir -p prebuilt/android-arm/HelloAndroid


建立一個 Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

# Module name should match apk name to be installed.
LOCAL_MODULE := HelloAndroid
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := platform
LOCAL_MODULE_TAGS := debug

include $(BUILD_PREBUILT)

$(call add-prebuilt-files, APPS, $(prebuilt_files))
 
詳細參考android open source website
http://www.kandroid.org/online-pdk/guide/build_cookbook.html 

修改android settings default value

settings default value
android settings的default value大多可以在/frameworks/base/packages/SettingsProvider/res/values/default.xml 中找到.

overwirte settings value
在device下,所屬的產品目錄下利用overlay,新增相同的路徑及需要overwrite的檔案(default.xml). 將所需要修改的設定值寫入default.xml中.

ex: /device/nvidia/ventana_cts/overlay/frameworks/base/packages/SettingsProvider/res/values/default.xml

default.xml 撰寫規則

<?xml version="1.0" encoding="utf-8"?>
<resources>
     <add-resource type="bool" name="def_adb_enabled"/>
         <bool name="def_adb_enabled">true</bool>
     <integer name="def_screen_off_timeout">1800000</integer>
</resources>

若是原先在default.xml中沒有的項目,利用tag "add-resource ", 若是已經存在,就直接寫入新的預設值.

其它失敗情形 
少數項目還是無法修改,則直接修改/frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
及 /frameworks/base/packages/SettingsProvider/res/values/default.xml
 加入下列子串

DatabaseHelper.java :
loadBooleanSetting(stmt, Settings.Secure.ACCESSIBILITY_ENABLED,
                    R.bool.def_accessibility_enabled);
default.xml :
<bool name="def_accessibility_enabled">true</bool>

2011年9月14日 星期三

在Ubuntu上使用adb

在任何路徑下皆可執行adb
修改bashrc
favoritepili@favoritepili-AS5551:~$sudo gedit /.bashrc
加入下面文字.
#Android adb
export PATH=${HOME}/Android/android-sdk-linux_x86/platform-tools/:$PATH
or
sudo ln -s /home/kelsey_lai/Android/android-sdk-linux/platform-tools/adb /bin/adb

adb shell無法執行
執行adb shell 顯示 "error: insufficient permissions for device"
favoritepili@favoritepili-AS5551:~$ adb devices
List of devices attached ????????????    no permissions

1. 使用root權限
favoritepili@favoritepili-AS5551:~$sudo -s
[sudo] password for favoritepili:
root@favoritepili-AS5551:~# adb kill-server ; adb start-server
* daemon not running. starting it now *
* daemon started successfully *
root@favoritepili-AS5551:~# exit
exit
favoritepili@favoritepili-AS5551:~$
再次執行adb shell就可以了。

2.
轉到adb目錄
favoritepili@favoritepili-AS5551:~$cd ~/Android/android-sdk-linux_x86/platform-tools
favoritepili@favoritepili-AS5551:~/Android/android-sdk-linux_x86/platform-tools$ ls -l adb
-rwxr-xr-x 1 favoritepili favoritepili  341694 2010-05-11 05:46 adb
favoritepili@favoritepili-AS5551:~/Android/android-sdk-linux_x86/platform-tools$ sudo chown root:root adb
[sudo] password for favoritepili:
favoritepili@favoritepili-AS5551:~/Android/android-sdk-linux_x86/platform-tools$ ls -l adb
-rwxr-xr-x 1 root root   341694 2010-05-11 05:46 adb
favoritepili@favoritepili-AS5551:~/Android/android-sdk-linux_x86/platform-tools$ sudo chmod u+s adb
favoritepili@favoritepili-AS5551:~/Android/android-sdk-linux_x86/platform-tools$ ls -l adb
-rwsr-xr-x 1 root root   341694 2010-05-11 05:46 adb
favoritepili@favoritepili-AS5551:~/Android/android-sdk-linux_x86/platform-tools$
這樣無論那個用戶啟動adb皆是root權限.

PS.
adb pull下來的文件主權限為root:root,所以修改起来不方便.

2010年10月27日 星期三

應用程式如何取得系統權限

在Android上執行不同的apk會跑在不同的sandbox上, 並且以不同的身份(uid)在執行, 但問題是我今天想要用system身份做某些事或是想要在不同的app分享資源時, 就會需要能對apk指定uid, 方法有兩種分別說明如下:

方法一
1.修改AndroidManifest.xml, 新增android:sharedUserId="android.uid.system"屬性(使用system身份)
2.修改Android.mk文件,加入LOCAL_CERTIFICATE := platform這一行

3.重新編譯apk

PS. LOCAL_CERTIFICATE := platform, 由於試驗的這份source code 是由客戶提供,所以"platform"這個關鍵字已經被定義好了.

方法二
1.如方法一修改AndroidManifest.xml, 新增 android:sharedUserId="android.uid.system" 屬性(使用system身份)
2.使用Eclipse編譯出apk
3.刪除該apk中META-INF目錄下的CERT.SF和CERT.RSA兩個檔案
4.以系統的public/private key重新簽署打包apk, signapk的用法為

Usage: signapk [-w] publickey.x509[.pem] privatekey.pk8 input.jar output.jar
5.實際執行命令如下.
$java -jar signapk.jar -w ./platform.x509.pem ./platform.pk8 ./input.apk ./output.apk(此為將所有檔案放於同一路徑下)

PS. signapk.jar , platform.x509.pem, platform.pk8可於source code中取得
如果想要不同的apk以相同的uid身份在執行, 則在這些不同的APK中AndroidManifest.xml的語法為

manifest xmlns:android="http://schemas.android.com/apk/res/android" android:sharedUserId="{MY.URI.FORMAT}"

在Ubuntu上安裝及設定NDK

1. 下載NDK for Ubuntu,位置可任意決定.

2. 編輯 bashrc
    1) 於終端機下command "sudo gedit ~/.bashrc", 添加下面文字.
    2) NDK_ROOT=android_ndk_path, 後面的目徑是NDK的目錄,前面的名稱可任取.
         ex: NDK_ROOT=/home/favoritepili/Android/android-ndk-r4b/
     3) export NDK_ROOT
     4)儲存,離開.
     PS.  由於是下載r4版,所以從此版開始不需要修改host-setup.sh

3. 測試
     1) 進入目標compile目錄. ex: "/home/favoritepili/Android/android-ndk-r4b/samples/hello-jni"
     2) type "$NDK_ROOT/ndk-build
     3) 如果成功會產生obj及libs兩個目錄

4. error
   1) 如果有錯誤訊息"Your APP_BUILD_SCRIPT points to an unknown file".
       確認你的路徑有沒有設錯, APP_BUILD_SCRIPT設定在project的.mk檔中.

   2)可以type command "$NDK_ROOT/ndk-build NDK_LOG=1", 來查看有何問題.

建立Windows cmd.exe 的shortcut

建立Windows cmd.exe shortcut

1. 在檔案總管任意路徑下按右鍵選"新增","捷徑".
2. 在輸入項目的位置中打"%COMSPEC%",然後按下一步.
3. 捷徑的名稱可任意取,然後按完成.
4. 點選此捷徑按右鍵.
5. 於"捷徑"此分頁中的"開始位置"輸入你想要執行cmd.exe時的預設位置. ex:"F:\Tools\AndroidNeedTools\android-sdk-windows\tools"
6. 完成.