web-dev-qa-db-ja.com

自動的に解決Androidビルドエラー:フレームピクセルは、中間またはアルファではなく、ソリッドまたは透明である必要があります。)-上端のピクセル#4で見つかります

Android Studio(SDK 19、21、または22を使用)は、Eclipse ADT(SDK 19を使用)では発生しないエラーを表示します。

エラー:9パッチイメージD:\ Workspaces ....\res\drawable-hdpi\btn_bg_common_press.9.png malformed。エラー:フレームピクセルは、ベタまたは透明(中間アルファではない)である必要があります。 -上端のピクセル#4にあります。

または 別のエラー

エラー:透明フレームの目盛りは黒または赤でなければなりません。

aapt内の両方

エラー:エラー: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」がゼロ以外の終了値42で終了しました

btn_bg_common_press.9.png

ファイルの例は上にありますが、うまくいった20以上のファイルがあります。

どのようにすればよいですかAndroid StudioまたはGradleはこのエラーをスキップし、これらのファイルを1つずつ変更せずに失敗しませんか?

Gradleでそれができない場合、どのコマンドラインツールを使用して、すべての透明ピクセルを非透明ピクセルに置き換えることができますか?

アプリケーションモジュール(リソースがある場所)のbuild.gradleファイルは以下のとおりです。

私は SDK 19とSDK 21ビルドツール19.1、21.1.2、22 の両方を試しました。

AOSPでの同様の問題 問題159464:Android studio:mergeDebugResources FAILEDインポート時にEclipseプロジェクトをインポートすると

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プラグインのソースは https://Android.googlesource.com/platform/tools/build/+/master にあります。

15
Paul Verest

自動的に問題を解決する方法(異なる解像度のすべての画像をチェックせずに)

ありえない。 .pngを9パッチのように動作させる(ビットマップ全体を引き延ばすのではなく、エッジに沿って拡張する)必要があるため、これらをergoとしてフォーマットする必要があります。ファイル

提案された代替案

形状がとてもシンプルなので、このファイルのすべてのバリアントを削除し(プロセスのスペース、時間、頭痛を節約)、次の内容で/res/drawable/btn_bg_common_press.xmlドローアブルを作成する方がよいでしょう。

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

ハードコードされた値の代わりにdimenおよびcolorリソースを使用できます。さらに、padding内にshape要素を追加することもできます

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

shape要素内にinset要素をラップします。

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

これを行うと、ドローアブルは暗黙のパディングを持ち、ウィジェットをスタイリングするときにそれを設定する必要がなくなります。ボタンには複数の状態のドローアブルがあるので、それらすべてをXMLに変換して、線の太さと角が一致することを確認することをお勧めします。

ルート要素の名前にもかかわらず、<shape>は実際にはGradientDrawableに膨らみます(つまり、無地の代わりにグラデーションで塗りつぶすことができます)。すべてのオプションについて GradientDrawable docs を確認してください。プログラムでShapeDrawableever使用しないでください。機能しません。

9パッチの分析

次の3つの拡大画像を検討してください。

Nine-patch samples

候補#1は9パッチです。ストレッチとパディングの仕様のために、両側に1pxを予約しています。これは、引き伸ばされたときに通常のビットマップとして動作します。幅が高さよりも大きくなると、辺の境界線の太さも大きくなります。境界線は比例して拡大縮小します。

候補#2も9パッチであり、実際には1pxの境界以外のすべてを引き延ばし、両側に3pxの暗黙のパディングがあることを示しています。引き伸ばされると、それは素敵な鮮明な1pxの境界線を持ちます。

候補#3は[〜#〜]ではありません[〜#〜]9個のパッチです。 #1と同じ方法でスケーリングします。

次に、OPに含めた画像の拡大バージョンを見てみましょう。

Enlarged image from OP

ご覧のとおり、9つのパッチではないため、1つのパッチとして解釈されず、ビルドツールはそのことを警告するのに十分親切です。古いビルドツールの方が許容度が高く、片側に透明な1ピクセルを追加しても、結果は通常のビットマップのように動作します。つまり、引き伸ばされたとき、期待される結果の標本Bではなく標本Aのように見えます。

Comparison of a bitmap and a nine-patch

これが 9パッチについてもっと読む です。これは、各側の余分な1pxが何に使用されるかを説明しています。

8
Eugen Pechanec

与えられた例は、言われているように、9パッチイメージではありません。

有効な9パッチリソースに変換するために各リソースを変更したくない場合は、リソースの名前から「.9」を削除してみてください。これにより、動作は同じになり、ビルドエラーが発生しなくなります。

7
Jofre Mateu

Androidには現在、AAPTとa Java 1)の2つのPNGクランチャーがあります。ビルドプロセスでPNGエラーを無視するには、 Gradleビルドで古いAAPTを使用するように強制できます build.gradleファイルに以下の行を設定します。

Android.aaptOptions.useAaptPngCruncher = true

それでも、最新のSDKのAAPTツールがこのエラーをチェックしている可能性があるため、同じエラーが発生する可能性があります。したがって、2つのオプションがあります。

  • たとえば、<SDKパス> /build-tools/17.0.0/aaptなどの古いAAPTを見つけ、現在のSDK AAPTをこの古いもので上書きします。これで、ビルドの問題が解決される可能性があります。これが機能しない場合は、以下のオプションを試してください。

  • 単純なBashまたはPerlスクリプトを記述し、「aapt」という名前を付けて、現在のSDKビルドツールフォルダーに配置します。このスクリプトは、* 9.pngに対して古いバージョン17のAAPTを呼び出し、それ以外にはすべて新しいAAPTを使用します。サンプルスクリプトについては、 このスタックオーバーフローの回答 をご覧ください。

3
ashoke

この問題を解決するには、すべてのエッジを必ず黒または赤の点で塗りつぶしてください。これにより、すべてのSDKバージョンの問題が解決しました。垂直方向または水平方向、あるいはその両方にスケーリングしたくない場合は、すべてのエッジを塗りつぶしてください。この場合、画像は拡大縮小されません。

エラーなし

不正な形式のエラーあり

0
sakit