Arbeiten mit Library Projects - Hilfe gesucht

  • Tag miteinander.


    Vor kurzem habe ich mit der Android Programmierung angefangen und bin nun dabei meine eigentlich nutzlose app (:D) in 2 Apps aufzuteilen. Eine Free und eine Pro App.
    Hierzu versuche ich mit einem Android Library Project zu arbeiten, was scheinbar noch nicht so ganz klappen möchte.


    Hier mal was ich bis jetzt gemacht habe:


    - Bestehende, funktionierende App zu einer "Is Library" umfunktioniert
    - Zwei neue Projekte erstellt (Ich hab einfach mein funktionierendes Projekt 2 mal kopiert bevor ich es zur library gemacht habe)
    - Beide Projekte die Library zugeteilt


    So wie ich das jetzt verstanden habe sollte es so funktionieren, dass alles, was im Projekt selbst ist, Vorrang hat, und alles was nicht im Projekt ist, sprich von mir gelöscht wird, aus der Library geholt wird. Sehe ich das richtig?



    Nun zu meinen Problemen, die ich noch nicht ganz begriffen habe:


    Erstmal kam mir gleich nach dem zuteilen der Library der Fehler, dass Attribute in der attr.xml des Ordners values bereits definiert sind. Nagut, dann einfach die .xml aus dem Ordner entfernen.
    Nun gibt es keine Probleme mehr, die angezeigt werden. Möchte ich das Projekt nun auf mein Galaxy Nexus installieren, bekomme ich folgendes:


    Code
    [2013-03-10 15:31:08 - Dex Loader] Unable to execute dex: Multiple dex files define Lcom/mikebdev/screenhealth/util/SystemUiHider$OnVisibilityChangeListener;
    
    
    [2013-03-10 15:31:08 - ScreenHealth] Conversion to Dalvik format failed: Unable to execute dex: Multiple dex files define Lcom/mikebdev/screenhealth/util/SystemUiHider$OnVisibilityChangeListener;


    Wenn ich die entsprechende Activity einfach lösche, wird einfach eine andere Activity als Problemkind dargestellt.


    Nun habe ich zum Test einfach mal alle Activities entfernt, werden ja von der library hinzugefügt. Die Manifest.xml habe ich entsprechend angepasst und siehe da, nun funktioniert es.


    Nun verstehe ich einfach nicht, warum dieser Fehler auftritt. Normal sollte ja die Activity aus dem Projekt einfach Vorrang haben, denn vor allem ist in der Manifest ja auch die Activity im Projekt angegeben. Erst das löschen der Activities hat den Fehler beseitigt (und dann natürlich einige FC's ausgelöst, da nicht richtig in der Manifest deklariert)




    Langer Text, ich weiß, tut mir auch schrecklich leid aber ich google schon seit stunden und bei Stackoverflow finde ich auch nichts, obwohl da ja eigentlich immer Hilfe zu finden ist


    Zum Schluss noch der Hinweis: ich bin blutiger Anfänger und lerne gerade Java und eben Android durch ausprobieren. Ich brauche niemanden der mir sagt ich solle erst das lernen und dann hier weiter machen blablabla. Ich weiß man macht das so nicht, aber learning by doing :) Danke für das Verständnis :):)

  • Na, da du ja keine Tipps willst:
    Doch, StackOverflow findet was.
    http://stackoverflow.com/quest…-define-lcom-myapp-rarray
    http://stackoverflow.com/quest…multiple-dex-files-define
    http://stackoverflow.com/quest…multiple-dex-files-define
    http://stackoverflow.com/quest…oogle-android-gcm-gcmbase


    Soll ich noch weiter machen?


    Suchtipp: „multiple dex files define“


    Langes Blablablabla:


    .dex steht für Dalvik Executables und bedeutet soviel wie „unter Dalvik ausführbare Datei“.
    Die Fehlermeldung sagt dir also, dass deine Klassen etc.pp. bereits in einer ausführbaren Datei vorliegen und dementsprechend nicht noch einmal dazu gepackt werden können. Dein Ansatz an sich ist also schon mal richtig: unnütze Dateien löschen.
    Leider war die Umsetzung genau die falsche. Du sollst nicht die neuen Activities sondern die alten DEX Dateien löschen.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Quote

    I finally discovered that my bin directory was included in the project build path. I excluded bin from the build path and repeated the steps above. This resolved my problem.


    Im schlimmsten Fall: komplett neues Projekt anlegen und die einzelnen Sourcefiles rüberkopieren.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Ich hab auch ein paar Dinge mit eigenen Libs gemacht, aber immer drauf geachtet, dass die Klassennamen in der Lib nicht noch mal im eigenen Projekt drin sind. Dort kann ich ja mit extends einfach von der Lib-Klasse ableiten und Anpassungen vornehmen.


    Die Sache mit "Project" - "Clean..." ist für das Lib-Projekt sehr wichtig, weil die anderen Apps nur auf die letzte erzeugte Binär-Version der Lib zugreifen und nicht auf den Quellcode - und der Binärcode wird nur neu gebaut, wenn er durch das cleanen gelöscht wurde.


    Den Fehler mit der attrs.xml kann ich dir vielleicht auch etwas näher erklären: es liegt nicht an der xml-Datei sondern am Inhalt. Zunächst mal sind alle values-xml-Dateien eines Projekts gemeinsam gültig, die Aufteilung in einzelne Dateien kann nach Belieben vorgenommen werden. Bei Projekten in Kombination mit Lib-Projekten ist bei gleichem name-Attribut (z.B. bei string-Definitionen) dann die Einstellung in der Main-App gültig, wenn da nix ist, wird die Lib-Einstellung genommen.


    Einige Tags (z.B. declare-styleable / attr) sind aber nicht überschreibbar, da sie inhaltlich gar nicht anpaßbar sind - du kannst den Namen ändern, aber dann ist es ein anderes Attribut, oder du änderst den Typ, dann geht die Verarbeitung nicht mehr.


    Ich hoffe, du bist etwas jetzt ratvoller. :)

  • UweApps


    Danke Danke Danke. Du hast mir geholfen.
    Habe es jetzt genau so gemacht wie du meintest.


    Mein Library Project hat all den source code, der mit beiden apps geteilt wird.
    Die jeweiligen Projekte haben alle Activities, die auch nur eine Zeile code anders haben und sagen "extend XY". Da kommt dann eben der zusätzliche code rein.


    Funktioniert einwandfrei.


    Nur eine frage habe ich nich: Wie mache ich das mit den layouts? Kann ich da auch so vorgehen wie bei den Klassen, also mit einer art extend?


    DANKE :)

  • Bei Layouts geht das erst mal nicht so ganz - normalerweise wirst du auch nicht die Layouts aus der Lib im App-Projekt einbinden, sondern die darüber liegenden View-Klassen (bei Custom Components) oder die Fragments / Activities aus der Library.


    Aber es gibt was anderes, was dir bei Layouts und deren Flexibilisierung helfen kann:


    HTML
    <include layout="@layout/layout_resource"/>


    Damit kannst du Layout-Schnipsel in verschiedenen Layouts einbinden (z.B. Werbeeinblendung) - aber wenn du dafür Einstellungen machen möchtest oder auf Inhalte zugreifst, musst du das in den Activities / Fagements / Custom Views jeweils wieder einbauen - aber dafür könnte man sich auch noch eine Hilfsklasse bauen, die diese Aufgaben übernimmt.


    Für solche includes kann man in der layout_resource.xml als oberstes Container-Element auch <merge...> verwenden - dann spart sich das System eine Ebene im Layout-Baum. Dazu gibt's auch was von Google.


    Ansonsten kannst du auch viele Sachen, die in dem Lib-res-Ordner gespeichert sind, einfach überschreiben im App-Projekt, aber nicht alles. Normalerweise sollte dir Eclipse Bescheid geben, wenn du was Unerlaubtes machst. Die aktuelle Version vom Android-SDK prüft viel besser als frühere Versionen (Android-SDK-Manager nach Updates suchen lassen!).

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!