android - रिलीज़ बिल्ड प्रकार के लिए संपत्ति बहिष्कृत करें
android-gradle aar (4)
मैं एक एंड्रॉइड लाइब्रेरी आयात कर रहा हूं जो कि ग्रेडले के साथ बनाया गया एक अनुप्रयोग है, जैसे:
dependencies {
compile 'com.example:great-lib:0.1-SNAPSHOT'
}
इस लाइब्रेरी में केवल ऐसी संपत्तियां, जेएस, सीएसएस और वेबवेन्शन में उपयोग की जाने वाली छवियां हैं, जैसे कि एक लेआउट के साथ:
assets/
|-> great.css
|-> great.min.js
|-> great.min.js.map
|-> js/
| |-> plop.js
| |-> foo.js
| ...
|-> img/
| ...
js
फ़ोल्डर में स्रोत फाइलें (स्रोत नक्शे के साथ उपयोग की जाने वाली) हैं मैं इसे और डीबग बिल्ड के लिए .map
फ़ाइल को शामिल करना चाहूंगा, और रिलीज़ बिल्ड में केवल न्यूनतम जेएस किया है, लेकिन मुझे ऐसा करने का कोई तरीका नहीं मिल सकता है।
अब तक मैंने कोशिश की है:
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"
}
}
}
}
कोई भी विचार अगर मैं चाहता हूं कि प्राप्त करना संभव है और यदि ऐसा है तो कैसे?
(मैंने पुस्तकालय के दो संस्करणों को प्रकाशित करने के बारे में भी सोचा है ( debugCompile
और releaseCompile
debugCompile
great-lib-debug
), और great-lib-debug
debugCompile
में निर्भरता है और releaseCompile
, लेकिन मैं 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
) पर छू रहा हूं, इसलिए यह "अप-टू-डेट" जांच के साथ अच्छी तरह काम नहीं करता है लेकिन यह रिलीज बनाने के लिए ही है, मैं डिबग कर रहा हूँ और अधिक बार - हटाने के लिए फ़ाइलों का पथ मैन्युअल रूप से बनाया गया है। मुझे यकीन नहीं है कि यदि अन्य परियोजनाओं में इसका पुन: उपयोग किया जा सकता है तो यह सामान्य है
- मैं अपने नाम के आधार पर वेरिएंट का चयन कर रहा हूं। मुझे और अधिक संरचित कुछ पसंद आया होगा
मुझे लगता है कि आप प्रोगुर्ड का उपयोग कर सकते हैं Proguard एंड्रॉइड स्टूडियो, अस्पष्ट कोड के साथ शामिल है, और क्लासेस का उपयोग नहीं किया जा रहा निकालें, और अगर आप सभी संसाधनों को हटाना चाहते हैं जो ऐप का उपयोग नहीं किया जाता है केवल अपने 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
}
इस बारे में लिंक जानकारी है:
आप निजीकृत कर सकते हैं, विशेष फ़ाइलों को बाहर निकाल सकते हैं या विशेष फ़ाइलों को अनदेखा कर सकते हैं
ग्रैडल एसेट ऑप्शन, अनदेखाएस्सेट्स पॅटर्न प्रदान करता है, जो कि संपत्ति फ़ोल्डर्स और रिलीज़ या डिबग बिल्ड से फाइलों को बाहर निकालता है।
डिबग बिल्ड ( js
फ़ोल्डर और great.css
फ़ाइलों) के लिए उदाहरण:
debug {
aaptOptions {
ignoreAssetsPattern '!js:!great.css:'
}
}
रिलीज़ बिल्ड ( js
फ़ोल्डर और great.css
फ़ाइलों) के लिए उदाहरण:
release {
aaptOptions {
ignoreAssetsPattern '!js:!great.css:'
}
}
इस दृष्टिकोण से मुझे सफलता मिली:
applicationVariants.all { variant ->
if (variant.buildType.name == 'release') {
variant.mergeAssets.doLast {
delete(fileTree(dir: variant.mergeAssets.outputDir, includes: ['**/js', '**/*.js.map']))
}
}
}
यह @ जेवियर के उत्तर के साथ मुद्दों को संबोधित करना चाहिए:
- विलोपन संस्करण के
mergeAssets
कार्य के भाग के रूप में किया जाता है, ताकि कार्य को आउटपुट में प्रतिबिंबित किया जा सके और अप-टू-डेट जांच अप्रभावित होनी चाहिए। - पथ जादू तार के बिना गणना की जाती है। मेरे उदाहरण में बहुत अनुमेय होने के मामले में आपको शामिल पैटर्न समायोजित करने की आवश्यकता हो सकती है।
- वेरिएंट को
buildType
नाम से चुना जा रहा है, जो पूरे संस्करण नाम से मेल खाने की तुलना में कम समस्याग्रस्त है (हालांकि यह अभी भी स्ट्रैली टाइप किया गया है)।
ध्यान दें कि यह दृष्टिकोण assets
बजाय res
फाइल के लिए भी काम करता है: mergeAssets
साथ mergeResources
mergeAssets
को mergeResources
।
packagingOptions
उल्लेख करने वाले अन्य aaptOptions
और aaptOptions
गलत पेड़ को भौंक कर रहे हैं, क्योंकि ये सभी प्रकारों को aaptOptions
हैं (वे android
गुंजाइश में परिभाषित नहीं हैं, buildType
या productFlavor
)।