2012-09-05 12 views
12

Hola expertos/hackers expertos,La implementación de aplicaciones de Google Play de instalación silenciosa de fondo sobre Android

Estoy tratando de poner en práctica la aplicación Google en silencio Juego función de instalación (similar a AppBrain instalador web rápida) en android.

Hasta ahora era capaz de lograr lo siguiente:

  1. Estudia un método para recuperar el Google Play de autenticación Token (concesión de permisos tanto para mi aplicación para hablar con la aplicación Google Play en el teléfono). He enumerado el código que he usado para este 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. Estudia cómo recuperar el Android-ID del teléfono (este ID ya que creo que se debe utilizar al enviar la solicitud a la AppInstall servidores GPlay o la aplicación/expendedora Gplay en el teléfono androide)

    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. Encuentra la solicitud de búfer de protocolo que se enviarán a Google Play servidores o la aplicación/expendedora Gplay en el teléfono para iniciar la descarga de la aplicación en silencio & proceso de instalación.

    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 se utiliza el compilador protobuf y generó la clase Java para manipular la solicitud de búfer de protocolo arriba y llena los campos búfer de protocolo anteriores con algunos datos de ejemplo. Ver el código de abajo:

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 simbólico y el ello 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 hizo algunas oler usar mi teléfono Galaxy Nexus arraigado durante la aplicación Gplay instalar en silencio y sólo se encuentran dos peticiones HTTP GET.

he intentado reproducir las esas dos peticiones HTTP GET capturados usando tiburón de raíz (usando mi teléfono Galaxy Nexus androide enraizado) y la primera solicitud simplemente descarga el archivo mismo mercado (que yo era capaz de guardar en la tarjeta SD del teléfono. Pero luego debe instalarse como cualquier aplicación de fuentes desconocidas) mientras que la segunda solicitud no devuelve nada.

Las dos peticiones GET capturadas se muestran a continuación:

  1. petición GET UNO:

    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. petición GET 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: 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 
    

he estado investigando esto por alrededor de dos semanas ahora, pero todavía no podía encontrar el siguiente:

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

  2. Si el formato de solicitud de referencia de búfer de protocolo es correcta, entonces a dónde en el teléfono o en el servidor Gplay debería enviar la solicitud de búfer de protocolo para invocar a la descarga de aplicaciones silencioso y procedimiento de instalación?.

También tengo un servidor C2DM (ahora GCM) y la configuración del cliente en 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 .

+1

Tenga en cuenta que el canal para desarrolladores de Android de Google en plus (https://plus.google.com/+AndroidDevelopers/posts) albergará un Q & A en los Servicios de Google Play en un par de horas a partir de ahora. Claramente, su respuesta es anhelar ese formato, pero podría llamar su atención sobre el problema general: son receptivos a las preguntas que incluyen un enlace SO. – Tom

+0

Acabo de leer que Google ha limitado esta característica secreta. Algunas veces, fue posible lograr esto. Pero si puede obtener el apk del mercado y guardarlo, entonces puede hacer la instalación silenciosa en dispositivos rooteados. –

+0

¿Intentó buscar "dentro" del apk? – sherpya

Respuesta

3

La instalación silenciosa en los dispositivos de Google Experience solo es posible con Google Play. De manera más general, solo las tiendas que vienen precargadas en su hardware pueden lograr esto, ya que necesitan usar 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 usar PackageManager para instalar nuevas aplicaciones, que mostrarán los permisos en su nombre y requieren una aprobación explícita del usuario.

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

1

Hay varias acciones que O.S. no permitirá a nadie, pero sí aplicaciones confiables.

Las aplicaciones que están firmadas con claves de plataforma son de confianza por el O.S., por lo que esas aplicaciones pueden hacer más cosas con el teléfono, como las instalaciones silenciosas. Tiendo a ver una aplicación firmada por una plataforma más poderosa que tener funcionalidad de raíz solo porque te permite un acceso más fácil a los intentos y API de Android.

No necesita olfatear los mensajes que Google Play está enviando/recibiendo del servidor HTTP ... Debe firmar su aplicación con las claves de la plataforma. El problema es que cada proveedor/fabricante/teléfono/versión podría tener diferentes claves de plataforma ... Por lo tanto, para lograrlo, necesitaría crear varias versiones de su aplicación para cada dispositivo específico ...

Algunos operadores firman todos los teléfonos del mismo fabricante con las mismas teclas, pero otros usan diferentes claves para cada teléfono.

Deberá hacer un gran esfuerzo y negociar con los operadores para permitir esta funcionalidad, o confiar en los usuarios de ROOT. O simplemente libere su aplicación firmada con claves de prueba (las que vienen con el SDK de Android) y funcionará con todos los usuarios que tengan una rom personalizada con claves de prueba.

Cuestiones relacionadas