Android – ¿Cómo puedo establecer dinámicamente el nombre del paquete en el momento de la creación de un proyecto Open-source?
Estoy trabajando en un proyecto Open-source. Como se pretende que cualquiera pueda descargar la fuente y construirla por sí mismo, no quiero codificar el nombre del paquete en ningún lugar , incluida la estructura de directorios.
Yo uso la ant
para la construcción. Al parecer, puedo modificar build.xml
, pero creo que esto es sobrescrito por la android update
. Cualquier cosa que se use será comprometida con el reporte de Git, y no debería ser demasiado complicado.
- Open-Source Ejemplos de aplicaciones Android bien diseñadas?
- Temas y contribuciones para Volley
- Cómo convertir voz humana a nota musical en Android?
- Cualquier fundación para administrar una aplicación de código abierto de Android?
- Aduanas por presentar cambios a un proyecto de código abierto?
Actualmente, el proceso para construir el código directamente desde el reporte de Git es bastante simple. He aquí un extracto del archivo README
:
$ cd ~/src/isokeys/IsoKeys $ android list targets # I build against API level 10. $ android update project --name IsoKeys --target 1 --path ./ # Only needed first time. $ ant debug && adb -d install -r bin/IsoKeys-debug.apk
Para mí, tiene sentido poner el nombre del paquete en local.properties
, porque es .gitignore
'd. Como el nombre del paquete no estará en ningún otro lugar, la compilación fallará sin hacer esto. Por lo tanto, debe haber al menos un paso adicional en el README
, pero quiero mantenerlo al mínimo.
Edit: Por supuesto, otro requisito es que los diffs tienen sentido – que no lo hacen si renombre manualmente el nombre del paquete.
- ¿Hacer un proyecto Android Open Source?
- FEN (notación de ajedrez) al generador de HTML? Java de código abierto
- Buscando referencias de código abierto para la programación de libros electrónicos en Android
- Bibliotecas de código abierto de Android? ¿Vistas reutilizables, ViewGroups, adaptadores etc?
- ¿Existe una biblioteca de código abierto de OCR o sdk (gratuita) para Android e iOS?
- Cómo bifurcar el código de todo el sistema operativo Android?
- openDrawer de espresso contrib está obsoleto
- ¿Existe un código abierto de trabajo RDP Client para Android?
Hice algo similar (pero no por esta razón) que requirió la actualización del manifiesto en el tiempo de construcción. La forma en que logré esto fue haciendo un segundo AndroidManifest y ponerlo en un directorio llamado config. Así que en config / AndroidManifest podría tener algo como esto:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="@CONFIG.APP_PACKAGE_NAME@" android:versionCode="@CONFIG.APP_VERSION_CODE@" android:versionName="@CONFIG.APP_VERSION@"> <!-- EVERYTHING ELSE GOES HERE --> </manifest>
A continuación, puede utilizar los huesos básicos build.xml ant script con sólo unas pocas modificaciones (no hay necesidad de copiar todo el guión del sistema de compilación android, ya que agregó algunos ganchos para que usted pueda utilizar sin reinventar la rueda). El script de compilación debería estar leyendo local.properties de forma predeterminada, pero si no agrega (o descomenta) una línea como esta:
<property file="local.properties" />
En tu script de compilación deberías ver una tarea llamada "-pre-build", cambiarla así:
<target name="-pre-build"> <copy file="config/AndroidManifest.xml" todir="." overwrite="true" encoding="utf-8"> <filterset> <filter token="CONFIG.APP_PACKAGE_NAME" value="${app.packagename}" /> <filter token="CONFIG.APP_VERSION" value="${app.version}" /> <filter token="CONFIG.APP_VERSION_CODE" value="${app.versioncode}" /> </filterset> </copy> </target>
A continuación, su archivo local.properties pondría el nombre del paquete, el nombre de la versión / código así:
app.version=1.0 app.versioncode=1 app.packagename=com.mypackage.name
Ahora sólo tiene que asegurarse en su manifiesto de calificar completamente todas sus actividades / servicios / emisores de radiodifusión, etc. Eso significa que siempre debe especificar el paquete completo de su código fuente. Si quieres que el paquete para tu propio código fuente sea dinámico, puedes reemplazar cada uno de los prefijos de cada clase. Pero eso parece un poco tonto. Es bastante fácil empaquetar tu código con tu propio nombre de paquete y ellos Puede usarlo de cualquier proyecto simplemente incluyendo la fuente o un frasco en su proyecto.
– UPDATE – Oh y otra cosa que puede hacer para notificar al usuario que deben definir un nombre de paquete es utilizar la etiqueta de error en su compilación xml como este:
<fail message="app.packagename is missing. This must be defined in your local.properties file" unless="app.packagename" />
Ponga esto después de la línea que lee el archivo local.properties
Gracias a Matt Wolfe por su ayuda, estoy publicando una respuesta parcial con mis esfuerzos hasta ahora.
Me di cuenta de que el barebones por defecto build.xml
también importa custom_rules.xml
:
<import file="custom_rules.xml" optional="true" />
Así que creé este archivo y comenzó a jugar. Esto es lo que he venido hasta ahora:
<?xml version="1.0" encoding="UTF-8"?> <project name="custom_rules" default="debug"> <target name="-pre-build"> <fail message="Please define app.packagename in your local.properties file." unless="app.packagename" /> <taskdef resource="net/sf/antcontrib/antcontrib.properties"> <classpath> <pathelement location="/usr/share/java/ant-contrib.jar"/> </classpath> </taskdef> <!-- How do I check for propertyregex? <fail message="Depends on ant-contrib's propertyregex for app.packagename.path." unless="propertyregex" /> --> <propertyregex property="app.packagename.path" input="${app.packagename}/" regexp="\." replace="/" global="true" /> <copy todir="build/" overwrite="true" encoding="utf-8"> <fileset dir="./"> <include name="AndroidManifest.xml" /> <include name="res/**" /> <include name="lib/**" /> </fileset> <filterset> <filter token="CONFIG.APP_PACKAGE_NAME" value="${app.packagename}" /> </filterset> </copy> <copy todir="build/src/${app.packagename.path}" overwrite="true" encoding="utf-8"> <fileset dir="./src/isokeys/"> <include name="**" /> </fileset> <filterset> <filter token="CONFIG.APP_PACKAGE_NAME" value="${app.packagename}" /> </filterset> </copy> </target> <target name="-pre-clean" description="Removes output files created by -pre-build."> <delete file="build/AndroidManifest.xml" verbose="${verbose}" /> <delete dir="build/res/" verbose="${verbose}" /> <delete dir="build/lib/" verbose="${verbose}" /> <delete dir="build/src/" verbose="${verbose}" /> </target> <!-- NOW CHANGE DIRECTORY TO build/ BEFORE HANDING BACK OVER TO build.xml!!! --> </project>
Esto configura todo en build/
(que tiene la ventaja añadida de mantener las cosas limpias y ordenadas) , ahora la intención es que las herramientas sdk build.xml
ejecuten desde este directorio build/
. Sin embargo, no puedo encontrar ninguna manera de cd
'ing.
La manera más fácil podría ser reemplazar el nombre del paquete lo más tarde posible. De esta manera, ni siquiera tienes que tocar tu código. Hay un buen artículo llamado Cambiar el nombre del paquete de manifiesto de Android ( http://www.piwai.info/renaming-android-manifest-package/ ). Resumen:
-
Puede utilizar
aapt --rename-manifest-package
para modificar el nombre del paquete -
De forma alternativa, si desea que el reemplazo del nombre del paquete sea una parte del proceso de generación de hormigas, puede anular el objetivo
-package-resources
:- Copie el destino -package
-package-resources
desde build.xml del SDK - Agregar el parámetro
manifestpackage
- Copie el destino -package