web-dev-qa-db-ja.com

リリースビルドタイプのアセットを除外する

次のように、gradleでビルドされたアプリケーションにAndroidライブラリをインポートしています:

dependencies {
    compile 'com.example:great-lib:0.1-SNAPSHOT'
}

このライブラリには、次のようなレイアウトで、Webビューで使用されるアセット、js、css、および画像のみが含まれています。

assets/
|-> great.css
|-> great.min.js
|-> great.min.js.map
|-> js/
|   |-> plop.js
|   |-> foo.js
|   ...
|-> img/
|   ...

jsフォルダーには、ソースファイル(ソースマップで使用される)が含まれています。それとデバッグビルド用の.mapファイルを含め、リリースビルドには縮小されたjsのみを含めたいのですが、それを行う方法が見つかりません。

これまで私が試した:

Android {
    // this doesn't exclude anything
    packageOptions {
        exclude 'assets/js'
    }
    buildTypes {
        release {
            // this does exclude the js folder, but in both release and debug
            aaptOptions {
                ignoreAssetsPattern "!js"
            }
        }
    }
}

私が望むことを達成することが可能かどうか、そしてもしそうなら、どのように?

(ライブラリの2つのバージョン(great-libgreat-lib-debug)を公開することも考えており、debugCompilereleaseCompileに依存関係がありますが、それを避けて単一のバージョンを公開することを好む)

18
Xavier

私は次のことをすることになりました:

Android.applicationVariants.all { variant ->

  if (variant.name.contains('Release')) {
    // exclude source and sourcemap from release builds
    def noJsSourceTask = task("delete${variant.name}JsSource", type: Delete) {
      delete "${buildDir}/intermediates/assets/${variant.dirName}/js"
      delete "${buildDir}/intermediates/assets/${variant.dirName}/great.min.js.map"
    }
    variant.mergeAssets.finalizedBy noCeJsSourceTask
  }
}

それは問題なく動作しますが、私が本当に好きではないことがいくつかあります:

  • タスクが完了した後に生成されたファイル(finalizedBy)に触れているので、「最新」のチェックではうまく機能しません。しかし、それはリリースビルド専用であり、私はより頻繁にデバッグビルドを行っています
  • 削除するファイルのパスは手動で作成されます。他のプロジェクトでそのまま再利用できるほど一般的かどうかはわかりません
  • 名前に基づいてバリアントを選択しています。もっと構造化されたものが良かったのに。
11
Xavier

私はこのアプローチで成功しました(TaskProviderサポートのために2019-5-13を更新しました。古いバージョンの編集履歴を参照してください):

Android {
⋮
    applicationVariants.all { variant ->
        if (variant.buildType.name == 'release') {
            variant.mergeAssetsProvider.configure {
                doLast {
                    delete(fileTree(dir: outputDir, includes: ['**/js', '**/*.js.map']))
                }
            }
        }
    }
⋮
}

これは、@ Xavierの回答に関する問題に対処する必要があります。

  • 削除はバリアントのmergeAssetsタスクの一部として実行されるため、削除はタスクの出力に反映され、最新のチェックは影響を受けません。
  • パスはマジックストリングなしで計算されます。私の例があまりにも寛容である場合に備えて、インクルードパターンを調整する必要があるかもしれません。
  • バリアントはbuildType名で選択されています。これは、バリアント名全体を照合するよりも問題が少ないです(ただし、文字列型で入力されています)。

このアプローチは、resではなくassetsファイルでも機能することに注意してください。mergeAssetsmergeResourcesに置き換えるだけです。

packagingOptionsaaptOptionsに言及している他の回答は、スコープがallバリアント(Androidスコープで定義されている)であるため、間違ったツリーを吠えています。 、buildTypeまたはproductFlavorではありません)。

17
Aaron

Gradleは、リリースまたはデバッグビルドからアセットフォルダーとファイルをフィルター/除外するための「aaptOptions、ignoreAssetsPattern」を提供します。

デバッグビルドの例(jsフォルダーとgreat.cssファイル):

debug {            
        aaptOptions {
            ignoreAssetsPattern '!js:!great.css:'
        }
    }

リリースビルドの例(jsフォルダーとgreat.cssファイル):

release {
        aaptOptions {
            ignoreAssetsPattern '!js:!great.css:'
        }
    }
4
Pramoda S

Proguardを使用できると思います。 ProguardはAndroid studio、難読化コードに含まれ、使用されていないクラスを削除します。アプリが使用されていないすべてのリソースを削除する場合は、build.gradleにのみ入れてください。

 release {

            minifyEnabled true //remove classes, obfuscate code and zipalign
            shrinkResources true //remove resources
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'//autogenerated files
        }

これはそれに関するリンク情報です:

特定のファイルをパーソナライズ、除外、または無視することができます

1
encastellano

フィルターを通しては不可能です。

ただし、2つのアセットフォルダを持つことができます。 debugreleaseの両方に使用されるメインのもの(src/main/assets)と、デバッグビルドにのみ使用されるもの(src/debug/assets)。

ソース

0
Fahim