2013-06-24 14 views
11

Sto provando a utilizzare una build personalizzata per riconfezionare la mia app per Android. Voglio creare una versione beta interna che posso installare fianco a fianco con la mia app di produzione.Modifica del nome del pacchetto dell'applicazione nel passaggio personalizzato Ant build

This answer sembra esattamente quello di cui ho bisogno, tuttavia non sembra funzionare.

Ecco l'aggiornamento al mio build.xml:

<target 
    name="-package-resources" 
    depends="-crunch" > 

    <echo>Repackaging AndroidManifest.xml to ${package.manifest.name} ${out.absolute.dir}/${resource.package.file.name}</echo> 

    <exec executable="${aapt}" failonerror="true"> 
     <arg value="package" /> 
     <arg value="-f" /> 
     <arg value="--auto-add-overlay" /> 
     <arg value="-M" /> 
     <arg path="AndroidManifest.xml" /> 
     <arg value="-S" /> 
     <arg path="${resource.absolute.dir}" /> 
     <arg value="-S" /> 
     <arg path="${android.library.reference.1}/res" /> 
     <arg value="-A" /> 
     <arg path="${asset.absolute.dir}" /> 
     <arg value="-I" /> 
     <arg path="${project.target.android.jar}" /> 
     <arg value="-F" /> 
     <arg path="${out.absolute.dir}/${resource.package.file.name}" /> 
     <arg value="--rename-manifest-package" /> 
     <arg value="${package.manifest.name}" /> 
    </exec> 
</target> 

esecuzione sembra eseguire correttamente il mio nuovo codice:

ant debug -Dpackage.manifest.name=com.example.test  
...  
-package-resources:  
     [echo] Repackaging AndroidManifest.xml to com.example.test /<mypath>/bin/<appname>.ap_ 
...  
BUILD SUCCESSFUL 

Tuttavia, quando uso APKTool per ispezionare l'APK, il pacchetto il nome nel mio AndroidManifest non è stato modificato nel nuovo valore. Tutto ciò che sembra essere successo è che i miei percorsi di attività relativi ". MyActivity" sono stati estesi al mio nome originale del pacchetto.

apktool d --force bin/<appname>-debug.apk 

Qualcuno sa cosa sto facendo male? Ho esaminato tutte le altre risposte StackOverflow e la maggior parte sembrano un po 'obsolete. Sto costruendo con SDK Tools Android Revisione 21.1.0, per minSdkVersion 8.

Aggiornamento: Come @athor commenti qui sotto la sua risposta, la mia ipotesi circa ispezionare l'AndroidManifest.xml è sbagliato. Per testare questo è effettivamente necessario provare a installarlo piuttosto che visualizzare l'XML decompilato!

risposta

16

Questo è il modo in cui lo faccio (lavorando)

<target 
     name="-package-resources" 
     depends="-crunch" > 

     <!-- only package resources if *not* a library project --> 

     <echo message="Current Package name: ${app.custompackagename}" /> 

     <do-only-if-not-library elseText="Library project: do not package resources..." > 

      <aapt 
       androidjar="${project.target.android.jar}" 
       apkfolder="${out.absolute.dir}" 
       assets="${asset.absolute.dir}" 
       buildType="${build.target}" 
       command="package" 
       debug="${build.is.packaging.debug}" 
       executable="${aapt}" 
       ignoreAssets="${aapt.ignore.assets}" 
       libraryPackagesRefid="project.library.packages" 
       libraryRFileRefid="project.library.bin.r.file.path" 
       libraryResFolderPathRefid="project.library.res.folder.path" 
       manifest="${out.manifest.abs.file}" 
       manifestpackage="${app.custompackagename}" 
       nocrunch="${build.packaging.nocrunch}" 
       previousBuildType="${build.last.target}" 
       resourcefilename="${resource.package.file.name}" 
       resourcefilter="${aapt.resource.filter}" 
       versioncode="${version.code}" 
       versionname="${version.name}" > 

       <res path="${out.res.absolute.dir}" /> 

       <res path="${resource.absolute.dir}" /> 
       <!-- <nocompress /> forces no compression on any files in assets or res/raw --> 
       <!-- <nocompress extension="xml" /> forces no compression on specific file extensions in assets and res/raw --> 
      </aapt> 
     </do-only-if-not-library> 
    </target> 

La linea manifestpackage = "$ {} app.custompackagename" è la chiave.

+0

Stranamente, questo non sembra funzionare neanche per me :-(Stessi sintomi, l'APK viene compilato, ma decomprimerlo mostra che AndroidManifest.xml non ha il nuovo pacchetto. Ho provato a eseguire "ant debug -Dapp" .custompackagename = com.example.test ", e ho provato anche una versione di rilascio.Questo mi sta facendo impazzire ... –

+1

Ho appena decompilato la mia app. Il nome del pacchetto nel file manifest non cambia. in un modo che non influisce su tutte le importazioni ecc. Nella tua app. Quindi il nome del pacchetto nel file manifest rimane lo stesso, ma il nome del pacchetto effettivo è cambiato.Hai provato a installare entrambe le versioni l'una di fianco all'altra? Se il nome del pacchetto non è cambiato, non sarai in grado di ... – athor

+0

Oh wow, hai ragione - si installa bene insieme agli altri APK! Sono piuttosto sorpreso che si comporta in questo modo ... Grazie! –

1

se si vuole veramente le modifiche per riflettere nella vostra AndroidManifest.xml, si potrebbe creare un target personalizzato che è qualcosa di simile (io uso un obiettivo simile a questo me stesso):

<target name="repackage"> 
    <!-- Replaces all of the references to the old package name in files in the "src" directory --> 
    <replace dir="src" value="${new.package}" token="${old.package}" summary="true"/> 

    <!-- renames the src folders --> 
    <move toDir="${new.package.dir}"> 
     <fileset dir="${old.package.dir}"/> 
    </move> 

    <!-- replaces the package name in the manifest --> 
    <replace file="AndroidManifest.xml" value="${new.package}" token="${old.package}" summary="true"/> 
</target> 

Si potrebbe fare un ant build che è stato riconfezionato in un pacchetto di debug, distribuito e quindi riconfezionato nel pacchetto di produzione (o viceversa).

+0

anche rty per aggiungere se si utilizza qualcosa come viste personalizzate nei layout o attrs personalizzati –