2014年11月4日 星期二

Aandroid #adb logcat

#adb logcat

ex:D/PhoneGlobals(  955): - state: CONNECTED
欄位1(D) - Priority,欄位2(PhoneGlobals) - Tag,欄位3(955) - PID,剩餘為訊息內容

Priority
V->Verbose (lowest priority)
D->Debug
I->Info
W->Warning
E->Error
F->Fatal
S->Silent (highest priority)

#adb logcat <TAG>[:priority]

Ex: adb logcat *:D
<tag> is * (= all) and priority is:Debug
Ex: adb logcat TAGNAME:D *:S
指定只有印TAG是TAGNAME的LOG

#adb logcat -b <buffer>

buffer : main, system, radio, events, crash

#adb logcat -v <format>

format : brief, process, tag, thread, raw, time, threadtime, long

參考:
http://developer.android.com/tools/help/logcat.html
http://developer.android.com/tools/debugging/debugging-log.html

2014年10月30日 星期四

Android.mk

LOCAL_SRC_FILES:目前模組包含的所有原始碼檔案。

LOCAL_MODULE:目前模組的名稱,必須為唯一。

LOCAL_C_INCLUDES:C/C++的Head檔路徑。

LOCAL_STATIC_LIBRARIES:目前模組需要的靜態函式庫名稱。

LOCAL_SHARED_LIBRARIES:目前模組需要的動態函式庫名稱。

LOCAL_JAVA_LIBRARIES:目前模組需要的JAVA函式庫名稱。

LOCAL_STATIC_JAVA_LIBRARIES:目前模組需要的JAVA靜態函式庫名稱。

LOCAL_CFLAGS:提供C/C++編譯器的額外編譯參數。

LOCAL_PACKAGE_NAME:目前APK的名稱。

LOCAL_MODULE_TAGS:目前模組所包含的標籤,可以為多個,預設為optional。

LOCAL_REQUIRED_MODULES:指定模組執行時所依賴的模組(模組安裝時將會同時安裝依賴的模組)。

LOCAL_MODULE_PATH:產生模組的路徑。

LOCAL_PRELINK_MODULE:是否需要預先連接處理(預設Ture,用來做動態函式庫優化)


2014年10月29日 星期三

android.os.SystemProperties

透過android.os.SystemProperties設定或取得的Property都是Android系統中的環境變數。 

因為android.os.SystemProperties是被隱藏的(@hide),所以在SDK是沒有的
若要使用android.os.SystemProperties,必須將layoutlib.jar文件import到專案中
layoutlib.jar位於SDK資料夾中,詳細位置為:\sdk\platforms\android-XX\data

Property get :
String android.os.SystemProperties.get(String key)

Property set :
void android.os.SystemProperties.set(String key, String val)

在使用SystemProperties.set的時候,應用程式必須要有對應的權限才可使用。

方法1:(此方法必須在Android系統原始碼環境中編譯)


1.在AndroidManifest.xml中加入android:sharedUserId="android.uid.phone",
或是android:sharedUserId="android.uid.system" 等,是使用的UserId決定,
如下:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    ...
    android:sharedUserId="android.uid.phone" >
<uses-sdk .../>
<application ... 
    <activity .../>
/>
</manifest>

2.在Android.mk文件加入 LOCAL_CERTIFICATE := platform
Android.mk 內容:
LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)



LOCAL_MODULE_TAGS := optional

LOCAL_SRC_FILES := $(call all-java-files-under, src)

LOCAL_CERTIFICATE := platform

LOCAL_PACKAGE_NAME := TelephonyTest



include $(BUILD_PACKAGE)


3.使用mm指令編譯

方法2:(使用裝置Platform金鑰對apk重新簽名)

1.在AndroidManifest.xml中加入android:sharedUserId:"..." (與方法一步驟一相同)

2.先用eclipse編譯出apk (此時的apk無法安裝到裝置)

3.在系統原始碼的"build\target\product\security"目錄中取得platform.pk8與platform.x509.pem
在使用signapk來重新簽名,signapk所在目錄為"build\tools\signapk",
使用方法:java -jar signapk.jar platform.x509.pem platform.pk8 test.apk test_signed.apk
(signapk.jar在 系統原始碼目錄中的/out/host/linux-x86/framework/signapk.jar)

產生出的apk就可安裝在裝置了。



註釋:
每一個程序在建立時會建立一個uid,避免資源被其他程序使用,
Android根據不同的uid來分配不同權限。

程序能夠與系統中已存在的程序使用同一個uid(權限),
只要在AndroidManifest.xml設定sharedUserId。
例如:
android:sharedUserId="android.uid.system"是取得SYSTEM權限
android:sharedUserId="android.uid.phone"是取得RADIO權限
(需注意的是,共享uid必須是同一個signatures)

android.telephony.TelephonyManager

權限加入:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

取得TelephonyManager實體:
TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);   

IMEI碼取得:
String deviceId = tm.getDeviceId();  

相關方法參考:http://developer.android.com/reference/android/telephony/TelephonyManager.html