2015-02-12 1 views
15

Android Studio (mit SDK 19, 21 oder 22) zeigt einen Fehler, dass Eclipse-ADT (mit SDK 19) nicht:Android-Build automatisch lösen Fehler: Rahmenpixel müssen entweder durchgehend oder transparent sein (keine Zwischenalphas). - Gefunden bei Pixel # 4 entlang der Oberkante

Error:9-patch image D:\Workspaces....\res\drawable-hdpi\btn_bg_common_press.9.png malformed. Error:Frame pixels must be either solid or transparent (not intermediate alphas). - Found at pixel #4 along top edge.

Or another error:

Error:Ticks in transparent frame must be black or red.

sowohl innerhalb aapt

Error:Error: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'E:\Android\sdk-Android-Studio\build-tools\19.1.0\aapt.exe'' finished with non-zero exit value 42

btn_bg_common_press.9.png

Beispiel der Datei ist oben, aber es gibt 20+ solche Dateien, die gut funktioniert haben.

Wie mache ich Android Studio oder Gradle überspringe diesen Fehler und nicht fehl, ohne diese Dateien eins nach dem anderen zu ändern?

Wenn es mit Gradle nicht möglich ist, welches Befehlszeilentool könnte ich verwenden, um alle transparenten Pixel durch nichttransparente zu ersetzen?

Die build.gradle-Datei für das Anwendungsmodul (wo Ressourcen) ist unten.

Ich habe beide mit SDK 19 and SDK 21 und build tools 19.1, 21.1.2, 22 versucht.

Ein ähnliches Problem auf AOSP, Issue 159464: Android studio: mergeDebugResources FAILED when importing Eclipse project.

buildscript { 
    repositories { 
     jcenter() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:1.1.+' 
    } 
} 

allprojects { 
    repositories { 
     jcenter() 
    } 
} 

//--- 
task wrapper(type: Wrapper) { 
    gradleVersion = '2.2.1' 
} 

apply plugin: 'com.android.application' 

dependencies { 
    compile fileTree(dir: 'libs', include: '*.jar') 
    compile project(':afinal') 
    compile 'com.android.support:appcompat-v7:19.0.+' 
    //compile 'com.android.support:appcompat-v7:21.0.+' 
} 

//--- 
android { 
    sourceSets { 
     main { 
      manifest.srcFile 'AndroidManifest.xml' 
      res.srcDirs = ['res'] 
      assets.srcDirs = ['assets'] 
     } 
    } 

    compileSdkVersion 19 
    buildToolsVersion "19.1.0" 
    //compileSdkVersion 21 
    //buildToolsVersion "21.1.2" 
    //compileSdkVersion Integer.parseInt(project.COMPILE_SDK_VERSION) 
    //buildToolsVersion project.BUILD_TOOLS_VERSION 

    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 
      zipAlignEnabled true 
      //signingConfig signingConfigs.release 
     } 
     debug { 
      zipAlignEnabled true 
     } 
    } 

    lintOptions { 
     //checkReleaseBuilds false 
     // Or, if you prefer, you can continue to check for errors in release builds, 
     // but continue the build even when errors are found: 
     abortOnError false // false also required by https://wiki.jenkins-ci.org/display/JENKINS/Android+Lint+Plugin 
    } 
}//android 

Android Gradle Plugins Quellen sind bei https://android.googlesource.com/platform/tools/build/+/master.

+0

Diese Frage ist, wie Build-Pass zu machen, nicht, wie bekam diese Dateien ändern –

+0

plötzlich den gleichen Fehler. Hast du eine Lösung gefunden? – mfaerevaag

+0

Das neueste Android Studio 1.1 mit Gradle plugin 1.1 und buildToolsVersion "21.1.2" gibt mir den gleichen Fehler –

Antwort

8

How automatically solve the issue (without checking all images in different resolutions)

Nicht möglich. Da Sie möchten, dass sich die PNG wie ein Neun-Patch verhält (entlang der Kanten erweitern, nicht die gesamte Bitmap dehnen), müssen Sie sie als solche formatieren. Ergo Sie müssen die Dateien ändern.

vorgeschlagene alternative

Da die Form so einfach ist, sollten Sie besser dran, alle Varianten dieser Datei zu löschen (das spart Platz, Zeit und Kopfschmerzen in den Prozess) und erstellen /res/drawable/btn_bg_common_press.xml ziehbar mit folgendem Inhalt:

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
     android:shape="rectangle"> 
    <corners android:radius="16dp"/> 
    <solid android:color="#ccc"/> 
    <stroke 
     android:color="#0c0" 
     android:width="2dp"/> 
</shape> 

Sie können dimen und color Ressourcen anstelle von fest codierten Werte verwenden. Zusätzlich sollten Sie die padding Element innerhalb shape

<shape...> 
    <padding 
     android:top="8dp" 
     android:left="8dp" 
     android:bottom="8dp" 
     android:right="8dp"/> 
</shape> 

und/oder wickeln Sie das shape Element innerhalb eines inset Element hinzuzufügen.

<inset 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:insetTop="8dp" 
    android:insetLeft="8dp" 
    android:insetBottom="8dp" 
    android:insetRight="8dp"> 
    <shape...> 
</inset> 

Wenn Sie das tun, wird die ziehbar padding implizierten haben und Sie werden es nicht gesetzt haben, wenn Widgets Styling. Da Sie für die Schaltfläche mehrere Zustandszeichenstile haben, schlage ich vor, dass Sie alle in XML konvertieren, um sicherzustellen, dass die Linienstärke und die Ecken übereinstimmen.

Trotz des Namens des Root-Elements wird die <shape> tatsächlich auf GradientDrawable aufgebläht (was bedeutet, dass Sie sie mit Farbverlauf anstelle von Volltonfarbe füllen können). Überprüfen Sie GradientDrawable docs für alle seine Optionen. Nicht jemals Verwenden Sie ShapeDrawable programmgesteuert, es funktioniert einfach nicht.

Analysieren 9-Patches

Betrachten Sie die drei folgenden vergrößerte Bilder.

Nine-patch samples

Candidate # 1 ist ein neun-Patch. Es hat 1px auf jeder Seite für Stretch und Polsterung reserviert. Dieser wird sich wie eine gewöhnliche Bitmap verhalten, wenn er gestreckt wird. Wenn die Breite größer als die Höhe ist, ändert sich auch die Randstärke an den Seiten. Die Grenze wird proportional skaliert.

Kandidat # 2 ist auch ein Neun-Patch und sagt eigentlich, dass es alles außer 1px Grenze dehnen wird und eine Auffüllung von 3px auf jeder Seite enthalten wird. Es hat einen schönen knackigen 1px Rand, wenn es gestreckt wird.

Kandidat # 3 ist NICHT ein Neun-Patch. Es skaliert auf die gleiche Weise wie # 1.

Lassen Sie uns jetzt auf vergrößerte Version des Bildes einen Blick darauf werfen Sie in OP enthalten:

Enlarged image from OP

Wie Sie sehen, es ist nicht ein Neun-Patch, so dass es nicht als eine bekommen interpretiert wird und Die Build-Tools sind so freundlich, Sie davor zu warnen. Auch wenn ältere Build-Tools mehr zu vergeben, und hinzugefügt transparent 1px auf jeder Seite für Sie, wäre das Ergebnis wie eine gewöhnliche Bitmap-artig, was bedeutet, wenn sie gedehnt es wie Probe A statt erwartete Ergebnis Probe B.

Comparison of a bitmap and a nine-patch

aussehen würde

Hier ist more reading on nine-patches. Dies erklärt, wofür das zusätzliche 1px auf jeder Seite verwendet wird.

+0

diese Dateien sind korrekt Neun-Patch-Bilder, die schon lange vorher funktioniert haben mit Eclipse Build. Trotzdem ist das ein schönes Stück Info. Aber ich betrachte das als Build-Problem. –

+0

@PaulVerest Es ist kein Build-Problem, Ihre Ressourcen sind in schlechtem Format. Bitte sehen Sie die aktualisierte Antwort, ich habe eine ganze Menge über neun Patches hinzugefügt. –

+0

Wow, das ist ein großartiges Intro in neun-Patch (das wusste ich nicht). Jetzt muss man sich mit dem Designer absprechen ... Inzwischen ist Build zu vergeben. –

3

Android hat nun zwei PNG Cruncher, den AAPT one und einen Java one. Um den PNG Fehler in Build-Prozess zu ignorieren, können Sie force Gradle build to use the old AAPT durch die folgende Zeile in Ihrer build.gradle Bildeinstellung:

android.aaptOptions.useAaptPngCruncher = true 

Dennoch kann dies gibt Ihnen den gleichen Fehler, wie das AAPT-Tool aus dem aktuellen SDK könnte sein, auch auf diesen Fehler prüfen. So haben Sie zwei Möglichkeiten:

  • finden eine ältere AAPT zum Beispiel < SDK path> /build-tools/17.0.0/aapt, Ihr aktuelles SDK AAPT mit diesem alten überschrieben. Ihre Build-Probleme jetzt gelöst werden können. Wenn dies nicht funktioniert, versuchen Sie die folgende Option.

  • ein einfaches Bash oder Perl-Skript schreiben, nennen Sie es „aapt“ und legen Sie sie in Ihrem aktuellen SDK Build-Tool-Ordner. Dieses Skript ruft die alte Version 17 AAPT für Ihr * 9.png auf und verwendet das neue AAPT für alles andere. Ein Beispielskript finden Sie unter this Stack Overflow answer.

+0

Vielen Dank für Ihre Ideen. Gradle und Android Studio erkennen "useAaptPngCruncher" jedoch nicht und es fehlt die Liste "aaptOptions" in http://tools.android.com/tech-docs/new-build-system/user-guide. Siehe http://stackoverflow.com/questions/28934333/how-cani-i-use-android-aptoptions. Möglicherweise war es in irgendeiner Beta vorhanden und jetzt abwesend. Zweitens verwende ich Eclipse mit SDK 19 und Build-Tools 19.1 und es funktioniert gut. Also das Problem ist nicht mit "aapt" selbst, sondern wie es verwendet wird (von Gradle Build) –

+0

Mit 'useNewCruncher false' hilft auch nicht. –

+0

@PaulVerest scheint, als würde Eclipse den Fehler wahrscheinlich ignorieren und den Build-Prozess fortsetzen. Gradle stoppt den Build ... also wäre es ein Workaround, das aapt einfach in ein anderes Shell-Skript namens 'aapt' zu schreiben und dieses Proxy-Skript das ursprüngliche aapt aufrufen zu lassen, aber immer Erfolg zurückzugeben, damit der Build-Build den Build-Prozess fortsetzen kann. – ashoke

7

Das angegebene Beispiel ist kein 9-Patch-Image, wie gesagt wurde.

Wenn Sie nicht jede Ressource ändern möchten, um sie in eine gültige 9-Patch-Ressource umzuwandeln, können Sie versuchen, ".9" im Ressourcennamen zu entfernen. Auf diese Weise sollte das Verhalten identisch sein und Sie werden keine Buildfehler erhalten.

+0

Ich frage mich, warum ich das zuerst nicht versucht habe! Ich habe alle 9PNG-Dateien umbenannt, habe einfach '.png' Erweiterung und löste den Buildfehler. –

+0

Ich habe diese Lösung viele Male von anderen Leuten gesehen, aber ich habe nicht versucht, die .9 zu entfernen, weil ich dachte, ich würde den 9patch-Effekt verlieren. Das Einzigartige an Ihrer Antwort ist, dass Sie mich beruhigt haben, dass ich den Effekt nicht verlieren würde. Danke, deine Lösung funktioniert. –

0

Um dieses Problem zu lösen, stellen Sie sicher, dass Sie alle Kanten mit schwarzen oder roten Punkten füllen. Dies löste mein Problem für alle SDK-Versionen. Wenn Sie nicht vertikal oder horizontal oder beide skalieren möchten, füllen Sie einfach alle Kanten. In diesem Fall wird das Bild nicht skaliert.

Without error

With malformed error

Verwandte Themen