次のように、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-lib
とgreat-lib-debug
)を公開することも考えており、debugCompile
とreleaseCompile
に依存関係がありますが、それを避けて単一のバージョンを公開することを好む)
私は次のことをすることになりました:
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
)に触れているので、「最新」のチェックではうまく機能しません。しかし、それはリリースビルド専用であり、私はより頻繁にデバッグビルドを行っています私はこのアプローチで成功しました(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
ファイルでも機能することに注意してください。mergeAssets
をmergeResources
に置き換えるだけです。
packagingOptions
とaaptOptions
に言及している他の回答は、スコープがallバリアント(Android
スコープで定義されている)であるため、間違ったツリーを吠えています。 、buildType
またはproductFlavor
ではありません)。
Gradleは、リリースまたはデバッグビルドからアセットフォルダーとファイルをフィルター/除外するための「aaptOptions、ignoreAssetsPattern」を提供します。
デバッグビルドの例(js
フォルダーとgreat.css
ファイル):
debug {
aaptOptions {
ignoreAssetsPattern '!js:!great.css:'
}
}
リリースビルドの例(js
フォルダーとgreat.css
ファイル):
release {
aaptOptions {
ignoreAssetsPattern '!js:!great.css:'
}
}
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
}
これはそれに関するリンク情報です:
特定のファイルをパーソナライズ、除外、または無視することができます
フィルターを通しては不可能です。
ただし、2つのアセットフォルダを持つことができます。 debug
とrelease
の両方に使用されるメインのもの(src/main/assets)と、デバッグビルドにのみ使用されるもの(src/debug/assets)。