खोज…


परिचय

यह विषय रिलीज़ मोड के लिए अपने Xamarin.Android ऐप को तैयार करने और इसे अनुकूलित करने के तरीके के बारे में जानकारी दिखाता है।

विजुअल स्टूडियो में अपना एपीके तैयार करना

आपने अपना ऐप समाप्त कर लिया, डीबग मोड पर परीक्षण किया और यह सही काम कर रहा है। अब, आप इसे Google Play Store में प्रकाशित करने के लिए तैयार करना चाहते हैं।

Xamarin प्रलेखन यहाँ में अच्छा संकेत प्रदान करता है:

https://developer.xamarin.com/guides/android/deployment,_testing,_and_metrics/publishing_an_application/


Android मैनिफ़ेस्ट

सबसे पहले, Visual Studio में, समाधान एक्सप्लोरर में अपने Xamarin.Android प्रोजेक्ट पर राइट-क्लिक करें और गुण चुनें। फिर, इस स्क्रीन को देखने के लिए एंड्रॉइड मेनिफेस्ट टैब पर जाएं:

Android मैनिफ़ेस्ट कॉन्फ़िगरेशन

एंड्रॉइड स्टूडियो या ग्रहण के विपरीत, आपको लेखन द्वारा AndroidManifest.xml फ़ाइल के सेट की आवश्यकता नहीं है; Xamarin और Visual Studio आपके लिए ऐसा करते हैं। गतिविधियों, ब्रॉडकास्टरेवर्स एंड सर्विसेज को उनकी कक्षाओं में विशिष्ट विशेषताओं की घोषणा करके एंड्रॉइड मैनिफेस्ट में डाला जाता है।

इस स्क्रीन में, विकल्प हैं:

  • एप्लिकेशन का नाम : यह ऐप का नाम है जो उपयोगकर्ता के लिए दिखाई देगा।
  • पैकेज का नाम : यह पैकेज का नाम है। यह अद्वितीय होना चाहिए, जिसका अर्थ है कि यह Google Play Store में अन्य एप्लिकेशन के समान पैकेज नाम का उपयोग नहीं करना चाहिए।
  • एप्लिकेशन आइकन : यह वह आइकन है जो उपयोगकर्ता को दिखाई देगा, जो एंड्रॉइड स्टूडियो या ग्रहण परियोजनाओं में उपयोग किए जाने वाले @ drawable / ic_launcher के बराबर है।
  • संस्करण संख्या : संस्करण संख्या का उपयोग Google Play द्वारा संस्करण नियंत्रण के लिए किया जाता है। जब आप अपने ऐप के अपडेटेड वर्जन के लिए एपीके प्रकाशित करना चाहते हैं, तो आपको प्रत्येक नए अपग्रेड के लिए इस नंबर में 1 जोड़ना होगा।
  • संस्करण का नाम : यह संस्करण का नाम है जिसे उपयोगकर्ता को प्रदर्शित किया जाएगा।
  • लोकेशन इंस्टॉल करें : यह निर्धारित करता है कि आपका एपीके डिवाइस स्टोरेज या एसडी कार्ड में कहां इंस्टॉल किया जाएगा।
  • आवश्यक अनुमतियां : यहां आप यह निर्धारित करते हैं कि आपके ऐप के लिए कौन सी अनुमतियां आवश्यक हैं।

Android विकल्प

नीचे दी गई स्क्रीन में, आप संकलक विकल्पों को कॉन्फ़िगर कर सकते हैं। यहां सही विकल्पों का उपयोग करने से आपकी एपीके का आकार बहुत कम हो सकता है और त्रुटियों को भी रोका जा सकता है।

Android विकल्प कॉन्फ़िगरेशन

  • कॉन्फ़िगरेशन : सक्रिय (रिलीज़)
  • प्लेटफार्म : एक्टिव (कोई भी सीपीयू) । Google Play Store के लिए अपना एपीके बनाना आवश्यक है। यदि कॉन्फ़िगरेशन डीबग पर सेट है, तो यह Google Play द्वारा स्वीकार नहीं किया जाएगा।
  • साझा रनटाइम का उपयोग करें : गलत । यदि आप इसे सही पर सेट करते हैं, तो एपीके मोनो रनटाइम को निष्पादित करने के लिए उपयोग करेगा। USB के माध्यम से डिबगिंग के दौरान मोनो रनटाइम स्वचालित रूप से इंस्टॉल हो जाता है, लेकिन रिलीज़ एपीके में नहीं। यदि डिवाइस में मोनो रनटाइम इंस्टॉल नहीं है और यह विकल्प रिलीज़ एपीके में सही है, तो ऐप क्रैश हो जाएगा।
  • चयनित ABI प्रति एक पैकेज (.apk) उत्पन्न करें : असत्य । अनुकूलता कारणों से, यथासंभव कई प्लेटफार्मों के लिए अपना एपीके बनाएं।
  • मल्टी-डेक्स को सक्षम करें : यह सच है , लेकिन आप इसे गलत पर सेट कर सकते हैं यदि आपका ऐप बहुत जटिल नहीं है (यानी, 65536 से कम तरीके हैं, यहां देखें )।
  • सक्षम सक्षम करें : सच । यह आपके एप्लिकेशन में जावा कोड को बाधित करने वाले प्रोगार्ड टूल को सक्षम करता है। ध्यान दें कि यह .NET कोड पर लागू नहीं होता है; यदि आप .NET कोड को बाधित करना चाहते हैं, तो आपको Dotfuscator का उपयोग करना होगा। Xamarin.Android के लिए Proguard पर अधिक जानकारी यहां पाई जा सकती है
  • डेवलपर इंस्ट्रूमेंटेशन (डिबगिंग और प्रोफाइलिंग) सक्षम करें : रिलीज़ एपीके के लिए गलत
  • जोड़ने : एसडीके और उपयोगकर्ता विधानसभाओं । यह एसडीके और आपके कोड से सभी अप्रयुक्त वर्गों को हटाने के लिए Xamarin Linker को एपीके का आकार कम कर देगा।

महत्वपूर्ण

Xamarin.Linker कभी-कभी उन कक्षाओं को हटा सकता है जो आपके कोड द्वारा उपयोग नहीं किए जाते हैं, खासकर यदि वे प्रोजेक्ट के कोर (पीसीएल लाइब्रेरी) में हैं। उससे बचने के लिए, आप या तो लिंकिंग को "Sdk असेंबलीज़ ओनली" पर सेट कर सकते हैं या अपनी कक्षाओं में संरक्षित विशेषता का उपयोग कर सकते हैं, उदाहरण:

PreserveAttribute.cs

namespace My_App_Core.Models
{
    public sealed class PreserveAttribute : System.Attribute
    {
        public bool AllMembers;
        public bool Conditional;
    }
}

एक कक्षा में:

using System;

namespace My_App_Core.Models
{
    [Preserve(AllMembers = true)]
    public class ServiceException : Exception
    {
        public int errorCode;

        [Preserve(AllMembers = true)]
        public ServiceException() { }

        [Preserve(AllMembers = true)]
        public ServiceException(int errorCode)
        {
            this.errorCode = errorCode;
        }
    }
}
  • समर्थित आर्किटेक्चर : संगतता कारणों से सभी का चयन करें

सब कुछ कॉन्फ़िगर करने के बाद, यह सुनिश्चित करने के लिए प्रोजेक्ट का पुनर्निर्माण करें कि यह सफलतापूर्वक बनाता है।


एपीके फॉर रिलीज़ मोड

आपने रिलीज़ के लिए अपने Android प्रोजेक्ट को कॉन्फ़िगर करना समाप्त कर दिया है। नीचे दिए गए ट्यूटोरियल दिखाते हैं कि विज़ुअल स्टूडियो में एपीके कैसे उत्पन्न किया जाए। Xamarin प्रलेखन से एक पूर्ण ट्यूटोरियल यहां पाया जा सकता है:

https://developer.xamarin.com/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_2_-_signing_the_android_application_package/

एपीके फ़ाइल बनाने के लिए, समाधान एक्सप्लोरर में Xamarin.Android प्रोजेक्ट पर राइट-क्लिक करें और पुरालेख चुनें ...

समाधान एक्सप्लोरर -> राइट-क्लिक करें Xamarin.Android परियोजना -> पुरालेख ...

यह आर्काइव मैनेजर खोलेगा और एपीके फाइल बनाने की तैयारी करते हुए, प्रोजेक्ट को आर्काइव करना शुरू करेगा।

संग्रह की परियोजना

जब यह परियोजना को पूरा करता है, तो आगे बढ़ने के लिए वितरित करें ... पर क्लिक करें।

वितरित करना...

डिस्ट्रिब्यूट स्क्रीन आपके सामने दो विकल्प प्रस्तुत करेगी: Ad-hoc और Google Play। पहला एक एपीके बनाएगा और इसे आपके कंप्यूटर में सेव करेगा। दूसरा ऐप सीधे Google Play में प्रकाशित करेगा।

पहले चुनने की सिफारिश की जाती है, इसलिए यदि आप चाहते हैं तो आप अन्य उपकरणों में एपीके का परीक्षण कर सकते हैं।

वितरण चैनल

निम्न स्क्रीन में, एपीके पर हस्ताक्षर करने के लिए एक एंड्रॉइड की स्टोर की आवश्यकता है। यदि आपके पास पहले से ही एक है, तो आप इसे आयात में क्लिक करके उपयोग कर सकते हैं ...; यदि आप नहीं करते हैं, तो आप + में क्लिक करके एक नया Android कुंजी स्टोर बना सकते हैं।

पहचान का चिन्ह

एक नया Android कुंजी स्टोर स्क्रीन बनाना:

नया एंड्रॉइड की स्टोर बनाना

एपीके बनाने के लिए सेव अस में क्लिक करें। आपको कुंजी स्टोर पासवर्ड टाइप करने के लिए प्रेरित किया जा सकता है।

के रूप रक्षित करें

इस रूप में सहेजें -> फ़ोल्डर ढूंढें

कुंजी स्टोर पासवर्ड दर्ज करें

जब यह पूरा हो जाता है, तो आप अपनी उत्पन्न APK फ़ाइल को देखने के लिए अभिलेखागार स्क्रीन पर ओपन फ़ोल्डर में क्लिक कर सकते हैं।

फोल्डर खोलो

फ़ोल्डर में एपीके

अपने Xamarin.Android APK में मल्टीडेक्स को सक्षम करना

मल्टीडेक्स एंड्रॉइड एपीके में एक पुस्तकालय है जो एप्लिकेशन को 65,536 से अधिक तरीकों की अनुमति देता है।

Android APK में Dalvik निष्पादन योग्य फ़ाइलें (.dex) हैं जो आपके जावा कोड से संकलित जनरेट किए गए बायटेकोड्स को समाहित करती हैं। प्रत्येक .dex फ़ाइल में 65,536 विधियाँ (2 ^ 16) तक हो सकती हैं।

एंड्रॉइड 5.0 लॉलीपॉप (एपीआई 21) से पहले एंड्रॉइड ओएस संस्करण Dalvik रनटाइम का उपयोग करते हैं, जो केवल एपीके प्रति एक .dex फ़ाइल का समर्थन करता है, प्रति एपीके 65,536 तरीकों तक सीमित है। एंड्रॉइड 5.0 से शुरू होकर, एंड्रॉइड ओएस एआरटी रनटाइम का उपयोग करता है, जो सीमा से बचने के लिए प्रति एपीके एक .dex फ़ाइल से अधिक का समर्थन कर सकता है।

एपीआई 21 के नीचे एंड्रॉइड संस्करणों में 65k तरीकों की सीमा को पार करने के लिए, डेवलपर्स को मल्टीडेक्स समर्थन लाइब्रेरी का उपयोग करना चाहिए। MultiDex अतिरिक्त classes.dex फाइलें (classes2.dex, classes3.dex, ...) बनाता है और उन्हें classes.dex फाइल में संदर्भित करता है। जब ऐप लोड होना शुरू होता है, तो यह अतिरिक्त .dex फ़ाइलों को लोड करने के लिए एक मल्टीडेक्स्पेक्शन क्लास का उपयोग करता है।

यदि आपका एंड्रॉइड ऐप एपीआई 21 (एंड्रॉइड 5.0 लॉलीपॉप) के ऊपर या इसके बराबर के एक न्यूनतम एसडीके संस्करण के लिए है, तो मल्टीडेक्स लाइब्रेरी का उपयोग करना आवश्यक नहीं है, क्योंकि ओएस मूल रूप से अतिरिक्त .dex फ़ाइलों को संभालता है। हालाँकि, यदि अनुकूलता कारणों से डेवलपर पुराने Android OS का समर्थन करना चाहता है, तो उसे मल्टीडेक्स लाइब्रेरी का उपयोग करना चाहिए।


अपने Xamarin.Android ऐप में मल्टीडेक्स का उपयोग कैसे करें

सबसे पहले, अपने Xamarin.Android ऐप में मल्टीडेक्स को सक्षम करने के लिए, अपने प्रोजेक्ट गुणों पर जाएं -> Android विकल्प -> पैकेजिंग -> मल्टी-डेक्स को सक्षम करें, जैसा कि नीचे प्रिंट स्क्रीन में है:

मल्टीडेक्स विकल्प को सक्षम करें

फिर, आपको अपने ऐप में एक MultiDexApplication class बनाना होगा। परियोजना की जड़ में, एक नया वर्ग बनाएं (समाधान एक्सप्लोरर में, परियोजना में राइट-क्लिक करें, जोड़ें .. -> वर्ग, या Shift + Alt + C)। नई कक्षा फ़ाइल में, निम्न कोड को कॉपी करें, अपने Xamarin.Android प्रोजेक्ट नाम के नाम के साथ नामस्थान नमूना की जगह लें।

using System;
using Android.App;
using Android.Runtime;
using Java.Interop;

namespace Sample
{
    [Register("android/support/multidex/MultiDexApplication", DoNotGenerateAcw = true)]
    public class MultiDexApplication : Application
    {
        internal static readonly JniPeerMembers _members =
        new XAPeerMembers("android/support/multidex/MultiDexApplication", typeof (MultiDexApplication));

        internal static IntPtr java_class_handle;

        private static IntPtr id_ctor;

        [Register(".ctor", "()V", "", DoNotGenerateAcw = true)]
        public MultiDexApplication()
        : base(IntPtr.Zero, JniHandleOwnership.DoNotTransfer)
        {
            if (Handle != IntPtr.Zero)
                return;

            try
            {
                if (GetType() != typeof (MultiDexApplication))
                {
                    SetHandle(
                        JNIEnv.StartCreateInstance(GetType(), "()V"),
                        JniHandleOwnership.TransferLocalRef);
                        JNIEnv.FinishCreateInstance(Handle, "()V");
                    return;
                }

                if (id_ctor == IntPtr.Zero)
                    id_ctor = JNIEnv.GetMethodID(class_ref, "<init>", "()V");
                SetHandle(
                    JNIEnv.StartCreateInstance(class_ref, id_ctor),
                    JniHandleOwnership.TransferLocalRef);
                JNIEnv.FinishCreateInstance(Handle, class_ref, id_ctor);
            }
            finally
            {
            }
        }

        protected MultiDexApplication(IntPtr javaReference, JniHandleOwnership transfer)
            : base(javaReference, transfer)
        {
        }

        internal static IntPtr class_ref
        {
            get { return JNIEnv.FindClass("android/support/multidex/MultiDexApplication", ref java_class_handle); }
        }

        protected override IntPtr ThresholdClass
        {
            get { return class_ref; }
        }

        protected override Type ThresholdType
        {
            get { return typeof (MultiDexApplication); }
        }
    }
}

कोड स्रोत यहाँ।

यदि आप विंडोज के लिए विजुअल स्टूडियो में विकसित कर रहे हैं, तो एंड्रॉइड एसडीके बिल्ड टूल में एक बग भी है जिसे आपको अपनी परियोजना का निर्माण करते समय classes.dex फ़ाइलों को ठीक से बनाने के लिए ठीक करने की आवश्यकता है।

अपने एंड्रॉइड एसडीके फ़ोल्डर में जाएं, बिल्ड-टूल फ़ोल्डर खोलें और एंड्रॉइड एसडीके संकलक की संख्या के साथ फ़ोल्डर होंगे, जैसे:

C: \ Android-SDK \ निर्माण उपकरण \ 23.0.3 \

C: \ Android-SDK \ निर्माण उपकरण \ 24.0.1 \

C: \ Android-SDK \ निर्माण उपकरण \ 25.0.2 \

उन सभी फ़ोल्डरों के अंदर, mainClassesDex.bat नामक एक फाइल होती है , जो एक बैच स्क्रिप्ट होती है जिसका उपयोग classes.xx फाइलें बनाने के लिए किया जाता है। एक टेक्स्ट एडिटर (नोटपैड या नोटपैड ++) के साथ प्रत्येक mainClassesDex.bat फ़ाइल खोलें और इसकी स्क्रिप्ट में, ब्लॉक ढूंढें और बदलें:

if DEFINED output goto redirect
call "%java_exe%" -Djava.ext.dirs="%frameworkdir%" com.android.multidex.MainDexListBuilder "%disableKeepAnnotated%" "%tmpJar%" "%params%"
goto afterClassReferenceListBuilder
:redirect
call "%java_exe%" -Djava.ext.dirs="%frameworkdir%" com.android.multidex.MainDexListBuilder "%disableKeepAnnotated%" "%tmpJar%" "%params%" 1>"%output%"
:afterClassReferenceListBuilder

ब्लॉक के साथ:

SET params=%params:'=%  
if DEFINED output goto redirect  
call "%java_exe%" -Djava.ext.dirs="%frameworkdir%" com.android.multidex.MainDexListBuilder %disableKeepAnnotated% "%tmpJar%" %params%  
goto afterClassReferenceListBuilder  
:redirect
call "%java_exe%" -Djava.ext.dirs="%frameworkdir%" com.android.multidex.MainDexListBuilder %disableKeepAnnotated% "%tmpJar%" %params% 1>"%output%"  
:afterClassReferenceListBuilder

स्रोत यहाँ

परिवर्तनों के बाद पाठ संपादक में प्रत्येक mainClassesDex.bat सहेजें।

उपरोक्त चरणों के बाद, आपको अपने Xamarin.Android ऐप को सफलतापूर्वक मल्टीडेक्स के साथ बनाने में सक्षम होना चाहिए।

अपने Xamarin.Android APK में ProGuard को सक्षम करना

ProGuard एक उपकरण है जिसका उपयोग भवन प्रक्रिया में आपके एपीके के जावा कोड को अनुकूलित करने और बाधित करने के लिए किया जाता है, और उपयोग की गई कक्षाओं को भी हटाता है। ProGuard का उपयोग करते समय परिणामी एपीके का आकार छोटा होगा और रिवर्स-इंजीनियर (विघटन) के लिए कठिन होगा।

ProGuard का उपयोग Xamarin.Android ऐप्स में भी किया जा सकता है, और एपीके फ़ाइल का आकार भी कम करेगा और जावा कोड को बाधित करेगा। हालाँकि, अवगत रहें, कि ProGuard obfuscation केवल Java कोड पर लागू होता है। .NET कोड को बाधित करने के लिए, डेवलपर को Dotfuscator या समान टूल का उपयोग करना चाहिए।


अपने Xamarin.Android ऐप में ProGuard का उपयोग कैसे करें

सबसे पहले, अपने Xamarin.Android ऐप में ProGuard को सक्षम करने के लिए, अपने प्रोजेक्ट गुणों पर जाएं -> Android विकल्प -> पैकेजिंग -> ProGuard सक्षम करें, जैसा कि नीचे दी गई प्रिंट स्क्रीन में है:

ProGuard सक्षम करें

यह आपके एप्लिकेशन का निर्माण करते समय ProGuard को सक्षम बनाता है।

Xamarin.Android, डिफ़ॉल्ट रूप से, ProGuard के लिए अपना स्वयं का कॉन्फ़िगरेशन सेट करता है, जो फ़ोल्डर्स के अंदर पाया जा सकता है obj/Debug/proguard या obj/Release/proguard , फाइलों में proguard_project_primary.cfg , proguard_project_references.cfg और proguard_xamarin.cfg । तीन फ़ाइलों को ProGuard के लिए विन्यास के रूप में संयोजित किया गया है और निर्माण के दौरान वे Xamarin द्वारा स्वचालित रूप से बनाई गई हैं।

यदि डेवलपर ProGuard विकल्पों को और अधिक कस्टमाइज़ करना चाहता है, तो वह proguard.cfg नाम के प्रोजेक्ट के रूट में एक फ़ाइल बना सकता है (अन्य नाम भी मान्य हैं, जब तक कि एक्सटेंशन .cfg है) और इसके बिल्ड एक्शन को ProguardConfiguration पर सेट करें। नीचे दिए गए चित्र के अनुसार:

ProguardConfiguration को बिल्ड एक्शन सेट करना

फ़ाइल में, कस्टम ProGuard विकल्प डाले जा सकते हैं, जैसे -dontwarn , -keep class और अन्य

महत्वपूर्ण

अब (अप्रैल / 2017) तक, आमतौर पर डाउनलोड किए जाने वाले एंड्रॉइड एसडीके में प्रोगार्ड का एक पुराना संस्करण है, जो जावा 1.8 का उपयोग करके ऐप का निर्माण करते समय त्रुटियों का कारण बन सकता है। निर्माण करते समय, त्रुटि सूची निम्न संदेश दिखाती है:

Error
Can't read [C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\MonoAndroid\v7.0\mono.android.jar] 
(Can't process class [android/app/ActivityTracker.class]  (Unsupported class version number [52.0] (maximum 51.0, Java 1.7))) [CREATEMULTIDEXMAINDEXCLASSLIST]

स्रोत यहाँ

इस समस्या को ठीक करने के लिए, आपको ProGuard ( यहां ) का सबसे हाल का संस्करण डाउनलोड करना होगा और android-sdk\tools\proguard\ के लिए .zip फ़ाइल की सामग्री को कॉपी करना होगा। यह अद्यतन करेगा ProGuard और निर्माण प्रक्रिया समस्याओं के बिना चलना चाहिए।

उसके बाद, आपको ProGuard के साथ अपने Xamarin.Android ऐप को सफलतापूर्वक बनाने में सक्षम होना चाहिए।

ProGuard और Linker से संबंधित "रहस्यमय" बग

आपने एक बेहतरीन ऐप बनाया और अच्छे नतीजों के साथ डेब्यू में इसे टेस्ट किया। सब कुछ ठीक चल रहा था!

लेकिन फिर, आपने अपने ऐप को रिलीज़ के लिए तैयार करने का निर्णय लिया। आपने मल्टीडेक्स, प्रोगार्ड और लिंकर की स्थापना की और फिर, इसने काम करना बंद कर दिया।

यह ट्यूटोरियल प्रोगार्ड और लिंकर से जुड़ी आम समस्याओं का पता लगाने में आपकी मदद करता है जो रहस्यमय कीड़े पैदा कर सकते हैं।


ज़मरीन को समझना। लिकर

Xamarin.Linker निर्माण प्रक्रिया में एक उपकरण है जो आपके .NET कोड (जावा कोड नहीं) से अप्रयुक्त कोड और कक्षाएं हटाता है। आपकी परियोजना के गुणों में -> Android विकल्प -> लिंकर, विकल्पों के साथ एक चयन बॉक्स लिंकिंग होगा:

लिंकर विकल्प

कोई नहीं : कोई कोड नहीं निकाला गया है।

Sdk असेंबली केवल : यह विकल्प केवल Xamarin पुस्तकालयों में अप्रयुक्त कोड की जांच करने के लिए Xamarin.Linker बनाता है। यह विकल्प सुरक्षित है।

Sdk और उपयोगकर्ता असेंबली : यह विकल्प Xamarin पुस्तकालयों और परियोजना कोड (PCL, Xamarin घटकों और NuGet पैकेज सहित) में अप्रयुक्त कोड की जांच करने के लिए Xamarin.Linker बनाता है। यह विकल्प हमेशा सुरक्षित नहीं होता है!

Sdk और उपयोगकर्ता असेंबलियों के विकल्प का उपयोग करते समय, Xamarin.Linker सोच सकता है कि कोड के कुछ हिस्से अप्रयुक्त हैं जब वास्तव में वे बहुत अधिक उपयोग किए जाते हैं! इससे कुछ लाइब्रेरी ठीक से काम करना बंद कर सकती हैं और आपके ऐप में बग पैदा कर सकती हैं।

Xamarin.Linker को कोड नहीं हटाने के लिए, 3 विकल्प हैं:

  1. लिंकिंग ऑप्शन को कोई नहीं या Sdk असेंबलीज़ केवल पर सेट करना;
  2. असेंबलिंग को छोड़ दें;
  3. संरक्षित विशेषता का उपयोग करना।

उदाहरण के लिए 2. लिंकिंग असेंबली को छोड़ें:

नीचे दिए गए उदाहरण में, Xamarin.Linker का उपयोग करने के कारण एक NuGet पैकेज ( ऑक्टोकिट ) काम करना बंद करने के लिए ठीक काम करता है, क्योंकि यह अब इंटरनेट से कनेक्ट नहीं हो सकता है:

[0:] ERROR
[0:] SOURCE: mscorlib
[0:] MESSAGE: Object reference not set to an instance of an object.
[0:] STACK TRACE:   at Octokit.PocoJsonSerializerStrategy.DeserializeObject (System.Object value, System.Type type) [0x003d8] in D:\repos\octokit.net\Octokit\SimpleJson.cs:1472 
  at Octokit.Internal.SimpleJsonSerializer+GitHubSerializerStrategy.DeserializeObject (System.Object value, System.Type type) [0x001c3] in D:\repos\octokit.net\Octokit\Http\SimpleJsonSerializer.cs:165 
  at Octokit.SimpleJson.DeserializeObject (System.String json, System.Type type, Octokit.IJsonSerializerStrategy jsonSerializerStrategy) [0x00007] in D:\repos\octokit.net\Octokit\SimpleJson.cs:583 
  at Octokit.SimpleJson.DeserializeObject[T] (System.String json, Octokit.IJsonSerializerStrategy jsonSerializerStrategy) [0x00000] in D:\repos\octokit.net\Octokit\SimpleJson.cs:595 
  at Octokit.Internal.SimpleJsonSerializer.Deserialize[T] (System.String json) [0x00000] in D:\repos\octokit.net\Octokit\Http\SimpleJsonSerializer.cs:21 
  at Octokit.Internal.JsonHttpPipeline.DeserializeResponse[T] (Octokit.IResponse response) [0x000a7] in D:\repos\octokit.net\Octokit\Http\JsonHttpPipeline.cs:62 
  at Octokit.Connection+<Run>d__54`1[T].MoveNext () [0x0009c] in D:\repos\octokit.net\Octokit\Http\Connection.cs:574 
--- End of stack trace from previous location where exception was thrown ---

लाइब्रेरी को फिर से काम करना शुरू करने के लिए, प्रोजेक्ट में स्थित स्किप लिंकिंग असेंबली फील्ड में पैकेज संदर्भ नाम जोड़ना आवश्यक था -> गुण -> Android विकल्प -> लिंकर, जैसा कि नीचे दी गई तस्वीर में है:

लिंकिंग असेंबली को छोड़ प्रोजेक्ट संदर्भ जोड़ना

उसके बाद, पुस्तकालय ने बिना किसी मुद्दे के काम करना शुरू कर दिया।

उदाहरण के लिए 3. संरक्षित विशेषता का उपयोग करना:

Xamarin.Linker अप्रयुक्त कोड के रूप में अपनी परियोजना के मूल में मॉडल कक्षाओं से ज्यादातर कोड मानता है।

लिंकिंग प्रक्रिया के दौरान कक्षा को संरक्षित करने के लिए, आप संरक्षित विशेषता का उपयोग कर सकते हैं।

सबसे पहले, अपने प्रोजेक्ट कोर का एक क्लास बनाएं जिसका नाम PreserveAttribute.cs है , निम्नलिखित कोड डालें और अपने प्रोजेक्ट के नाम स्थान के साथ नामस्थान बदलें:

PreserveAttribute.cs:

namespace My_App_Core.Models
{
    public sealed class PreserveAttribute : System.Attribute
    {
        public bool AllMembers;
        public bool Conditional;
    }
}

अपनी परियोजना के मूल के प्रत्येक मॉडल वर्ग में, नीचे दिए गए उदाहरण के अनुसार संरक्षित विशेषता डालें:

Country.cs:

using System;
using System.Collections.Generic;

namespace My_App_Core.Models
{
    [Preserve(AllMembers = true)]
    public class Country
    {
        public String name { get; set; }
        public String ISOcode { get; set; }

        [Preserve(AllMembers = true)]
        public Country(String name, String ISOCode)
        {
            this.name = name;
            this.ISOCode = ISOCode;
        }
    }
}

उसके बाद, लिंकिंग प्रक्रिया अब संरक्षित कोड को नहीं हटाएगी।


प्रोगार्ड को समझना

ProGuard निर्माण प्रक्रिया में एक उपकरण है जो आपके जावा कोड से अप्रयुक्त कोड और कक्षाएं हटाता है। यह कोड को भी बाधित और अनुकूलित करता है।

हालाँकि, ProGuard कभी-कभी कोड को हटा सकता है जिसे वह अप्रयुक्त मानता है, जब वह नहीं है। उस से बचने के लिए, डेवलपर को ऐप (एंड्रॉइड डिवाइस मॉनिटर और विज़ुअल स्टूडियो डीबग में) को डीबग करना होगा और यह पता लगाना होगा कि क्लास को हटाने के लिए प्रोगार्ड कॉन्फ़िगरेशन फ़ाइल को कॉन्फ़िगर करने के लिए कौन सी क्लास हटा दी गई थी।

उदाहरण

नीचे दिए गए उदाहरण में, PROGuard ने AXML लेआउट फ़ाइलों में उपयोग की जाने वाली दो कक्षाएं (Android.Support.V7.Widget.FitWindowsLinearLayout और Android.Support.Design.Widget.AppBarLayout) को हटा दिया, लेकिन कोड में अप्रयुक्त के रूप में माना जाता था। गतिविधि लेआउट का प्रतिपादन करते समय जावा कोड में ClassNotFoundException को हटाने का कारण:

layout_activitymain.axml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activitymain_drawerlayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true" <!-- ### HERE ### -->
    tools:openDrawer="start">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true">
        <!-- ### HERE ## -->
        <android.support.design.widget.AppBarLayout
            android:id="@+id/activitymain_appbarlayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/AppTheme.AppBarOverlay">
...

LogCat SetContentView में लेआउट बनाते समय त्रुटि दिखा रहा है:

LogCat में त्रुटि दिखा रहा है

इस त्रुटि को ठीक करने के लिए, प्रॉजेक्ट की प्रॉजेक्ट कॉन्फ़िगरेशन फ़ाइल में निम्न पंक्तियों को जोड़ना आवश्यक था:

-keep public class android.support.v7.widget.FitWindowsLinearLayout
-keep public class android.support.design.widget.AppBarLayout

उसके बाद, लेआउट बनाते समय कोई और त्रुटि नहीं दिखाई गई थी।

प्रोगार्ड चेतावनी

ProGuard कभी-कभी अपने प्रोजेक्ट के निर्माण के बाद त्रुटि सूची में चेतावनी दिखाता है। हालांकि वे एक सवाल उठाते हैं कि क्या आपका ऐप ठीक है या नहीं, उनकी सभी चेतावनियाँ परेशानियों का संकेत नहीं देती हैं, खासकर अगर आपका ऐप सफलतापूर्वक बन जाता है।

इसके लिए एक उदाहरण पिकासो पुस्तकालय का उपयोग करते समय है: okio.Okio: can't find referenced class (...) का उपयोग करते समय, यह okio.Okio: can't find referenced class (...) जैसे चेतावनी दिखा सकता है okio.Okio: can't find referenced class (...) can't write resource [META-INF/MANIFEST.MF] (Duplicate zip entry [okhttp.jar:META-INF/MANIFEST.MF]) (...) या can't write resource [META-INF/MANIFEST.MF] (Duplicate zip entry [okhttp.jar:META-INF/MANIFEST.MF]) (...) , लेकिन ऐप बनाता है और लाइब्रेरी समस्याओं के बिना काम करता है।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow