前幾天,為瞭解決一個問題,逆瞭一個小工具軟件。在這個過程發現瞭一些很有用的東西,在此跟大傢分享一下。首先聲明幾點:1、逆出來的代碼,需要大量的人工分析,我現在隻看瞭一點點;2、代碼不會公開,請不要向我要代碼,我怕麻煩~~~唉,做瞭這件壞事,內心忐~~~忑~~~啊!
一、通過編程實現對GPS的開關
在Android手機和模擬器上有一個管理GPS開關的設置界面,如下:
通過這個管理界面,我們可以對GPS進行管理,以實現我們的手機定位功能。曾經在網上搜集資料,希望找到通過代碼對GPS進行管理的源碼,也確實找到瞭一份代碼(稍後附上代碼),但是這份代碼在SDK 2.3及以上的版本中,始終不能運行。於是,產生瞭一個逆向的邪念~
在分析上面提到的小工具之後,發現瞭其對GPS管理的功能模塊,經過簡單的分析之後,發現在Android SDK版本不同的情況下,對GPS控制的代碼還不一樣。首先附上在2.2版本及以前版本的GPS控制代碼:
/**
* 實現瞭一個GPS的開關,當前關閉則打開,當前打開則關閉
* 適用版本號:
* 1.6 / 2.1 / 2.2
*
* Uri.parse()的參數”custom:3″中的數字3的枚舉值如下:
* private static final int BUTTON_BLUETOOTH = 4;
* private static final int BUTTON_BRIGHTNESS = 1;
* private static final int BUTTON_GPS = 3;
* private static final int BUTTON_SYNC = 2;
* private static final int BUTTON_WIFI = 0;
*
*/
private void toggleGPS() {
// 當SDK版本號為2.3以下版本時
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.GINGERBREAD) {
Intent gpsIntent = new Intent();
gpsIntent.setClassName(“com.android.settings”,
“com.android.settings.widget.SettingsAppWidgetProvider”);
gpsIntent.addCategory(“android.intent.category.ALTERNATIVE”);
gpsIntent.setData(Uri.parse(“custom:3”));
try {
PendingIntent.getBroadcast(this, 0, gpsIntent, 0).send();
} catch (CanceledException e) {
e.printStackTrace();
}
}
}
以上這段代碼,是利用Android平臺自帶的Widget插件對各種開關進行管理的。實現的是一個GPS的開關,如果當前GPS處於關閉狀態,則將其打開;如果GPS處於打開狀態,則將其關閉。
大傢可能已經註意到函數體內部的第一行註釋“當SDK版本號為2.3一下版本時”,的確我們在這裡做瞭一個針對SDK版本的判斷。這一個判斷也是我們下一個小節要重點介紹的內容,暫時放在一邊,不要在這一節裡面跑偏瞭。
在SDK 2.3及之後的版本中,那個小工具利用瞭SDK中的類Settings.Secure的一個靜態方法:
public static final void setLocationProviderEnabled (ContentResolver cr, String provider, boolean enabled)
Since: API Level 8
Thread-safe method for enabling or disabling a single location provider.
Parameters
cr | the content resolver to use |
---|---|
provider | the location provider to enable or disable |
enabled | true if the provider should be enabled |
這個方法從API Level 8才開始提供,API Level 8對應的SDK版本是2.2,OK!那按照正常情況來說,這個函數應該是支持SDK2.3的。不妨寫個函數來試試。(這個代碼比較簡單,我就不再貼代碼瞭)結果卻令人意外,沒有給用戶分配權限”android.permission.WRITE_SETTINGS”;好嘛,那就加上權限;又提示沒有權限“android.permission.WRITE_SECURE_SETTINGS”,好說,再加上這個權限。接下來,見證悲催的時刻到瞭,還是提示沒有“android.permission.WRITE_SECURE_SETTINGS”的權限。明明已經加上瞭權限,為何還是提示。最後也是在各種大小論壇裡面查找資料,說是在2.3版本裡面,Google把這個權限完全鎖住瞭,好吧,悲劇瞭,除非你自己改Android代碼,否則就真的沒有別的辦法瞭。
所以,在第一節結束的時候,提醒各位童鞋,如果想在SDK2.3版本管理GPS,還是乖乖的用你的Intent打開系統默認的管理GPS的Activity吧。
二、SDK版本對照
為瞭下載android SDK的源碼,我到處找鏈接,好不容易一個鏈接,發現文件名後面怎麼還有一個類似英文名的東西?
的確,像我這樣的初學者,是不知道這個英文單詞代表什麼意思的。但是在逆代碼的過程,發現瞭Android API給我們提供瞭這樣個類android.os.Build,在這個類中定義瞭Android SDK每個版本的版本號,版本名,以後其他一些信息,感興趣的同學可以去開發文檔中看看。
這裡的英文單詞,就是每個SDK版本的版本名稱。
VERSION_CODES