2012-05-13 14 views
14

Ich arbeite an einem Open-Source-Projekt. Da beabsichtigt ist, dass jeder die Quelle herunterladen und selbst erstellen kann, möchte ich den Paketnamen nirgends fest codieren - - einschließlich der Verzeichnisstruktur.Android - Wie kann ich den Paketnamen zur Build-Zeit für ein Open-Source-Projekt dynamisch festlegen?

Ich benutze ant für den Bau. Offenbar kann ich build.xml ändern, aber ich glaube, dass dies von android update überschrieben wird. Was auch immer verwendet wird, wird dem Git Repo zugesprochen, und es sollte nicht zu kompliziert sein.

Derzeit ist der Prozess zum Erstellen des Codes direkt aus dem Git Repo ziemlich einfach. Hier ist ein Auszug aus der README Datei:

$ 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 

Für mich macht es Sinn, die Paketnamen in local.properties zu setzen, denn dies ist .gitignore ‚d. Da der Paketname nirgendwo anders ist, schlägt der Build fehl, ohne dass dies geschieht. Also muss es mindestens einen zusätzlichen Schritt in der README geben, aber ich möchte es auf ein Minimum beschränken.

Edit: Natürlich ist eine andere Voraussetzung, dass diffs sinnvoll sind - was sie nicht tun, wenn Sie den Paketnamen manuell umbenennen.

+0

Das scheint ziemlich albern. Ich habe noch nie von einem Open-Source-Projekt gehört, das durch solche Reifen springt. –

+1

Die 2 Hauptmotive sind, dass Diffs für ein umbenanntes Verzeichnis ein Schmerz sind, und dass dieses und viele andere Open-Source-Projekte keine eigene Domain haben, sondern auf einer Code-Hosting-Seite wie sourceforge.net gehostet werden, etc., und Gabeln/Zusammenführungen sind alltäglich. –

Antwort

20

Ich habe etwas ähnliches (aber nicht aus diesem Grund), die Aktualisierung des Manifests zur Build-Zeit erforderlich gemacht. Die Art und Weise, wie ich das geschafft habe, war, ein zweites AndroidManifest zu machen und es in ein Verzeichnis namens config zu bringen. So in config/AndroidManifest könnten Sie so etwas wie diese:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="@[email protected]" 
     android:versionCode="@[email protected]" 
     android:versionName="@[email protected]"> 


<!-- EVERYTHING ELSE GOES HERE --> 


</manifest> 

Dann können Sie die regelmäßigen nackten Knochen build.xml Ant-Skript mit nur wenigen Modifikationen (keine Notwendigkeit, verwenden Sie das ganze Skript aus dem Android-Build kopieren System, wie sie einige Haken für Sie hinzugefügt haben, ohne das Rad neu zu erfinden). Der Build-Skript sollte local.properties standardmäßig liest, aber wenn nicht hinzufügen (oder uncomment) eine Zeile wie diese:

<property file="local.properties" /> 

In Ihrem Build-Skript sollten Sie eine Aufgabe sehen namens „-Spiele-build“, ändern Sie es wie folgt aus:

<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> 

dann Ihre local.properties Datei würden Sie den Paketnamen setzen, Versionsname/code wie folgt:

app.version=1.0 
app.versioncode=1 
app.packagename=com.mypackage.name 

Jetzt müssen Sie nur noch in y stellen Sie sicher, Unser Manifest, dass Sie alle Ihre Aktivitäten/Services/Broadcast-Listener usw. vollständig qualifizieren. Das bedeutet, dass Sie immer das vollständige Paket Ihres Quellcodes angeben. Wenn Sie möchten, dass das Paket für Ihren eigenen Quellcode dynamisch ist, können Sie jedes der Präfixe für jede Klasse ersetzen. Aber das scheint irgendwie albern zu sein. Es ist einfach genug, Ihren Code unter Ihrem eigenen Paketnamen zu verpacken Sie können es aus jedem Projekt verwenden, indem Sie einfach die Quelle oder ein Glas in ihr Projekt einfügen.

- UPDATE - Oh, und eine andere Sache, die Sie den Benutzer benachrichtigen tun können, dass sie einen Paketnamen definieren müssen, ist die Fail-Tag in Ihrem Build xml wie folgt verwenden:

<fail message="app.packagename is missing. This must be defined in your local.properties file" unless="app.packagename" /> 

Setzen Sie dieses nach der Zeile, die das lokale liest.Eigenschaftendatei

+0

Ah, mein Build-Skript (generiert von Android Update), _is_ 'Barebones' und enthält ''. Also kann ich diese Datei mit einigen Modifikationen in den Repo übertragen. Richtig, lass mich sehen ... –

+0

Ja einige Leute sagen, es ist eine schlechte Idee, aber ich mache es seit gut einem Jahr ohne irgendwelche Probleme. Sie lassen diese Haken natürlich für dich, aber es gibt keine Garantie, dass sie in der nächsten Android-Version die Dinge ändern könnten. IIRC die andere Sache, die ich tun musste, um mit Eclipse nett zu spielen, war add: Jedoch für Die oben genannten Änderungen sollten dies nicht erfordern. Ich brauchte es nur, um einige der Ziele in der tools/ant/build.xml aus meinem Skript wiederverwenden zu können, und dazu musste ich dann einfach androidbuild verwenden. [Targetname] –

+0

Wenn ich nicht die "as = androidbuild" -Abschnitt dann würde sich eclipse beschweren, dass die Ziele nicht existierten und Eclipse würde mein Projekt nicht erstellen können, obwohl ich mein Ameisen-Skript von Eclipse überhaupt nicht benutzt habe. –

6

Dank Matt Wolfe für seine Hilfe, posten ich eine Teilantwort mit meinen Bemühungen bis jetzt.

bemerkte ich, dass die Standard-Barebones build.xml auch custom_rules.xml importieren würde:

<import file="custom_rules.xml" optional="true" /> 

Also habe ich diese Datei und begann bastelt. Dies ist, was ich mit so weit gekommen sind:

<?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> 

Dies alles einrichtet in build/(das hat den zusätzlichen Bonus der Dinge sauber und ordentlich zu halten), jetzt die Absicht, für die SDK-Tools ist build.xml zu Führen Sie das Verzeichnis build/ aus. Ich kann jedoch keinen Weg finden von cd 'ing.

+0

Bisher gibt es nur einen zusätzlichen Schritt für 'README', was eine gute Nachricht ist:' $ echo 'app.packagename = dein.Paketname' >> local.properties' –

+0

Ich würde empfehlen, dies am Ende so hinzuzufügen, wie ich es tat einen Fehler in der Build-XML erhalten. Dies, weil Androids Aufgabe Element erfordert, während Ant-Beitrags, wenn Aufgabe es nicht unterstützt. Da wir die Build-Dateien von Android nicht ändern können und sie einhalten müssen, sind wir gezwungen, Androids if-Task überall zu verwenden. Jack

+0

wie das Verzeichnis in geändert wird bauen/ ? – Jason

1

Der einfachste Weg könnte sein, den Paketnamen so spät wie möglich zu ersetzen. Auf diese Weise müssen Sie Ihren Code nicht einmal berühren. Es gibt einen schönen Artikel mit dem Namen Renaming the Android Manifest package (http://www.piwai.info/renaming-android-manifest-package/). Zusammenfassung:

  • Sie können aapt --rename-manifest-package verwenden den Paketnamen

  • Alternativ zu ändern, wenn Sie Paketnamen Ersatz wollen ein Teil des Ant-Build-Prozess zu sein, können Sie das -package-resources Ziel außer Kraft setzen:

    • kopieren Sie die -package-resources Ziel von SDK build.xml
    • manifestpackage Parameter
    • hinzufügen
Verwandte Themen