Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android Gradle reemplaza Nombre del paquete por un valor en manifiesto

Estoy usando Gradle con sabores de productos donde establezco un nombre de paquete diferente para cada uno.

productFlavors { appone { packageName "com.dg.app1" } apptwo { packageName "com.dg.app2" } appthree { packageName "com.dg.app3" } appfour { packageName "com.dg.app4" } } 

Necesito poder reemplazar el nombre del paquete dentro del manifiesto para cada aplicación correspondiente.

  • Android DownloadManager API - abrir el archivo después de descargar?
  • Gradle invocation "completar con éxito con 1 error" en Ubuntu 13.10
  • Diferencia práctica entre posición e id de fila en onListItemClick ()
  • ¿Cómo encontrar la ubicación del usuario usando la torre celular?
  • ¿Resplandor de encargo del color del resplandor / del borde para ListView?
  • Modificar el título de la alerta () (Javascript en la vista Web de Android)
  • Mi manifiesto tiene esto:

     <receiver android:name="com.parse.GcmBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND"> <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> <category android:name="com.dg.example" /> </intent-filter> </receiver> 

    Así que necesito reemplazar com.dg.example por el nombre del paquete de cada sabor de la aplicación. ¿Cuál es la mejor manera de hacer esto?

  • Restringir Android Widget a una instancia por dispositivo
  • Android: Cómo obtener el dispositivo actual WiFi-nombre directo
  • OnListItemClick no funciona para listview?
  • Android - ¿Cómo puedo desplegar este cuadro de diálogo de alerta?
  • ¿Cómo mostrar el Teclado desde un Servicio?
  • Bloqueo con NoSuchMethodError después proguard con referencias de método
  • 4 Solutions collect form web for “Android Gradle reemplaza Nombre del paquete por un valor en manifiesto”

    Gradle Plugin v0.12 y superior:

    Utilice ${applicationId} lugar de ${packageName} .

    Gradle Plugin v0.11 y superior:

    A partir de v0.11, ya no es necesario especificar que no se utilice la fusión de manifiesto antiguo.

    Gradle Plugin v0.10 y superior:

    Suponiendo que está utilizando la versión 0.10 o superior, ahora se admite oficialmente:

     buildscript { repositories { mavenCentral() } dependencies { // Make sure this is at least 0.10.+ classpath 'com.android.tools.build:gradle:0.10.+' } } 

    A partir de v0.10, también tendrás que activar manualmente la nueva fusión de manifiesto , aunque esperaría que ese requisito desaparezca en una versión o dos cuando la nueva fusión se convierta en el valor predeterminado:

     android { useOldManifestMerger false } 

    Luego, usa ${packageName} en cualquier parte de AndroidManifest.xml para que normalmente codificas el nombre del paquete. Por ejemplo:

     <category android:name="my.package.name"/> 

    se convertiría

    <category android:name="${packageName}"/>


    Gradle Plugin v0.9 y siguientes:

    Por lo tanto, haciendo referencia a esta publicación , parece que esto aún no se admite oficialmente a través de Gradle. Una solución sencilla es la siguiente:

    1. Reemplace el nombre del paquete por una etiqueta personalizada (por ejemplo <category android:name="my.package.name"/> convierte en <category android:name="_PACKAGENAME_"/>
    2. Agregue lo siguiente a su build.gradle , bajo el ámbito de android :

     applicationVariants.all { variant -> // After processing the manifest, replace all instances of your tag // with the variant's actual package name. variant.processManifest << { def manifestOutFile = variant.processManifest.manifestOutputFile def newFileContents = manifestOutFile.getText('UTF-8').replace("_PACKAGENAME_", variant.packageName) manifestOutFile.write(newFileContents, 'UTF-8') } } 

    Para hacer algo como esto, yo uso buildTypes en mi archivo gradle, pero estoy bastante seguro de que esto funcionará con los sabores también. Para mí estoy intentando fijar el campo de la etiqueta en las actividades.

    Tengo un archivo xml de cadenas para cada uno de mis buildTypes. Entonces tengo un sourceSet para cada buildType que incluye el archivo de cadenas correcto. Entonces en el manifiesto no utilizo una cadena codificada dura sino "@ string / my_var" que tirará de la secuencia correcta dependiendo de cómo se definen los conjuntos de fuentes.

    Este mensaje de google + y el tema relacionado pueden ayudar.

    Algo más que hacer es poner un archivo AndroidManifest.xml en el src / sabor que sólo contiene los bits que son relevantes para cada sabor. Luego saca esos bits del archivo de manifiesto principal. En el momento de la compilación, los archivos Manifest se fusionarán en un solo archivo. Puede ver el resultado de todos los manifiestos combinados en build / manifest.

    Tuve el mismo problema e implementé un método de sustitución de marcador de posición en Gradle. Hace exactamente lo que esperas, pero también se preocupa por los atributos packageNameSuffix para poder tener debug y release , así como cualquier otra compilación personalizada en el mismo dispositivo.

     applicationVariants.all { variant -> def flavor = variant.productFlavors.get(0) def buildType = variant.buildType variant.processManifest.doLast { println '################# Adding Package Names to Manifest #######################' replaceInManifest(variant, 'PACKAGE_NAME', [flavor.packageName, buildType.packageNameSuffix].findAll().join()) // ignores null } } def replaceInManifest(variant, fromString, toString) { def flavor = variant.productFlavors.get(0) def buildtype = variant.buildType def manifestFile = "$buildDir/manifests/${flavor.name}/${buildtype.name}/AndroidManifest.xml" def updatedContent = new File(manifestFile).getText('UTF-8').replaceAll(fromString, toString) new File(manifestFile).write(updatedContent, 'UTF-8') } 

    Lo tengo en una gist también si desea ver si evoluciona más tarde.

    Me pareció un enfoque más elegante que los múltiples recursos y enfoques de análisis XML.

    Opción Gradle:

    Utilice API de atributos de grado. Algo como esto

     manifest.attributes(["attr1":"value1", "attr2":"value2"]) 

    Opción 1

    ¿Cómo sobre la conversión de su proyecto a Android – proyecto de la biblioteca, y hacer proyecto adicional para cada empresa. Que puede editar el archivo Manifest como desee.

    opcion 2

    Escribir un archivo por lotes.

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