অ্যান্ড্রয়েড গ্রেডলে মাল্টি ফ্লেভার লাইব্রেরি ভিত্তিক মাল্টি ফ্লেভার অ্যাপ্লিকেশন


102

আমার অ্যাপ্লিকেশনটিতে অ্যাপ্লিকেশন-বিলিং সিস্টেমের বেশ কয়েকটি বাজারের জন্য বেশ কয়েকটি স্বাদ রয়েছে।

আমার একটি একক গ্রন্থাগার রয়েছে যা আমার সমস্ত প্রকল্পের জন্য বেস কোডটি ভাগ করে দেয়। সুতরাং আমি এই পেমেন্ট সিস্টেমগুলি এই লাইব্রেরিতে পণ্যের স্বাদ হিসাবে যুক্ত করার সিদ্ধান্ত নিয়েছি।

প্রশ্নটি কী অ্যান্ড্রয়েড লাইব্রেরিতে পণ্যের স্বাদ থাকতে পারে?

যদি তা হয় তবে আমি কীভাবে অ্যাপটির স্বাদে বিভিন্ন স্বাদকে অন্তর্ভুক্ত করতে পারি?

আমি অনেক অনুসন্ধান করেছি এবং এই দৃশ্য সম্পর্কে আমি কিছুই খুঁজে পেলাম না। শুধুমাত্র ঘনিষ্ঠ জিনিস আমি খুঁজে পাওয়া যায় এই ছিল http://tools.android.com/tech-docs/new-build-system/user-guide :

dependencies {
    flavor1Compile project(path: ':lib1', configuration: 'flavor1Release')
    flavor2Compile project(path: ':lib1', configuration: 'flavor2Release')
}

আমি কনফিগারেশন বিভিন্ন জিনিস পরিবর্তন কিন্তু এটি কার্যকর হয়নি!

আমি অ্যান্ড্রয়েড স্টুডিও 0.8.2 ব্যবহার করছি।


অনেক অনুসন্ধানের পরেও, আমি এটি অর্জনের উপায় খুঁজে পাইনি, এমনকি আমি অ্যান্ড্রয়েড 3.4.2প্লাগইনকে সর্বশেষতম সংস্করণে এবং সর্বশেষতম স্তরে গ্রেড করেছি 5.5.1, এটি এখনও সংকলন সময়ের সাথে ব্যর্থ হয়েছে, বা উত্সের সাথে সংযোগ স্থাপন ব্যর্থ হয়েছে, বা লাইব্রেরির ভিতরে থাকা প্রতীকটি খুঁজে পাচ্ছে না মডিউল
ভিনস স্টাইলিং

উত্তর:


141

শেষ পর্যন্ত আমি কীভাবে এটি করব তা জানতে পেরেছিলাম, অন্যদের একই সমস্যার মুখোমুখি হওয়ার জন্য আমি এখানে এটি ব্যাখ্যা করব:

মূল অংশটি হ'ল লাইব্রেরি বিল্ডস্র্যাডল-এ প্রকৃত সত্যে প্রকাশনা নন ডিফল্ট সেট করা, তারপরে আপনাকে ব্যবহারকারী গাইডের পরামর্শ অনুসারে নির্ভরতা নির্ধারণ করতে হবে।

পুরো প্রকল্পটি এরকম হবে:

লাইব্রেরি বিল্ড.gradle:

apply plugin: 'com.android.library'

android {        
    ....
    publishNonDefault true
    productFlavors {
        market1 {}
        market2 {}
    }
}

প্রকল্প

apply plugin: 'com.android.application'

android {
    ....
    productFlavors {
        market1 {}
        market2 {}
    }
}

dependencies {
    ....
    market1Compile project(path: ':lib', configuration: 'market1Release')
    market2Compile project(path: ':lib', configuration: 'market2Release')
}

এখন আপনি অ্যাপ্লিকেশনটির স্বাদ এবং বিল্ড ভেরিয়েন্টস প্যানেলটি নির্বাচন করতে পারেন এবং লাইব্রেরিটি সেই অনুযায়ী নির্বাচন করা হবে এবং সমস্ত বিল্ড এবং রান নির্বাচিত স্বাদের ভিত্তিতে করা হবে।

অ্যান্ড্রয়েড স্টুডিও লাইব্রেরির উপর ভিত্তি করে যদি আপনার একাধিক অ্যাপ মডিউল থাকে তবে বৈকল্পিক নির্বাচন বিরোধের বিষয়ে অভিযোগ করবে, ঠিক আছে, কেবল এটিকে এড়িয়ে যান।

এখানে চিত্র বর্ণনা লিখুন


ভাগ করে নেওয়ার জন্য ধন্যবাদ, এখন আমি আমার ডিফল্টপব্লিশকনফিগের কাজটি থেকে মুক্তি পেতে পারি।
দেলব্ল্যাঙ্কো 14

2
1.1.0 হিসাবে চলমান, উপরের সমাধানটি এখনও কাজ করছে বলে মনে হচ্ছে, তবে 1) ডিবাগ / রিলিজ বিল্ডিংয়ের পছন্দটি হারিয়ে গেছে এবং আমি লাইব্রেরিতে পাওয়া এইআইডিএলের সাথে সমস্যাগুলি বজায় রেখেছি যা বেশিরভাগ ক্ষেত্রে উপযুক্ত কোড তৈরি করতে ব্যর্থ হয়। এই সম্পর্কে কোন চিন্তা?
3c71

1
@ ইগরগানাপলস্কি বিল্ডটাইপস এর সাথে কিছু করার নেই। প্রতিটি স্বাদে সমস্ত বিল্ড টাইপ থাকে (সাধারণত ডিবাগ এবং রিলিজ করা হয়) এবং তাদের সমস্ত এই পদ্ধতির সাথে কাজ করে।
আলী

1
@ আনড্রয়েড এটি লাইব্রেরিকে মার্কেট 1 স্বাদে ব্যবহার করার জন্য সংজ্ঞা দেয়!
আলী

1
কেন এটি "রিলিজ" বিল্ড টাইপ সেট করা আছে? "রিলিজ" বিল্ড টাইপটি কি ডিবাগ বিল্ডগুলির সময় চয়ন করা হয়?
উইন্ডারাইডার

35

আলি উত্তর নিয়ে একটি সমস্যা আছে । আমরা আমাদের বিল্ড ভেরিয়েন্টগুলিতে একটি খুব গুরুত্বপূর্ণ মাত্রা হারাচ্ছি। আমরা সমস্ত বিকল্প (4 (2 এক্স 2) নীচের আমার উদাহরণে) থাকতে চান তাহলে আমরা শুধু যোগ আছে স্বনির্ধারিত মান মধ্যে প্রধান মডিউল build.gradle ফাইলের সব বহু-গন্ধ বহু-buildType ব্যবহার করতে পাবে Build Variants। আমরা সেট করতে publishNonDefault সত্য মধ্যে গ্রন্থাগার মডিউল build.gradle ফাইল।

উদাহরণ সমাধান:

Lib build.gradle

android {

    publishNonDefault true

    buildTypes {
        release {
        }
        debug {
        }
    }
    productFlavors {
        free {
        }
        paid {
        }
    }
}

অ্যাপ বিল্ডড্র্যাডল

android {

    buildTypes {
        debug {
        }
        release {
        }
    }
    productFlavors {
        free {
        }
        paid {
        }
    }
}

configurations {
    freeDebugCompile
    paidDebugCompile
    freeReleaseCompile
    paidReleaseCompile
}

dependencies {

    freeDebugCompile project(path: ':lib', configuration: 'freeDebug')
    paidDebugCompile project(path: ':lib', configuration: 'paidDebug')
    freeReleaseCompile project(path: ':lib', configuration: 'freeRelease')
    paidReleaseCompile project(path: ':lib', configuration: 'paidRelease')

}

আমার অ্যাপ্লিকেশনে একই জিনিসগুলি করার পরে Error:java.lang.RuntimeException: Error: more than one library with package name, পরিবেশন করা হয়েছে
চেতন জোশী

21

অ্যান্ড্রয়েড প্লাগইন 3.0.0 এবং উচ্চতর জন্য আপডেট

অফিসিয়াল অ্যান্ড্রয়েড ডকুমেন্টেশন অনুসারে - স্থানীয় মডিউলগুলির জন্য নির্ভরতা কনফিগারেশনগুলি স্থানান্তরিত করুন ,

বৈকল্পিক-সচেতন নির্ভরতা রেজোলিউশন সহ, আপনাকে আর স্থানীয় রূপরেখা নির্ভরতার জন্য ফ্রিডিবগইম্পিমেশন যেমন ভেরিয়েন্ট-নির্দিষ্ট কনফিগারেশনগুলি ব্যবহার করতে হবে না - প্লাগইন আপনার জন্য এটি যত্ন করে

পরিবর্তে আপনার নির্ভরতাগুলি নিম্নলিখিত হিসাবে কনফিগার করা উচিত:

dependencies {
    // This is the old method and no longer works for local
    // library modules:
    // debugImplementation project(path: ':library', configuration: 'debug')
    // releaseImplementation project(path: ':library', configuration: 'release')

    // Instead, simply use the following to take advantage of
    // variant-aware dependency resolution. You can learn more about
    // the 'implementation' configuration in the section about
    // new dependency configurations.
    implementation project(':library')

    // You can, however, keep using variant-specific configurations when
    // targeting external dependencies. The following line adds 'app-magic'
    // as a dependency to only the "debug" version of your module.

    debugImplementation 'com.example.android:app-magic:12.3'
}

আলীর উত্তরে তাই বদলান

dependencies {
    ....
    market1Compile project(path: ':lib', configuration: 'market1Release')
    market2Compile project(path: ':lib', configuration: 'market2Release')
}

প্রতি

implementation project(':lib')

এবং প্লাগইন স্বয়ংক্রিয়ভাবে বৈকল্পিক নির্দিষ্ট কনফিগারেশনের যত্ন নেবে। আশা করি এটি অন্যকে অ্যান্ড্রয়েড স্টুডিও প্লাগইনকে 3.0.0 এবং উচ্চতরতে উন্নীত করতে সহায়তা করবে।


7

আমার অ্যান্ড্রয়েড প্লাগইনটি 3.4.0, এবং আমি দেখতে পাচ্ছি যে এটির এখনই কনফিগারেশনের দরকার নেই ll সমস্ত আপনার প্রয়োজন তা নিশ্চিত করা দরকার যে অ্যাপ্লিকেশনের ফ্লেভারডাইমেনশনস এবং প্রোডাক্ট ফ্ল্যাওয়ারগুলিতে লাইব্রেরিতে একই স্বাদের মাত্রা এবং প্রোডাক্ট ফ্ল্যাওয়ারের একটি পণ্য রয়েছে sample নমুনার জন্য:

মাইলিবারির বিল্ড.gradle এ

apply plugin: 'com.android.library'

android {        
    ....
    flavorDimensions "mylibFlavor"

    productFlavors {
        market1
        market2
    }
}

অ্যাপ্লিকেশন এর build.gradle:

apply plugin: 'com.android.application'

android {
    ....
    flavorDimensions "mylibFlavor", "appFlavor"
    productFlavors {
        market1 {
            dimension "mylibFlavor"
        }
        market2 {
            dimension "mylibFlavor"
        }
        common1 {
            dimension "appFlavor"
        }
        common2 {
            dimension "appFlavor"
        }
    }
}

dependencies {
    ....
    implementation project(path: ':mylibrary')
}

সিঙ্কের পরে, আপনি বিল্ড ভেরিয়েন্ট উইন্ডোতে সমস্ত বিকল্প স্যুইচ করতে পারেন: এখানে চিত্র বর্ণনা লিখুন


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

@ বিলদা আপনার সকলের অনুলিপি করার দরকার নেই, কেবলমাত্র একই পণ্যটির ফ্ল্যাশটিকে অ্যাপে রাখুন, আমার নমুনার জন্য, আমি মার্কেট 1 বা মার্কেট 2 অ্যাপ্লিকেশনটির বিল্ড.gradle এ রাখতে পারি।
JiajiaGu

2

একটি এআর লাইব্রেরিতে স্বাদগুলি কাজ করতে, আপনাকে আপনার অ্যান্ড্রয়েড লাইব্রেরি মডিউলের বিল্ড.gradle ফাইলে ডিফল্টপব্লিশকনফিগের সংজ্ঞা দিতে হবে।

আরও তথ্যের জন্য, দেখুন: গ্রন্থাগার প্রকাশনা

গ্রন্থাগার প্রকাশনা

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

android {defaultPublishConfig "debug"}

নোট করুন যে এই প্রকাশনা কনফিগারেশন নামটি পুরো বৈকল্পিক নাম উল্লেখ করে। রিলিজ এবং ডিবাগ কেবল তখনই প্রযোজ্য যখন কোনও স্বাদ নেই। স্বাদ ব্যবহারের সময় আপনি যদি ডিফল্ট প্রকাশিত রূপটি পরিবর্তন করতে চান তবে আপনি লিখবেন:

অ্যান্ড্রয়েড {ডিফল্টপ্রকাশিত কনফিগ "flavor1Debug"}


1

এই মুহূর্তে এটি সম্ভব নয়, যদিও আমি যদি এটির বৈশিষ্ট্যটি সঠিকভাবে স্মরণ করি তবে তারা যুক্ত করতে চায়। (সম্পাদনা 2: লিঙ্ক , লিঙ্ক 2 )

সম্পাদনা করুন: এই মুহুর্তে আমি defaultPublishConfigকোন লাইব্রেরির ভেরিয়েন্ট প্রকাশিত হবে তা ঘোষণা করার বিকল্পটি ব্যবহার করছি :

android {
    defaultPublishConfig fullRelease
    defaultPublishConfig demoRelease 
}

1
সুতরাং, প্রতিবার আমি অ্যাপটি সংকলন করতে যাচ্ছি আমাকে অবশ্যই এটি লাইব্রেরির বিল্ড.gradle এ পরিবর্তন করতে হবে?
আলী

ঠিক আছে, হ্যাঁ ... প্রতিবার আপনি আলাদা স্বাদের সাথে অ্যাপটি সংকলন করতে চান।
দেলব্ল্যাঙ্কো

আসলে আমি যখন গ্রন্থাগার মডিউলটির স্বাদগুলি সংজ্ঞায়িত করি তখন উত্তরাধিকার সূত্রে প্রাপ্ত প্যাকেজটি অ্যাপ মডিউলটি খুঁজে পাওয়া যায় না।
আলী

আপনি AS এ গ্রেড ফাইলগুলি সিঙ্ক করেছেন?
দেলব্ল্যাঙ্কো

@ ডেলব্ল্যাঙ্কো এটি ম্যানুয়াল শ্রমের মতো এবং খুব ভঙ্গুর মতো মনে হয় (বিকাশকারীরা অলস এবং তাদের বিল্ড.gradle ফাইলগুলি পরিবর্তন করতে ভুলে যান)।
ইগোরগানাপলস্কি

1

আমি এই বিষয় বন্ধ করে দেয়া হয়েছে, কিন্তু শুধুমাত্র gradle 3.0 সঙ্গে একটি আপডেট, এই দেখুন: https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html#variant_aware এবং grep matchingFallbacksএবং missingDimensionStrategy। মডিউল স্বাদগুলির মধ্যে নির্ভরতা ঘোষণা করা এখন আরও সহজ।

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


আমার জন্য মনে হচ্ছে রানটাইম উত্পন্ন জিনিস এড়িয়ে গেছে। উদাহরণস্বরূপ সাইমনভেট-> স্কিম্যাটিক্স জেনারেশন আমার জন্য নতুন উপায়ে আর কাজ করছে না। : - /
স্টেফান স্প্রেঞ্জার

1

আমি বিভিন্ন বিকল্পের জন্য মডিউলগুলি সংকলন করতেও সমস্যা তৈরি করেছি।

আমি যা পেয়েছি:

গ্রেডল 3.0.০.১ এর পরে দেখে মনে হচ্ছে আমাদের লাইবের ফাইলগুলিতে যুক্ত publishNonDefault trueকরার দরকার নেই ।build.gradle

একটি ক্লাস পচন করার পরে BaseExtensionএটি পাওয়া গেল:

public void setPublishNonDefault(boolean publishNonDefault) {
   this.logger.warn("publishNonDefault is deprecated and has no effect anymore. All variants are now published.");
}

এবং এর পরিবর্তে:

dependencies {
...
   Compile project(path: ':lib', configuration: 'config1Debug')
}

আমাদের ব্যবহার করা উচিত:

dependencies {
...
   implementation project(':lib')
}

শুধুমাত্র গুরুত্বপূর্ণ বিষয়টি হল একটি configurations {...}অংশ যুক্ত করা build.gradle

সুতরাং, অ্যাপ্লিকেশনটির build.gradleফাইলের চূড়ান্ত রূপটি হ'ল:

buildTypes {
   debug {
      ...
   }

   release {
      ...
   }
}

flavorDimensions "productType", "serverType"
productFlavors {
   Free {
      dimension "productType"
      ...
   }
   Paid {
      dimension "productType"
      ...
   }
   Test {
      dimension "serverType"
      ...
   }
   Prod {
      dimension "serverType"
      ...
   }
}

configurations {
   FreeTestDebug
   FreeTestRelease
   FreeProdDebug
   FreeProdRelease
   PaidTestDebug
   PaidTestRelease
   PaidProdDebug
   PaidProdRelease
}

dependencies {
   implementation fileTree(dir: 'libs', include: ['*.jar'])
   implementation project(':lib')
   ...
}

এছাড়াও, আপনি বিল্ড ভেরিয়েন্টগুলিকে সীমাবদ্ধ করতে ফিল্টার রূপগুলি ব্যবহার করতে পারেন ।

পিএস settings.gradleফাইলের মডিউলগুলি অন্তর্ভুক্ত করতে ভুলবেন না , যেমন:

include ':app'
include ':lib'
project(':lib').projectDir = new File('app/libs/lib')

স্যার, আপনি কী ব্যাখ্যা করতে পারবেন যে স্ক্রিপ্টটি একটি নির্দিষ্ট কনফিগারেশনে লাইব্রেরি অন্তর্ভুক্ত করতে আবহাওয়া নির্ধারণ করবে বা না? আমি যখন একটি নির্দিষ্ট গন্ধের জন্য আমার কাছে কিছু লিব ব্যবহার করতে চাই তখন আমার একটি কেস আছে, তবে অন্য গন্ধের জন্য আমার এটি ব্যবহার করার দরকার নেই
জেনিয়া কির্মিজা

এমন পরিস্থিতিতে পড়েনি। তবে একটি গুগল টিউটোরিয়াল বিকাশকারী.অ্যান্ড্রয়েড / স্টুডিও / বিল্ড / ডিপেন্ডেন্সিগুলি "নির্ভরতা {...}" ব্লকে "বাস্তবায়ন" কমান্ডের আগে একটি উপসর্গ যুক্ত করার পরামর্শ দেয়। অর্থাৎ নির্ভরতা {পেইডআইপ্লিমেন্টেশন প্রকল্প (': lib')}, বা নির্ভরতা {ডিবাগআইপ্লিমেন্টেশন প্রকল্প (': lib') any, বা কোনও একাধিক বৈকল্পিক সমন্বয় নির্ভরতা {পেডপ্রডবেগআইপ্লিমেন্টেশন প্রকল্প (': lib')}} এটি দেখুন এবং আমাদের একটি প্রতিক্রিয়া দিন :)
সার্জিও
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.