web-dev-qa-db-ja.com

リリースにAPKスプリットを使用しますが、デバッグビルドタイプは使用しません

APK Splits を正常に実装したので、異なるABIに対して個別のAPKが生成されます。

ただし、効率を上げるために(そして、デバッグで非armeabi-v7a APKを必要としないため)、デバッグビルドを制限してarmeabi-v7aAPKのみを生成したいと思います。

これはどのように行うことができますか?

1つのアイデアはこれです:

abi {
    enable true
    reset()
    include 'x86', 'armeabi-v7a', 'mips'
    universalApk false
}

ビルドタイプに基づいてenableを設定する方法があるのでしょうか?

27
techehcet

@Geralt_Encoreの回答のバリエーションを試すことができます。これにより、個別のgradlewコマンドが回避されます。私の場合、リリースされたAPKファイルサイズを減らすためにAPK分割を使用することだけを考えていましたが、これを完全にAndroid Studio内で実行したかったのです。

splits {
    abi {
      enable gradle.startParameter.taskNames.any { it.contains("Release") }
      reset()
      include 'x86', 'armeabi-v7a', 'mips'
      universalApk false
    }
}

私が見たものから、ビルド| Android Studioで署名付きAPKメニュー項目を生成する]は、assembleReleaseGradleターゲットを使用してAPKを生成します。

21
Jeff P

コマンドライン引数に基づいてenableを設定できます。リリースバージョンにのみ分割を使用し、通常のデバッグビルドには使用したくない場合に、同様の問題を解決しました。

splits {
    abi {
        enable project.hasProperty('splitApks')
        reset()
        include 'x86', 'armeabi-v7a'
    }
}

その後 ./gradlew -PsplitApks assembleProdRelease(私の場合、prodはフレーバーです)。

14
Geralt_Encore

@ Jeff P の回答を更新して、アプリ名に基づいてより柔軟にし、Android App Bundle(.aab)形式をサポートする

splits {
    abi {
      enable gradle.startParameter.taskNames.any { it.contains("Release") }
      reset()
      include 'x86', 'armeabi-v7a', 'mips'
      universalApk false
    }
}
0
Mike Martin

私はこのパーティーに少し遅れていますが、さまざまなフレーバーとタスク名に問題があるため、次のようになりました。

ext.isRelease = { array ->
    array.each { name ->
        if (name.contains("Debug")) {
            return false
        }
    }
    return true
}

Android {

...

    splits {
        abi {
            enable isRelease(gradle.startParameter.taskNames)
            reset()
            include "x86_64", "x86", "arm64-v8a", "armeabi-v7a"
            universalApk false
        }
    }

}

これはJeffPの回答に対する小さな更新ですが、さまざまなフレーバーとビルド構成でうまく機能します。

0
Václav Hodek