2012-01-26 11 views
39

È possibile specificare l'ubicazione di un keystore di debug creato automaticamente durante la creazione del debug .apk (<project-name>-debug.apk) con ant debug? Vedo solo la possibilità di specificare la posizione del keystore di rilascio.Come specificare la posizione del keystore di debug per le build di debug della form Android?

Vorrei condividere il keystore di debug su più PC senza copiarli su quello che si trova nella directory '.android'. Il keystore di debug potrebbe, ad esempio, risiedere nel repository del codice sorgente. Ma ho bisogno di un modo per dire a formica dove trovare il keystore di debug.

+0

Perché non copiarlo? – onit

+2

perché voglio aggiungere quei file al controllo di versione – Huupke

risposta

4

È possibile rimuovere la firma del apk finale e firmare di nuovo. È solo una build di debug, quindi lo zipalign può essere evitato (almeno non ho problemi nella mia build).

Copiare il chiavi in ​​un file debug.keystore nel progetto e aggiungere il seguente in ant.properties

debug.key.store.password=android 
debug.key.alias.password=android 
debug.key.store=../debug.keystore 
debug.key.alias=androiddebugkey 

e aggiungere il seguente nella vostra build.xml

<target name="-post-build" if="${build.is.packaging.debug}"> 
    <!-- Remove the signature of the debug build, and sign it again with our own debug keystore --> 
    <delete dir="tmp" includeemptydirs="true" failonerror="false" /> 
    <mkdir dir="tmp" /> 
    <unzip src="${out.final.file}" dest="tmp" /> 
    <delete dir="tmp/META-INF" includeemptydirs="true" verbose="true" failonerror="true" /> 
    <delete file="${out.final.file}" failonerror="true" /> 
    <zip destfile="${out.final.file}" basedir="tmp" /> 
    <delete dir="tmp" includeemptydirs="true" failonerror="false" /> 

    <echo level="info">Signing final DEBUG apk with a common signature... 
     signapk 
      input="${out.final.file}" 
      output="${out.packaged.file}" 
      keystore="${debug.key.store}" 
      storepass="${debug.key.store.password}" 
      alias="${debug.key.alias}" 
      keypass="${debug.key.alias.password}" 
    </echo> 

    <signapk 
     input="${out.final.file}" 
     output="${out.packaged.file}" 
     keystore="${debug.key.store}" 
     storepass="${debug.key.store.password}" 
     alias="${debug.key.alias}" 
     keypass="${debug.key.alias.password}"/> 

    <delete file="${out.final.file}" failonerror="true" /> 
    <move file="${out.packaged.file}" tofile="${out.final.file}" failonerror="true" /> 

</target> 
+0

Solo questo approccio funziona. Grazie! –

+0

ha funzionato davvero bene. – Richa

19

Si dovrebbe essere in grado di specificare l'archivio di chiavi da utilizzare con queste proprietà

key.store=/path/to/key.keystore 
key.alias=alias 
key.store.password=pass 
key.alias.password=pass 

Basta passare le proprietà per Ant.

[EDIT] Dalla documentazione in http://developer.android.com/guide/publishing/app-signing.html#setup

Gli strumenti di generazione di Android forniscono una modalità di firma di debug che rende più facile per voi per sviluppare ed eseguire il debug dell'applicazione, pur continuando a soddisfare i requisiti di sistema Android per la firma tuo. apk. Quando si utilizza la modalità di debug per creare la propria app, gli strumenti SDK invocano Keytool per creare automaticamente un keystore e una chiave di debug. Questa chiave di debug viene quindi utilizzata per firmare automaticamente .apk, quindi non è necessario firmare il pacchetto con la propria chiave.

Gli strumenti SDK creare il debug di chiavi/chiave con i nomi prestabiliti/password:

  • nome Keystore: "debug.keystore"
  • password dell'archivio chiavi: "Android"
  • alias chiave: "androiddebugkey "
  • parola chiave: "Android"
  • CN: "CN = Android Debug, O = Android, C = US"

Se necessario, è possibile modificare la posizione/il nome del keystore/chiave di debug o fornire un keystore/chiave di debug personalizzato per utilizzare. Tuttavia, qualsiasi keystore/chiave di debug personalizzato deve utilizzare lo stesso keystore/nomi di chiavi e password come chiave di debug predefinita (come descritto sopra). (Per farlo in Eclipse/ADT, andare su Windows> Preferenze> Android> Build.)

+2

sembra che questo non funzioni per il debug ma solo per il rilascio. Sei sicuro che funzioni per firmare l'apk di debug? – Huupke

+0

Probabilmente è possibile solo sovrascrivere il keystore nella posizione predefinita. Per le chiavi di piattaforma o di rilascio, specificare la posizione è possibile per le proprietà menzionate sopra. – Huupke

+3

Le preferenze di Eclipse non vengono utilizzate quando si costruisce sulla riga di comando usando formica quale era la mia domanda. key.store viene omesso durante la creazione di debug. – Huupke

11

Per quanto posso dire, per fare ciò è necessario sovrascrivere il target "-do-debug". Mi piacerebbe sapere se c'è un modo più elegante, però. Ho aggiunto questo al mio build.xml

<property name="build.is.signing.debug" value="false"/> 
<target name="-do-debug" depends="-set-debug-mode, -debug-obfuscation-check, -package, -post-package"> 
    <!-- only create apk if *not* a library project --> 
    <do-only-if-not-library elseText="Library project: do not create apk..." > 
     <sequential> 
      <property name="out.unaligned.file" location="${out.absolute.dir}/${ant.project.name}-debug-unaligned.apk" /> 

      <!-- Signs the APK --> 
      <echo>Signing final apk...</echo> 
      <signjar 
        jar="${out.packaged.file}" 
        signedjar="${out.unaligned.file}" 
        keystore="${key.store}" 
        storepass="${key.store.password}" 
        alias="${key.alias}" 
        keypass="${key.alias.password}" 
        verbose="${verbose}" /> 

      <!-- Zip aligns the APK --> 
      <zipalign-helper 
        in.package="${out.unaligned.file}" 
        out.package="${out.final.file}" /> 
      <echo>Debug Package: ${out.final.file}</echo> 
     </sequential> 
    </do-only-if-not-library> 
    <record-build-info /> 
</target> 
<import file="${sdk.dir}/tools/ant/build.xml" /> 
+0

Non sono sicuro cosa non va, ma quando eseguo Ant usando questo metodo sto ricevendo un avviso: "No -tsa o -tsacert è fornito e questo jar non è timestamp." Quando si tenta di installare l'APK risultante, viene visualizzato "Errore [INSTALL_PARSE_FAILED_NO_CERTIFICATES]". L'esportazione tramite Eclipse sembra funzionare, tuttavia. Qualche idea? –

+0

L'esecuzione di 'jarsigner' sull'APK dopo l'esecuzione di Ant fornisce effettivamente una SecurityException, quindi sembra che non venga firmata correttamente. –

+0

Sembra che la proprietà 'build.is.signing.debug' sia in conflitto con questo metodo, dato che' apkbuilder' lo firma già utilizzando il keystore di debug nella directory home. Sono riuscito a risolvere questo superando il target '-setup' e impostando la proprietà su false. –

4
  • Creare una cartella nuova e vuota all'interno del vostro spazio di lavoro Eclipse.

  • Copia il file "debug.keystore" dalla sua posizione standard (ad es. "C: /Users/YourAcount/.Android/" su Windows) nella nuova directory.

  • Configurare Eclipse di utilizzare tale nuova directory/file di debug per tutti APK (Eclipse -> Finestra -> Preferenze -> Android -> Build -.> Custom Debug Keystore"

+1

Il titolo indica esplicitamente "Specificare il percorso del keystore di debug per Android * commandline/ant build *" –

+0

Siamo spiacenti, colpa mia. –

+0

Dovresti essere in grado di eliminare la tua risposta se è sbagliata. – Flow

0

Per quanto ho visto finora nessuna soluzione esistente funziona con l'ultima versione di ant.

L'unico modo primitivo per farlo è sostituire la cartella predefinita predefinita debug.keystore.

Il percorso predefinito è la cartella .android. Di solito in C: \ Users \ USER_NAME.android In Windows è possibile raggiungerlo utilizzando% USERPROFILE% .android.

Quello che ho fatto è creare uno script PowerShell per eseguire il backup del file predefinito, copiare il file keystore nel percorso predefinito, creare l'apk di debug firmato, eliminare il file del keystore, ripristinare il file originale.

Fatemi sapere se avete bisogno di maggiori informazioni qui.

4

Un metodo semplice che è possibile utilizzare come soluzione (che è particolarmente utile nel nostro sistema CI in cui sono stati creati molti progetti e dove è richiesto un tocco morbido quando si gestiscono i keystore), è quello di andare avanti ed eseguire il debug build, usa AAPT per rimuovere il contenuto della cartella META-INF ed esegui jarsigner per firmarlo con il tuo debug.keystore personalizzato.

In pseudo-script, sembra che: # normale Ant build di debug formica di debug

# Remove default debug signing 
aapt remove YourDebugApp.apk META-INF/MANIFEST.MF 
aapt remove YourDebugApp.apk META-INF/CERT.SF 
aapt remove YourDebugApp.apk META-INF/CERT.RSA 

# Use Jarsigner and the custom debug.keystore. 
# NOTE: This assumes you explicitly called out MD5withRSA as your signing algorithm 
# when you generated the key; drop the -sigalg tag if you did not. 
jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore my-release-key.keystore -storepass android YourDebugApp.apk 

# Verify signing 
jarsigner -verify YourDebugApp.apk 
0

ho trovato il un'altra soluzione ..

Aggiungere il seguente in $ {} PROJECT_HOME /custom_rules.xml

<?xml version="1.0" encoding="UTF-8"?> 
<project name="custom_rules"> 
    <!-- @Override --> 
    <target name="-set-debug-mode" depends="-setup"> 
     <!-- record the current build target --> 
     <property name="build.target" value="debug" /> 

     <if> 
      <condition> 
       <and> 
        <istrue value="${project.is.testapp}" /> 
        <istrue value="${emma.enabled}" /> 
       </and> 
      </condition> 
      <then> 
       <property name="build.is.instrumented" value="true" /> 
      </then> 
      <else> 
       <property name="build.is.instrumented" value="false" /> 
      </else> 
     </if> 

     <!-- whether the build is a debug build. always set. --> 
     <property name="build.is.packaging.debug" value="true" /> 

     <!-- signing mode: debug --> 
     <property name="build.is.signing.debug" value="false" /> 

     <!-- Renderscript optimization level: none --> 
     <property name="renderscript.opt.level" value="${renderscript.debug.opt.level}" /> 

    </target> 

    <!-- @Override --> 
    <!-- Builds debug output package --> 
    <target name="-do-debug" depends="-set-debug-mode, -debug-obfuscation-check, -package, -post-package"> 
     <property name="out.unsigned.file" location="${out.absolute.dir}/${ant.project.name}-debug-unsigned.apk"/> 
     <move file="${out.packaged.file}" tofile="${out.unsigned.file}"/> 
     <property name="out.unaligned.file" location="${out.absolute.dir}/${ant.project.name}-debug-unaligned.apk" /> 

     <!-- Signs the APK --> 
     <echo level="info">Signing final apk...</echo> 
     <signapk 
      input="${out.unsigned.file}" 
      output="${out.unaligned.file}" 
      keystore="${out.absolute.dir}/../debug.keystore" <!-- your debug.keystore path --> 
      storepass="android" 
      alias="androiddebugkey" 
      keypass="android"/> 

     <!-- only create apk if *not* a library project --> 
     <do-only-if-not-library elseText="Library project: do not create apk..." > 
      <sequential> 
       <zipalign-helper in.package="${out.unaligned.file}" out.package="${out.final.file}" /> 
       <echo level="info">Debug Package: ${out.final.file}</echo> 
      </sequential> 
     </do-only-if-not-library> 
     <record-build-info /> 
    </target> 

</project> 
Problemi correlati