2010-07-29 16 views
9

Voglio creare un'app in 2 versione, una pagata, una gratuita, e so che aapt ha l'opzione "--rename-manifest-package" dovrebbe aiutare, ma non lo faccio So come usarlo in build.xml. Trovo 2 posto io possa modificare:Personalizzato Android build.xml per rinominare il pacchetto manifest

<!-- first --> 
<target name="-resource-src" depends="-dirs"> 
    <echo>Generating R.java/Manifest.java from the resources...</echo> 
    <exec executable="${aapt}" failonerror="true"> 
     <arg value="package" /> 
     <arg line="${v.option}" /> 
     <arg value="-m" /> 
     <arg value="-J" /> 
     <arg path="${gen.absolute.dir}" /> 
     <arg value="-M" /> 
     <arg path="AndroidManifest.xml" /> 
     <arg value="-S" /> 
     <arg path="${resource.absolute.dir}" /> 
     <arg value="-I" /> 
     <arg path="${android.jar}" />  
    </exec> 
</target> 



<!-- sencod --> 
<target name="-package-resources"> 
    <echo>Packaging resources</echo> 
    <aaptexec executable="${aapt}" 
      command="package" 
      manifest="AndroidManifest.xml" 
      resources="${resource.absolute.dir}" 
      assets="${asset.absolute.dir}" 
      androidjar="${android.jar}" 
      outfolder="${out.absolute.dir}" 
    basename="${ant.project.name}" > 
</aaptexec> 
</target> 

questo articolo (http://blog.uncommons.org/2010/07/19/building-two-versions-of-the-same-android-app/) ha detto che dovrei aggiungere "--rename-manifesto-pacchetto" al secondo posto, ma come?

+1

Si potrebbe prendere in considerazione l'utilizzo di un progetto di libreria Android invece: http://developer.android.com/guide/developing/eclipse-adt.html#libraryProject – CommonsWare

+0

Ho trovato la soluzione qui: http://stackoverflow.com/ questions/17287018/changing-application-package-name-in-custom-ant-build-step –

risposta

8

L'opzione --rename-manifesto-pacchetto non può essere utilizzato con il compito formica aaptexec. È un'opzione che deve andare direttamente all'eseguibile aapt, come questo;

<exec executable="${aapt}" failonerror="true"> 
    <arg value="package" /> 
    <arg value="-f" /> 
    <arg value="-v" /> 
    <arg value="--version-code" /> 
    <arg value="${version.code}" /> 
    <arg value="--debug-mode" /> 
    <arg value="-M" /> 
    <arg path="AndroidManifest.xml" /> 
    <arg value="-A" /> 
    <arg path="${asset.absolute.dir}" /> 
    <arg value="-I" /> 
    <arg path="${android.jar}" /> 
    <arg value="-F" /> 
    <arg path="${out.absolute.dir}/${resource.package.file.name}" /> 
    <arg value="-S" /> 
    <arg path="${resource.absolute.dir}" /> 
    <arg value="--rename-manifest-package" /> 
    <arg value="com.example.pro" /> 
</exec> 

Non ho trovato alcun modo di modificare un file che cambi effettivamente il modo in cui Eclipse si costruisce. Così ho inserito quel pezzo di codice nel file build.xml, inserito nella root del progetto e creato dalla console digitando;

ant debug 

E se si dipende da librerie, hanno bisogno di andare nella confezione pure. Cerca nel tuo file default.properties e vedrai il riferimento alla lib. Quindi aggiungilo alla regola sopra, in questo modo;

<arg value="-S" /> 
<arg path="${android.library.reference.1}/res" /> 

Inizia a sentirsi sempre più simile a un hack che può rompere con qualsiasi aggiornamento di piattaforma SDK.

+0

l'aggiornamento a 2.3 sdk sembra uccidere il tutto ... così triste ... ma ancora grazie per la tua risposta –

+0

I'm in esecuzione 2.3 e sta funzionando. –

+0

Confermo che funziona con la versione corrente (r12) di sdk, usando un semplice esempio. Si noti che l'obiettivo che deve essere sovrascritto è "-package-resources". Cioè: ' Risorse di packaging BoD

2

manifestpackage è il valore arg per option "--rename-manifest-package" per task ant. Usalo per creare diversi pacchetti per la tua app. ignorare

target name="-package-resources" 

da script ant

+0

Sono di fretta e non sto cercando di fare ancora abbastanza ... era solo curioso. Qualcuno può confermare questo metodo funziona? –

+0

Sì, l'attributo manifestpackage è stato introdotto in r17 - vedi [collegamento] (https://android-review.googlesource.com/#/c/32670/) –

2

Recentemente ho bisogno di essere in grado di cambiare il nome del pacchetto di un'applicazione in fase di compilazione. Questa è una necessità comune quando si dispone di una versione a pagamento e gratuita di un'app. E 'anche utile se si vuole essere in grado di installare più versioni di un app sul telefono, come ad esempio una "dev" e una build "stabile".

Un modo per farlo è quello di trasformare l'intero progetto come un progetto di libreria, e quindi creare un progetto definitivo per ogni versione, che dipende dal progetto della libreria.

aapt magia

c'è un altro modo: aapt ha un parametro --rename-manifesto-pacchetto che riscrive il nome del pacchetto del file AndroidManifest.xml binario in APK finale.

Ecco cosa aapt aiuto dice:

--rename-manifest-package 
     Rewrite the manifest so that its package name is the package name 
     given here. Relative class names (for example .Foo) will be 
     changed to absolute names with the old package so that the code 
     does not need to change. 

Il grande vantaggio è che il codice non cambierà, la classe R rimane identico.

Ant

Dal r17, questa opzione è disponibile nel compito Ant aapt, attraverso l'attributo manifestpackage.Avrete bisogno di ignorare il bersaglio CONFEZIONE-risorse, copiato dal build.xml SDK:

<target name="-package-resources" depends="-crunch"> 
    <do-only-if-not-library elseText="Library project: do not package resources..." > 
    <aapt executable="${aapt}" 
    manifestpackage="com.my.package" 
    > 
... 
    </aapt> 
    </do-only-if-not-library> 
</target> 

Maven

L'androide: obiettivo apk del Android-maven-plugin ha un renameManifestPackage parametro.

Un'ultima cosa

Se si carica alcuni ID di risorse in fase di esecuzione, potrebbe essere necessario aggiornare il codice.

ho usato per fare questo:

String packageName = context.getPackageName(); 
Resources res = context.getResources(); 
int id = res.getIdentifier("my_drawable", "drawable", packageName); 

Questo di solito funziona bene, soprattutto nei progetti di libreria in cui non si conosce il nome del pacchetto.

Tuttavia, il problema qui è che le risorse sono state elaborate prima che il nome del pacchetto fosse finalmente aggiornato. Quindi packageName è sbagliato.

E 'facile da risolvere, però, recuperando il nome del pacchetto di un'altra risorsa con Resources.getResourcePackageName().

Creiamo un ID di risorsa dedicata a tale scopo, per esempio in res/Valori/ids.xml:

<?xml version="1.0" encoding="utf-8"?> 
<resources xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item name="used_for_package_name_retrieval" type="id"/> 
</resources> 

E ora otteniamo il pacchetto giusto:

Resources res = context.getResources(); 
String packageName = res.getResourcePackageName(R.id.used_for_package_name_retrieval); 
int id = res.getIdentifier("some_drawable", "drawable", packageName); 

Conclusione

Questo suggerimento consente di creare diverse versioni della stessa app.

+0

È consigliabile fornire un riepilogo dal collegamento per completezza. – VahidNaderi

+1

L'articolo menzionato qui è utile a causa del fatto che il nome del pacchetto non è stato modificato completamente durante la compilazione e che il metodo Resources.getIdentifier() non funziona come previsto. Questo ti colpirà se vuoi cambiare il nome del pacchetto dalla formica per un progetto PhoneGap (corvova). –

+0

l'unica cosa che aggiungerei è che puoi aggiungere la personalizzazione in custom_rules.xml che androids build.xml importa – tik27

Problemi correlati