Привет, эксперты/экспертные хакеры,
Я пытаюсь внедрить функцию автоматической установки приложения Google Play (аналогичную быстрой установке веб-приложения appbrain) на Android.
До сих пор мне удалось добиться следующих результатов:
-
Узнайте, как получить токен Google Play Auth (таким образом, для моего приложения разрешено разговаривать с приложением Google Play на телефоне). Я перечислил код, который я использовал для этого ниже:
Log.i(TAG,"Getting the Google Play Auth Token Using Account Manager : START"); AccountManager accountManager = AccountManager.get(getApplicationContext()); Account[] accArr = accountManager.getAccountsByType("com.google"); for (Account acc : accArr) { Log.i(TAG, "For Account Name : " + acc.name + " - "+ "Account Type : " + acc.type); accountManager.getAuthToken(acc, "googleplay", null, this,new AccountManagerCallback<Bundle>() { public void run( AccountManagerFuture<Bundle> paramAccountManagerFuture) { try { Bundle localBundle = (Bundle) paramAccountManagerFuture.getResult(); String authToken = localBundle.get("authtoken") + ""; Log.i(TAG, "Got AuthToken : " + authToken); } catch (Exception ex) { StackTraceElement[] starray = ex.getStackTrace(); StringBuffer bf = new StringBuffer(); bf.append("Error : " + ex.getMessage()).append("\n"); for (StackTraceElement ste : starray) { bf.append(ste.toString()).append("\n"); } Log.e(TAG, bf.toString()); } } }, null); } Log.i(TAG,"Getting the Google Play Auth Token Using Account Manager : END")
-
Узнайте, как получить Android-идентификатор телефона (этот идентификатор, как я полагаю, следует использовать при отправке запроса appInstall на серверы GPlay или приложение Gplay/vending на Android-телефоне)
Log.i(TAG, "Getting the Android ID Of the Phone : START"); Uri localUri = Uri.parse("content://com.google.android.gsf.gservices"); ContentResolver localContentResolver = getContentResolver(); String[] arrayOfString = new String[1]; arrayOfString[0] = "android_id"; Cursor localCursor = localContentResolver.query(localUri, null,null, arrayOfString, null); Log.i(TAG, "Column Count : " + localCursor.getColumnCount()); if ((localCursor != null) && (localCursor.moveToFirst())) { String androidId = Long.toHexString(Long.parseLong(localCursor.getString(1))); Log.i(TAG, "Received Android ID : " + androidId); Log.i(TAG,"Other Value in Column : " + localCursor.getString(0)); } Log.i(TAG,"Getting the Android ID of the Phone : END");
-
Узнайте, какой запрос буфера протокола должен быть отправлен на сервер Google Play или приложение Gplay/vending на телефоне, чтобы начать процесс загрузки и установки беззвучного приложения.
message InstallRequest { optional string appId = 1; } message RequestContext { required string authSubToken = 1; required bool isSecure = 2; required int32 version = 3; required string androidId = 4; optional string deviceAndSdkVersion = 5; optional string userLanguage = 6; optional string userCountry = 7; optional string operatorAlpha = 8; optional string simOperatorAlpha = 9; optional string operatorNumeric = 10; optional string simOperatorNumeric = 11; } message Request { optional RequestContext context = 1; repeated group RequestGroup = 2 { optional InstallRequest installRequest = 10; } }
4. Я даже использовал компилятор protobuf и сгенерировал класс java для управления указанным выше запросом буфера протокола и заполнил вышеуказанные поля буфера протокола некоторыми выборочными данными. См. Код ниже:
public void buildAndSendSilentInstallProtoBuffMessage(String gplayAuthToken, String deviceAndroidId){
try{
/*
* The Root Request Object Assumed to be Holding the Silent Install Request
*/
Request.Builder request = Request.newBuilder();
//Populating the ReequestContext Object
RequestContext.Builder context = RequestContext.newBuilder();
context.setAndroidId(deviceAndroidId);
context.setAuthSubToken(gplayAuthToken);
context.setIsSecure(true);
context.setVersion(1002);
context.setDeviceAndSdkVersion("dream:4");
context.setUserLanguage("en");
context.setUserCountry("us");
context.setOperatorAlpha("Android");
context.setOperatorNumeric("310260");
context.setSimOperatorNumeric("310260");
//Building the Install Request
InstallRequest.Builder installRequest = InstallRequest.newBuilder();
installRequest.setAppId("-2564446724934482383");
//Setting the Install Request to the Request Group
RequestGroup.Builder requestGroup = RequestGroup.newBuilder();
requestGroup.setInstallRequest(installRequest);
//Setting the Request Context to the Main Request Object
request.setContext(context);
//Setting the Request Group to the Request Object
request.addRequestGroup(requestGroup);
Образцы данных для GPlay Token и Android Id следующие:
- Android_ID:
3a0f901831a0f402
- Google Play AuthToken:
DQAAAMgAAACpOyPf6apRbb0i4qhTVaf0yYoikTAb4TYlHCRLrW 4mu5f14j-H35KGmO9TQKUDYCfj3-б-QIH5chfXT3bS02Uxljg7vYt4I-kgXLEJwPcynjugDcJ9fYPOh1c2FnOnywFXXxXw6hcqs5sVnJEt 5zW2ditoB5VeeXG9Zfodj9dXKobObi50-XnHoGfWi2b64Uf3EHGdQTsDCMzfZrE4mb22fr9LCW1oZG5tkzw S4KhPBHWMN2fO7w-1IZ4UK5LOI80vPBLjxBaavKAXHoVUHSNV
- Я также немного понюхал, используя мой встроенный телефон галактики Nexus во время установки Gplay без установки и нашел только два запроса HTTP GET.
Я попытался воспроизвести эти два запроса Http GET, захваченные с помощью Shark для root (используя мой встроенный гаджет галактики галактики Android), а 1-й запрос просто загружает сам файл Market (который я смог сохранить на SD-карте телефона Но тогда он должен быть установлен как любое приложение неизвестных источников), в то время как второй запрос ничего не возвращает.
Два захваченных запроса получаются ниже:
-
ПОЛУЧИТЕ ЗАПРОС:
21 0.827240 192.168.135.102 173.194.36.4 HTTP 535 GET /market/download/Download? packageName=com.gau.go.launcherex.theme.appwidget.gopowermaster.futureworld&versionCode=1&token=AOTCm0QRnH3rmypWtCGoAL_SU1BSt311wpyz-_LZTodkUSAlc- f5SrdMiz5WDRDUKMMm6S3plBI9Jbh1tukT1jyCYXLgP4QhVvZvn5JLtZQ&downloadId=-165214892049282883 HTTP/1.1 Which has the following http headers : Cookie: MarketDA=17214805622679635526\r\n Host: android.clients.google.com\r\n Connection: Keep-Alive\r\n User-Agent: AndroidDownloadManager/4.1.1 (Linux; U; Android 4.1.1; Galaxy Nexus Build/JRO03C)\r\n
-
ПОЛУЧИТЕ ЗАПРОС ДВА:
44 6.595093 192.168.135.102 222.165.163.15 HTTP 608 GET /market/GetBinary/com.gau.go.launcherex.theme.appwidget.gopowermaster.futureworld/1?expire=1346838270&ipbits=0&ip=0.0.0.0&cp=SnpybWlzSFk6OTYzMzg0MTE2NzA1ODEwOTYxMjE&sparams=expire,ipbits,ip,q:,cp&signature=2C0778C4635F6F8AE1DA8479FB08DCB9BC04C2E9.60202D8D4D2FDDA70609A3862A25852F0BAA2766&key=am2 HTTP/1.1 Which has the following http headers : Cookie: MarketDA=17214805622679635526\r\n Host: o-o.preferred.slt-cmb2.v12.lscache4.c.android.clients.google.com\r\n Connection: Keep-Alive\r\n User-Agent: AndroidDownloadManager/4.1.1 (Linux; U; Android 4.1.1; Galaxy Nexus Build/JRO03C)\r\n
Я рассматривал это примерно две недели, но я все еще не мог найти следующее:
-
Быстро ли веб-установщик AppBrain использует буфер протокола для вызова Gplay (вендинговое приложение) на телефоне или серверах Gplay? Если это так, то формат протокола буфера протокола правильный.
-
Если формат запроса на превышение протокола буфера корректен, а затем в "Где на сервере Phone или Gplay" я должен отправить запрос буфера протокола для вызова процедуры загрузки и установки Silent Application?.
У меня также есть сервер и клиентская среда C2DM (теперь GCM) и вокруг этой задачи. Может ли кто-нибудь указать мне в правильном направлении или дать мне какие-либо подсказки для решения этой проблемы? Любая помощь очень ценится.