কীভাবে কোড সঙ্কুচিত করবেন - ডেক্সে 65k পদ্ধতির সীমা


91

আমার কাছে একটি বড় অ্যান্ড্রয়েড অ্যাপ্লিকেশন রয়েছে যা অনেক লাইব্রেরি প্রকল্পের উপর নির্ভর করে। অ্যান্ড্রয়েড সংকলকটির .dex ফাইলে প্রতি 65536 পদ্ধতির সীমাবদ্ধতা রয়েছে এবং আমি এই সংখ্যাটি ছাড়িয়ে যাচ্ছি।

আপনি যখন পদ্ধতিটির সীমাটি চাপেন তখন মূলত দুটি পথ আপনি বেছে নিতে পারেন (কমপক্ষে যা আমি জানি)

1) আপনার কোড সঙ্কুচিত করুন

২) একাধিক ডেক্স ফাইল তৈরি করুন ( এই ব্লগ পোস্টটি দেখুন )

আমি উভয়ের দিকে তাকাতে এবং আমার পদ্ধতির গণনাটি এত বেশি হয়ে যাওয়ার কারণ কী তা খুঁজে বের করার চেষ্টা করেছি। গুগল ড্রাইভ এপিআই 12,000 এরও বেশি পেয়ারা নির্ভরতার সাথে সবচেয়ে বড় অংশ নেয়। ড্রাইভের API v2 এর জন্য মোট লিবগুলি 23,000 এরও বেশি পৌঁছেছে!

আমার প্রশ্নটি আমার অনুমান, আমার কি করা উচিত বলে আপনি মনে করেন? আমার অ্যাপ্লিকেশনটির বৈশিষ্ট্য হিসাবে আমার কি গুগল ড্রাইভ ইন্টিগ্রেশন সরিয়ে নেওয়া উচিত? এপিআইটি সঙ্কুচিত করার কোনও উপায় আছে (হ্যাঁ, আমি অগ্রগতি ব্যবহার করি)? আমি কি একাধিক ডেক্স রুটে যেতে পারি (যা বরং বেদনাদায়ক দেখাচ্ছে, বিশেষত তৃতীয় পক্ষের API গুলি নিয়ে কাজ করে)?


4
আমি আপনার অ্যাপ্লিকেশন ভালবাসা ঘটতে। আপনি কি সিউডো apkআকারে সমস্ত অতিরিক্ত লিবসের প্রয়োজনীয় ডাউনলোড করার কথা ভেবেছেন ? আমি ব্যক্তিগতভাবে ড্রাইভের একীকরণ দেখতে চাই
জবার্ডভিগাস

8
ফেসবুক সম্প্রতি তাদের অ্যান্ড্রয়েড অ্যাপ্লিকেশনটিতে প্রায় একই ধরণের সমস্যার মতো বলে মনে হচ্ছে যার জন্য তাদের কাজটি নথিভুক্ত করেছে। দরকারী হতে পারে: facebook.com/notes/facebook-engineering/…
রূবেন স্ক্র্যাটন

4
একাধিক ডেক্স রুটটি শিরোনাম শুরু করা। আমি গুগল ড্রাইভের সাথে কাজ করতে সফলভাবে একটি মাধ্যমিক ডেক্স ফাইল তৈরি করেছি। নির্ভরতা হিসাবে যে পেয়ারা প্রয়োজন তার জন্য আমি খারাপ বোধ করি। : পি এটি এখনও আমার কাছে বেশ বড় সমস্যা যদিও
জ্যারেড রুম্মার

4
আপনি পদ্ধতিগুলি কীভাবে গণনা করবেন?
Bri6ko

4
এখানে অতিরিক্ত অতিরিক্ত নোটগুলি: stackoverflow.com/questions/21490382 (কোনও ইউটিলিটির লিঙ্ক সহ যা একটি APK এ পদ্ধতির উল্লেখগুলি তালিকাভুক্ত করবে)। নোট করুন 64৪ কে সীমাটি ফেসবুক ইস্যুর সাথে কিছু মন্তব্য যুক্ত নয়।
ফেডেন

উত্তর:


69

দেখে মনে হচ্ছে গুগল শেষ পর্যন্ত ডেক্স ফাইলগুলির 65 কে পদ্ধতির সীমা ছাড়িয়ে যাওয়ার জন্য একটি কার্যকর / সংশোধন বাস্তবায়ন করেছে।

65K রেফারেন্স সীমা সম্পর্কে

অ্যান্ড্রয়েড অ্যাপ্লিকেশন (APK) ফাইলগুলিতে ডালভিক এক্সিকিউটেবল (ডেক্স) ফাইল আকারে এক্সিকিউটেবল বাইটকোড ফাইল থাকে যা আপনার অ্যাপ্লিকেশন চালানোর জন্য ব্যবহৃত সংকলিত কোড ধারণ করে। ডালভিক এক্সিকিউটেবল স্পেসিফিকেশন আপনার নিজের কোডে অ্যান্ড্রয়েড ফ্রেমওয়ার্ক পদ্ধতি, গ্রন্থাগার পদ্ধতি এবং পদ্ধতি সহ একক ডিএক্স ফাইলের মধ্যে উল্লেখ করা যায় এমন মোট পদ্ধতির সংখ্যা সীমাবদ্ধ করে। এই সীমাটি পেরিয়ে যাওয়ার জন্য আপনাকে মাল্টিডেক্স কনফিগারেশন হিসাবে পরিচিত একাধিক ডেক্স ফাইল তৈরি করতে আপনার অ্যাপ বিল্ড প্রক্রিয়াটি কনফিগার করতে হবে।

অ্যান্ড্রয়েড 5.0 এর পূর্বে মাল্টিডেক্স সমর্থন

অ্যান্ড্রয়েড 5.0 এর পূর্বে প্ল্যাটফর্মের সংস্করণগুলি অ্যাপ কোড চালানোর জন্য ডালভিক রানটাইম ব্যবহার করে। ডিফল্টরূপে, ডালভিক অ্যাপ্লিকেশনগুলিকে একক ক্লাসে সীমাবদ্ধ করে। এই সীমাবদ্ধতাটি পেতে, আপনি মাল্টিডেক্স সমর্থন লাইব্রেরিটি ব্যবহার করতে পারেন , যা আপনার অ্যাপ্লিকেশনটির প্রাথমিক ডেক্স ফাইলের অংশ হয়ে যায় এবং তারপরে অতিরিক্ত ডিএক্স ফাইল এবং এতে থাকা কোডটিতে অ্যাক্সেস পরিচালনা করে।

অ্যান্ড্রয়েড 5.0 এবং উচ্চতরর জন্য মাল্টিডেক্স সমর্থন

অ্যান্ড্রয়েড 5.0 এবং উচ্চতর এআরটি নামক একটি রানটাইম ব্যবহার করে যা অ্যাপ্লিকেশন এপিএইচ ফাইলগুলি থেকে একাধিক ডেক্স ফাইল লোড করতে সমর্থন করে। এআরটি অ্যাপ্লিকেশন ইনস্টল করার সময় প্রাক-সংকলন সম্পাদন করে যা ক্লাস (.. এন) .ডেক্স ফাইলগুলির জন্য স্ক্যান করে এবং অ্যান্ড্রয়েড ডিভাইস দ্বারা কার্যকর করার জন্য একটি একক .Oat ফাইলে সংকলন করে। অ্যান্ড্রয়েড 5.0 রানটাইমের আরও তথ্যের জন্য, এআরটি প্রবর্তন করা দেখুন ।

দেখুন: 65 কেও বেশি পদ্ধতির সাথে বিল্ডিং অ্যাপ্লিকেশন


মাল্টিডেক্স সাপোর্ট লাইব্রেরি

এই গ্রন্থাগারটি একাধিক ডালভিক এক্সিকিউটেবল (ডেক্স) ফাইল সহ অ্যাপ্লিকেশন তৈরির জন্য সহায়তা সরবরাহ করে। 65536 টিরও বেশি পদ্ধতির অ্যাপ্লিকেশনগুলিকে মাল্টিডেক্স কনফিগারেশন ব্যবহার করার প্রয়োজন required মাল্টিডেক্স ব্যবহার সম্পর্কে আরও তথ্যের জন্য , 65 কেও বেশি পদ্ধতি সহ বিল্ডিং অ্যাপ্লিকেশনগুলি দেখুন ।

আপনি অ্যান্ড্রয়েড সমর্থন লাইব্রেরিগুলি ডাউনলোড করার পরে এই পাঠাগারটি / এক্সট্রা / অ্যান্ড্রয়েড / সমর্থন / মাল্টিডেক্স / ডিরেক্টরিতে অবস্থিত। লাইব্রেরিতে ব্যবহারকারীর ইন্টারফেস সংস্থান নেই। আপনার অ্যাপ্লিকেশন প্রকল্পে এটি অন্তর্ভুক্ত করতে, সংস্থান ছাড়াই লাইব্রেরি যুক্ত করার জন্য নির্দেশাবলী অনুসরণ করুন

এই গ্রন্থাগারের জন্য গ্র্যাডল বিল্ড স্ক্রিপ্ট নির্ভরতা শনাক্তকরণটি নিম্নরূপ:

com.android.support:m Multidexx.0.+ এই নির্ভরতা স্বরলিপিটি প্রকাশের সংস্করণ 1.0.0 বা উচ্চতর নির্দিষ্ট করে।


আপনি এখনও সক্রিয়ভাবে অগ্রগতি ব্যবহার করে এবং আপনার নির্ভরতা পর্যালোচনা করে 65K পদ্ধতি সীমাটি আঘাত করা এড়ানো উচিত।


6
+1, লোকেরা যখন একই ব্যক্তির উত্তর দেওয়া হয় তখন তারা কেন সঠিক উত্তরগুলিকে সমর্থন করে না?
পেসারিয়ার

মিনিট এপিআই লেভেল হয়ে যায় ১৪!
বিহান ভার্মা

4
প্রতিটি বিল্ডে আপনার বর্তমান পদ্ধতি গণনা দিতে আমরা একটি ছোট গ্র্যাডল প্লাগইন লিখেছি। আমাদের কাছে লাইব্রেরি পরিচালনা করতে সহায়ক ছিল - github.com/KeepSafe/dexcount-gradle-plugin
ফিলিপ

53

আপনি এটির জন্য মাল্টিডেক্স সমর্থন লাইব্রেরিটি ব্যবহার করতে পারেন, মাল্টিডেক্স সক্ষম করতে

1) নির্ভরতা মধ্যে এটি অন্তর্ভুক্ত:

dependencies {
  ...
  compile 'com.android.support:multidex:1.0.0'
}

2) আপনার অ্যাপ্লিকেশন এ এটি সক্ষম করুন:

defaultConfig {
    ...
    minSdkVersion 14
    targetSdkVersion 21
    ....
    multiDexEnabled true
}

3) আপনার কাছে যদি আপনার অ্যাপ্লিকেশনটির জন্য একটি অ্যাপ্লিকেশন শ্রেণি থাকে তবে এইভাবে সংযুক্তিবেসকন্টেক্সট পদ্ধতিটি ওভাররাইড করুন :

package ....;
...
import android.support.multidex.MultiDex;

public class MyApplication extends Application {
  ....
   @Override
   protected void attachBaseContext(Context context) {
    super.attachBaseContext(context);
    MultiDex.install(this);
   }
}

৪) আপনার কাছে যদি আপনার অ্যাপ্লিকেশনটির জন্য কোনও অ্যাপ্লিকেশন শ্রেণি না থাকে তবে আপনার ম্যানিফেস্ট ফাইলটিতে অ্যান্ড্রয়েড.সুਪੋਰਟপোর্ট.মলটিডেক্স.মুলটিডেক্স অ্যাপ্লিকেশন হিসাবে নিবন্ধন করুন। এটার মত:

<application
    ...
    android:name="android.support.multidex.MultiDexApplication">
    ...
</application>

এবং এটি ঠিক কাজ করা উচিত!


32

Play Services6.5+ সহায়তা করে: http://android-developers.blogspot.com/2014/12/google-play-services-and-dex-method.html

"গুগল প্লে পরিষেবাগুলির .5.৫ সংস্করণ দিয়ে শুরু করে, আপনি বেশ কয়েকটি স্বতন্ত্র এপিআই থেকে বেছে নিতে সক্ষম হবেন এবং আপনি দেখতে পাবেন"

...

"এটিতে ট্রানজিটিভভাবে 'বেস' লাইব্রেরি অন্তর্ভুক্ত থাকবে, যা সমস্ত এপিআইতে ব্যবহৃত হয়।"

এটি একটি সুসংবাদ, একটি সাধারণ গেমের জন্য উদাহরণস্বরূপ আপনার সম্ভবত কেবল প্রয়োজন base, gamesএবং সম্ভবত drive

"এপিআই নামের সম্পূর্ণ তালিকা নীচে নীচে রয়েছে details আরও বিশদ অ্যান্ড্রয়েড বিকাশকারী সাইটে পাওয়া যাবে .:

  • com.google.android.gms: প্লে-পরিষেবাদি-বেস: 6.5.87
  • com.google.android.gms: প্লে-পরিষেবাদি-বিজ্ঞাপনগুলি: 6.5.87
  • com.google.android.gms: play-Services-appindexing: 6.5.87
  • com.google.android.gms: play-পরিষেবাদি-মানচিত্র: 6.5.87
  • com.google.android.gms: প্লে-পরিষেবাদি-অবস্থান: 6.5.87
  • com.google.android.gms: play-পরিষেবাদি-ফিটনেস: 6.5.87
  • com.google.android.gms: প্লে-পরিষেবাদি-প্যানোরামা: 6.5.87
  • com.google.android.gms: প্লে-পরিষেবাদি-ড্রাইভ: 6.5.87
  • com.google.android.gms: প্লে-পরিষেবাদি-গেমস: 6.5.87
  • com.google.android.gms: play-পরিষেবাদি-ওয়ালেট: 6.5.87
  • com.google.android.gms: প্লে-পরিষেবাদি-পরিচয়: 6.5.87
  • com.google.android.gms: প্লে-পরিষেবাগুলি castালাই: 6.5.87
  • com.google.android.gms: play-Services-Plus: 6.5.87
  • com.google.android.gms: play-Services-appstate: 6.5.87
  • com.google.android.gms: প্লে-পরিষেবাদি-পরিধানযোগ্য: 6.5.87
  • com.google.android.gms: প্লে-পরিষেবাদি-সমস্ত-পরিধান: 6.5.87

একটি গ্রহন প্রকল্পের মধ্যে কীভাবে এটি করা যায় সে সম্পর্কে কোনও তথ্য?
ব্রায়ান হোয়াইট

আমি এখনও এই সংস্করণে আপগ্রেড করার মতো অবস্থানে নেই। তবে যদি আপনার প্রকল্পটি মাভেন ভিত্তিক হয়, তবে আশা করি আপনার কেবলমাত্র ম্যাভেন পম মধ্যে এটি সমাধান করতে হবে।
সিএসবা তোথ

@ ওয়েবো 80 ওয়েল, আপনি কেবল 6.5.87 সংস্করণ পর্যন্ত থাকলে এটি কেবল সহায়তা করে। পেটির উত্তর সম্পর্কে আমি অবাক, যে অগ্রগতি অব্যবহৃত ফাংশনগুলি বাদ দেয়। আমি ভাবছি এতে যদি ২ য় পক্ষের লিবিও জড়িত থাকে, বা কেবল আপনার নিজের জিনিস। অগ্রগতি সম্পর্কে আমার আরও পড়া উচিত।
সিএসবা তোথ

@ ব্রায়ানহাইট এখনকার একমাত্র সমাধান বলে মনে হয় .jar ফাইলটি কোনও বাহ্যিক সরঞ্জাম দিয়ে ফেলা হবে ..
মিলোসমনস

4
@ সসবা টোথ, আপনি আমাকে বাঁচিয়েছেন! আমি পুরো 'com.google.android.gms: play-পরিষেবাদি' এর পরিবর্তে উপরের তালিকায় কেবল কয়েকটি যুক্ত করেছি এবং এতে পার্থক্য এসেছে!
EZDsIt

9

গুগল প্লে পরিষেবাদির সংস্করণগুলিতে .5.৫ এর আগে আপনাকে আপনার অ্যাপ্লিকেশনটিতে API এর পুরো প্যাকেজটি সংকলন করতে হয়েছিল। কিছু ক্ষেত্রে, এটি করার ফলে আপনার অ্যাপে পদ্ধতিগুলির সংখ্যা (ফ্রেমওয়ার্ক এপিআই, লাইব্রেরি পদ্ধতি এবং আপনার নিজের কোড সহ) 65,536 সীমাতে রাখা আরও কঠিন হয়ে পড়ে।

সংস্করণ .5.৫ থেকে, আপনি পরিবর্তে গুগল প্লে পরিষেবা API গুলি আপনার অ্যাপ্লিকেশনটিতে সংকলন করতে পারেন। উদাহরণস্বরূপ, কেবলমাত্র গুগল ফিট এবং অ্যান্ড্রয়েড ওয়ার্ল এপিআই অন্তর্ভুক্ত করতে আপনার বিল্ড.gradle ফাইলে নিম্নলিখিত লাইনটি প্রতিস্থাপন করুন:

compile 'com.google.android.gms:play-services:6.5.87'

এই লাইনগুলি সহ:

compile 'com.google.android.gms:play-services-fitness:6.5.87'
compile 'com.google.android.gms:play-services-wearable:6.5.87'

আরও রেফারেন্সের জন্য, আপনি এখানে ক্লিক করতে পারেন


এটি কীভাবে গ্রহন করবেন?
Hardik9850

7

আপনার অ্যাপকে হালকা করার জন্য অগ্রগতি ব্যবহার করুন কারণ অব্যবহৃত পদ্ধতিগুলি আপনার চূড়ান্ত বিল্ডে থাকবে না build পেয়ারা সহ প্রগুয়ার্ড ব্যবহার করার জন্য আপনার প্রগুয়ার্ড কনফিগারেশন ফাইলটিতে ডাবল চেক করুন (আমার কাছে ক্ষমা চাইছি যদি আপনার কাছে এটি ইতিমধ্যে থাকে তবে এটি লেখার সময় জানা ছিল না):

# Guava exclusions (http://code.google.com/p/guava-libraries/wiki/UsingProGuardWithGuava)
-dontwarn sun.misc.Unsafe
-dontwarn com.google.common.collect.MinMaxPriorityQueue
-keepclasseswithmembers public class * {
    public static void main(java.lang.String[]);
} 

# Guava depends on the annotation and inject packages for its annotations, keep them both
-keep public class javax.annotation.**
-keep public class javax.inject.**

এছাড়াও, আপনি যদি অ্যাকশনবারেরলক ব্যবহার করে থাকেন, তবে ভি 7 অ্যাপকম্প্যাট সমর্থন লাইব্রেরিতে স্যুইচ করা আপনার পদ্ধতি গণনাও অনেকটা কমাবে (ব্যক্তিগত অভিজ্ঞতার ভিত্তিতে)। নির্দেশাবলী অবস্থিত:


এটি প্রতিশ্রুতিবদ্ধ দেখায় তবে Warning: butterknife.internal.ButterKnifeProcessor: can't find superclass or interface javax.annotation.processing.AbstractProcessorদৌড়ানোর সময় আমি পেয়েছিলাম./gradlew :myapp:proguardDevDebug
এরিকান

4
বিকাশের সময়, যদিও অগ্রগতি সাধারণত চালানো হয় না (শেষ পর্যন্ত গ্রহনের সাথে নয়) সুতরাং রিলিজ বিল্ড না করা পর্যন্ত আপনি সংকোচন থেকে উপকৃত হতে পারবেন না।
ব্রায়ান হোয়াইট

7

গুগল প্লে পরিষেবাগুলির মতো বিশাল বাহ্যিক লাইব্রেরিগুলি সঙ্কুচিত করতে আপনি জার জার লিঙ্কগুলি ব্যবহার করতে পারেন (16 কে পদ্ধতি!)

আপনার যদি আপনি Google থেকে মাত্র চেরা সবকিছু ব্যতীত সার্ভিস বয়াম খেলবে common internalএবং driveউপ-প্যাকেজ।


4

গ্রহপ ব্যবহারকারীদের গ্র্যাডেল ব্যবহার না করার জন্য, এমন সরঞ্জাম রয়েছে যা গুগল প্লে পরিষেবাদির জার ভেঙে ফেলে এবং এটি কেবল নিজের পছন্দ অনুসারে ভাগ করে দেবে।

আমি dextorer দ্বারা স্ট্রিপ_প্লে_সার্ভেস.শ ব্যবহার করি ।

কোন পরিষেবাগুলি অন্তর্ভুক্ত করা উচিত তা সঠিকভাবে জানা মুশকিল হতে পারে কারণ কিছু অভ্যন্তরীণ নির্ভরতা রয়েছে তবে আপনি ছোট শুরু করতে পারেন এবং কনফিগারেশনে যুক্ত করতে পারেন যদি এটির প্রয়োজন হয় যে প্রয়োজনীয় জিনিসগুলি নিখোঁজ রয়েছে।


3

আমি মনে করি যে দীর্ঘমেয়াদে আপনার অ্যাপ্লিকেশনটিকে একাধিক ডেক্সে ভাঙ্গাই সেরা উপায় হবে।


4
গ্রেডলের সাথে এটি করার জন্য আমি একটি সঠিক উপায় সন্ধান করছি: - / কোনও ইঙ্গিত?
ইভান মরগিলো


2

যদি মাল্টিডেক্স ব্যবহার না করে যা বিল্ড প্রক্রিয়াটি খুব ধীর করে তোলে। আপনি নিম্নলিখিত করতে পারেন। হিসাবে yahska উল্লিখিত ব্যবহার নির্দিষ্ট Google Play পরিষেবার গ্রন্থাগার। বেশিরভাগ ক্ষেত্রে কেবল এটির প্রয়োজন।

compile 'com.google.android.gms:play-services-base:6.5.+'

এখানে সমস্ত উপলভ্য প্যাকেজগুলি আপনার এক্সিকিউটেবলের মধ্যে বেছে বেছে API গুলি সংকলন করছে

এটি যথেষ্ট না হলে আপনি গ্রেড স্ক্রিপ্ট ব্যবহার করতে পারেন। এই কোডটি 'স্ট্রিপ_প্লে_সর্জনেসস অ্যাড্রেডল' ফাইলটিতে রাখুন

def toCamelCase(String string) {
String result = ""
string.findAll("[^\\W]+") { String word ->
    result += word.capitalize()
}
return result
}

afterEvaluate { project ->
Configuration runtimeConfiguration = project.configurations.getByName('compile')
println runtimeConfiguration
ResolutionResult resolution = runtimeConfiguration.incoming.resolutionResult
// Forces resolve of configuration
ModuleVersionIdentifier module = resolution.getAllComponents().find {
    it.moduleVersion.name.equals("play-services")
}.moduleVersion


def playServicesLibName = toCamelCase("${module.group} ${module.name} ${module.version}")
String prepareTaskName = "prepare${playServicesLibName}Library"
File playServiceRootFolder = project.tasks.find { it.name.equals(prepareTaskName) }.explodedDir


def tmpDir = new File(project.buildDir, 'intermediates/tmp')
tmpDir.mkdirs()
def libFile = new File(tmpDir, "${playServicesLibName}.marker")

def strippedClassFileName = "${playServicesLibName}.jar"
def classesStrippedJar = new File(tmpDir, strippedClassFileName)

def packageToExclude = ["com/google/ads/**",
                        "com/google/android/gms/actions/**",
                        "com/google/android/gms/ads/**",
                        // "com/google/android/gms/analytics/**",
                        "com/google/android/gms/appindexing/**",
                        "com/google/android/gms/appstate/**",
                        "com/google/android/gms/auth/**",
                        "com/google/android/gms/cast/**",
                        "com/google/android/gms/drive/**",
                        "com/google/android/gms/fitness/**",
                        "com/google/android/gms/games/**",
                        "com/google/android/gms/gcm/**",
                        "com/google/android/gms/identity/**",
                        "com/google/android/gms/location/**",
                        "com/google/android/gms/maps/**",
                        "com/google/android/gms/panorama/**",
                        "com/google/android/gms/plus/**",
                        "com/google/android/gms/security/**",
                        "com/google/android/gms/tagmanager/**",
                        "com/google/android/gms/wallet/**",
                        "com/google/android/gms/wearable/**"]

Task stripPlayServices = project.tasks.create(name: 'stripPlayServices', group: "Strip") {
    inputs.files new File(playServiceRootFolder, "classes.jar")
    outputs.dir playServiceRootFolder
    description 'Strip useless packages from Google Play Services library to avoid reaching dex limit'

    doLast {
        def packageExcludesAsString = packageToExclude.join(",")
        if (libFile.exists()
                && libFile.text == packageExcludesAsString
                && classesStrippedJar.exists()) {
            println "Play services already stripped"
            copy {
                from(file(classesStrippedJar))
                into(file(playServiceRootFolder))
                rename { fileName ->
                    fileName = "classes.jar"
                }
            }
        } else {
            copy {
                from(file(new File(playServiceRootFolder, "classes.jar")))
                into(file(playServiceRootFolder))
                rename { fileName ->
                    fileName = "classes_orig.jar"
                }
            }
            tasks.create(name: "stripPlayServices" + module.version, type: Jar) {
                destinationDir = playServiceRootFolder
                archiveName = "classes.jar"
                from(zipTree(new File(playServiceRootFolder, "classes_orig.jar"))) {
                    exclude packageToExclude
                }
            }.execute()
            delete file(new File(playServiceRootFolder, "classes_orig.jar"))
            copy {
                from(file(new File(playServiceRootFolder, "classes.jar")))
                into(file(tmpDir))
                rename { fileName ->
                    fileName = strippedClassFileName
                }
            }
            libFile.text = packageExcludesAsString
        }
    }
}

project.tasks.findAll {
    it.name.startsWith('prepare') && it.name.endsWith('Dependencies')
}.each { Task task ->
    task.dependsOn stripPlayServices
}
project.tasks.findAll { it.name.contains(prepareTaskName) }.each { Task task ->
    stripPlayServices.mustRunAfter task
}

}

তারপরে এই স্ক্রিপ্টটি আপনার বিল্ড.gradle এ প্রয়োগ করুন

apply plugin: 'com.android.application'
apply from: 'strip_play_services.gradle'

1

যদি গুগল প্লে পরিষেবাদি ব্যবহার করা হয় তবে আপনি হয়ত জানেন যে এটি 20k + পদ্ধতি যুক্ত করে। ইতিমধ্যে উল্লিখিত হিসাবে, অ্যান্ড্রয়েড স্টুডিওতে নির্দিষ্ট পরিষেবাগুলির মডুলার অন্তর্ভুক্তির বিকল্প রয়েছে, তবে ইক্লিপসের সাথে আটকে থাকা ব্যবহারকারীদের নিজের হাতে মডুলারাইজেশন নিতে হবে :(

ভাগ্যক্রমে একটি শেল স্ক্রিপ্ট আছে যা কাজটি মোটামুটি সহজ করে তোলে। গুগল প্লে পরিষেবাদি জার ডিরেক্টরিতে কেবল এক্সট্র্যাক্ট করুন, সরবরাহিত .conf ফাইলটিকে প্রয়োজনীয় হিসাবে সম্পাদনা করুন এবং শেল স্ক্রিপ্টটি সম্পাদন করুন।

এর ব্যবহারের উদাহরণ এখানে


1

যদি গুগল প্লে পরিষেবাদি ব্যবহার করা হয় তবে আপনি হয়ত জানেন যে এটি 20k + পদ্ধতি যুক্ত করে। ইতিমধ্যে উল্লিখিত হিসাবে, অ্যান্ড্রয়েড স্টুডিওতে নির্দিষ্ট পরিষেবাগুলির মডুলার অন্তর্ভুক্তির বিকল্প রয়েছে, তবে ইক্লিপসের সাথে আটকে থাকা ব্যবহারকারীদের নিজের হাতে মডুলারাইজেশন নিতে হবে :(

ভাগ্যক্রমে একটি শেল স্ক্রিপ্ট রয়েছে যা কাজটি মোটামুটি সহজ করে তোলে। গুগল প্লে পরিষেবাদি জার ডিরেক্টরিতে কেবল এক্সট্র্যাক্ট করুন, সরবরাহিত .conf ফাইলটিকে প্রয়োজনীয় হিসাবে সম্পাদনা করুন এবং শেল স্ক্রিপ্টটি সম্পাদন করুন।

এর ব্যবহারের উদাহরণ এখানে।

যেমনটি তিনি বলেছিলেন, আমি compile 'com.google.android.gms:play-services:9.0.0'কেবল আমার প্রয়োজনীয় লাইব্রেরিগুলির সাথে প্রতিস্থাপন করি এবং এটি কাজ করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.