Implementación de la función de instalación silenciosa de aplicaciones de Google Play en Android

Hola Expertos / Expertos Hackers,

Estoy intentando implementar la función de instalación silenciosa de la aplicación de Google Play (similar al instalador fast web de appbrain) en android.

Hasta ahora pude lograr lo siguiente:

  1. Descubre un método para recuperar el token de autenticación de Google Play (permitiendo así que mi aplicación pueda hablar con la aplicación de Google Play en el teléfono). He enumerado el código que he utilizado para esto a continuación:

    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") 
  2. Descubra cómo recuperar el ID de Android del teléfono (Esta Id como creo que se debe utilizar al enviar la solicitud appInstall a los servidores GPlay o la aplicación Gplay / vending en el teléfono 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"); 
  3. Descubra la solicitud de búfer de protocolo para enviarla a los servidores de Google Play oa la aplicación Gplay / vending en el teléfono para iniciar el proceso de descarga e instalación de la aplicación silenciosa.

     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.I incluso utilizó el compilador protobuf y generó la clase java para manipular la solicitud de búfer de protocolo anterior y llenó los campos de búfer de protocolo anteriores con algunos datos de ejemplo. Vea el siguiente código:

  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); 

Los datos de ejemplo para GPlay Token y el ID de Android son los siguientes:

  1. Android_ID:

3a0f901831a0f402

  1. Google Play AuthToken:

DQAAAMgAAACpOyPf6apRbb0i4qhTVaf0yYoikTAb4TYlHCRLrW 4mu5f14j-H35KGmO9TQKUDYCfj3-b-QIH5chfXT3bS02Uxljg7vYt4I-kgXLEJwPcynjugDcJ9fYPOh1c2FnOnywFXXxXw6hcqs5sVnJEt 5zW2ditoB5VeeXG9Zfodj9dXKobObi50-XnHoGfWi2b64Uf3EHGdQTsDCMzfZrE4mb22fr9LCW1oZG5tkzw S4KhPBHWMN2fO7w-1IZ4UK5LOI80vPBLjxBaavKAXHoVUHSNV

  1. También hice algunos olfateando usando mi teléfono nexo de la galaxia de la raíz durante la instalación silenciosa de la aplicación de Gplay y encontré solamente dos peticiones del HTTP GET.

He intentado reproducir las dos solicitudes Http GET capturadas usando Shark para root (usando mi teléfono Android neural galaxy) y la 1st Request acaba de descargar el Market File mismo (que pude guardar en la tarjeta SD del teléfono. Se tiene que instalar como cualquier aplicación de fuentes desconocidas) mientras que la segunda solicitud no devuelve nada.

Las dos solicitudes de obtención capturadas se muestran a continuación:

  1. OBTENER UNA SOLICITUD:

     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 
  2. OBTENER PEDIDO DOS:

     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: oo.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 

He estado buscando en esto durante unas dos semanas, pero todavía no podía encontrar lo siguiente:

  1. Si el instalador Web rápido de AppBrain utiliza el búfer de protocolo para invocar el Gplay (aplicación de venta) en el teléfono o los servidores de Gplay? Si es así, el formato de solicitud de memoria intermedia de protocolo anterior es correcto ??.

  2. Si el formato de solicitud de búfer de protocolo anterior es correcto, ¿a dónde debo enviar la solicitud de búfer de protocolo para invocar el procedimiento de descarga e instalación de la aplicación silenciosa?

También tengo un servidor C2DM (ahora GCM) y configuración del cliente alrededor de esta tarea también. ¿Podría alguien señalarme en la dirección correcta o darme alguna pista para resolver esto? Cualquier ayuda es muy apreciada .

La instalación silenciosa en dispositivos con Google Experience sólo es posible con Google Play. De manera más general, sólo las tiendas que vienen precargadas en su hardware pueden lograr esto, ya que necesitan utilizar la clave de firma del sistema operativo.

Esto es por razones de seguridad. Los usuarios deben poder aceptar permisos para nuevas instalaciones. El sistema operativo no tiene forma de verificar si las tiendas no oficiales han hecho esto correctamente.

Las aplicaciones de terceros deben utilizar PackageManager para instalar nuevas aplicaciones, que mostrarán permisos en su nombre y requerirán una aprobación explícita del usuario.

Intentar eludir esto puede caer bajo la cláusula de "acciones prohibidas" del DDA de Google Play, lo que pone en riesgo la suspensión de su cuenta de desarrollador. No lo hagas.

Hay varias acciones que el sistema operativo no permitirá que nadie, pero las aplicaciones de confianza que hacer.

Las aplicaciones que están firmadas con las claves de la plataforma son de confianza por el sistema operativo, por lo que esas aplicaciones pueden hacer más cosas con el teléfono, como las instalaciones silenciosas. Tengo tendencia a ver una aplicación firmada por la plataforma más potente que tener funcionalidad de la raíz sólo porque le permite un acceso más fácil a las intenciones y la API de Android.

No es necesario oler los mensajes que Google Play envía / recibe desde el servidor HTTP … Debe firmar la aplicación con las claves de la plataforma. El problema es que cada portador / fabricante / teléfono / versión podría potencialmente tener diferentes claves de plataforma … Por lo tanto, para lograr esto, tendría que construir varias versiones de su aplicación para cada dispositivo específico …

Algunas compañías firman todos los teléfonos del mismo fabricante con las mismas claves, pero otros utilizan diferentes claves para cada teléfono.

Tendrás que hacer un gran esfuerzo y negociar con los operadores para permitir esta funcionalidad, o confiar en los usuarios de ROOT. O simplemente lanzar su aplicación firmada con las teclas de prueba (las que vienen con el androide SDK) y funcionará con todos los usuarios que tienen una ROM personalizada con las teclas de prueba.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.