গ্র্যাডল বিল্ড প্রকারে অ্যাপের নাম কীভাবে পরিবর্তন করবেন


135

গ্রেডে প্রতি বিল্ড প্রকারে আমার অ্যাপ্লিকেশনটির অ্যাপ্লিকেশনটির নামটি পরিবর্তন করতে সক্ষম হওয়ার উপায় খুঁজে বের করার চেষ্টা করছি।

উদাহরণস্বরূপ, আমি চাই ডিবাগ সংস্করণটি থাকতে হবে <APP_NAME>-debugএবং কিউএ সংস্করণটি থাকতে হবে <APP-NAME>-QA

আমি পরিচিত:

debug {
        applicationIdSuffix '.debug'
        versionNameSuffix '-DEBUG'
}

তবে, লঞ্চারের সময় অ্যাপটির পরিবর্তনটি প্রয়োগ করার জন্য গ্রেড কমান্ডের সন্ধান পাচ্ছি না।

উত্তর:


167

দ্বারা "অ্যাপের নাম", আপনি কি বলতে চান তাহলে android:labelউপর <application>, সবচেয়ে সহজ সমাধান স্ট্রিং উৎসের যে বিন্দু আছে হয় (যেমন, android:label="@string/app_name"), তারপর যে স্ট্রিং উৎসের কোনো ভিন্ন সংস্করণ একটি আছে src/debug/sourceset।

আপনি দেখতে পারেন যে এই নমুনা প্রকল্পে , যেখানে আমার জন্য প্রতিস্থাপন app_nameরয়েছে src/debug/res/values/strings.xml, যা debugবিল্ডগুলির জন্য প্রয়োগ করা হবে । releaseবিল্ড app_nameইন এর সংস্করণ ব্যবহার করবে src/main/


এই সমাধানটি কি বোঝায় না যে আমাদের প্রতিটি অনুবাদে একটি অতিরিক্ত স্ট্রিং.এক্সএমএল যুক্ত করতে হবে? এটি বজায় রাখতে ব্যথা হয়ে উঠতে পারে ...
sfera

7
@ সাফেরা: প্রথমত, আপনি যদি চান তবে এই স্ট্রিংটি তার নিজস্ব রিসোর্স ফাইলে আলাদা করতে স্বাগত। দ্বিতীয়ত, এটি কেবল একটি স্ট্রিংয়ের জন্য। তৃতীয়ত, এটি কেবল সেই বিল্ড প্রকারের জন্য যেখানে আপনি সেই স্ট্রিংটি প্রতিস্থাপন করতে চান। চতুর্থত, আপনার যদি সাধারণ ভাষা ব্যতীত একটি উন্নয়ন দল না থাকে, আপনার অ- releaseস্ট্রিংগুলি অনুবাদ করার প্রয়োজন হবে না ।
কমন্সওয়্যার

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

1
@ এসফেরা: "এটাই আমি এড়াতে চাইছিলাম" - সুতরাং, এই একটি স্ট্রিংটি অনুবাদ করবেন না। সেই স্ট্রিংয়ের পরীক্ষাটি যাইহোক অবৈধ হবে, সংজ্ঞা অনুসারে এটি releaseমোডে আপনি যে স্ট্রিংটি ব্যবহার করতে চান তা নয় । এবং এই স্ট্রিং রিসোর্সটি কেবল app_nameঅন্য কোনও ভূমিকার জন্য নয়।
কমন্সওয়েয়ার

3
@ এসফেরা: আপনি কখনই অ্যাপ্লিকেশনটি "অ্যাপনম-ডিবিইউজি" দিয়ে পাঠাবেন না। আপনি "অ্যাপনম" দিয়ে কোনও অ্যাপ্লিকেশন পাঠাতে পারেন। "AppNom-DEBUG" পরীক্ষা করা অতএব অপ্রয়োজনীয়। app_nameএটির প্রয়োজনীয় না হওয়া সত্ত্বেও একটি ডিবাগ সংস্করণটি অনুবাদ করার জন্য আপনাকে অবশ্যই স্বাগত জানানো হয়েছে (যেমন, আপনার ফ্রেঞ্চ বা জার্মান বিকাশকারীরা আছেন যারা ইংরেজিতে কথা বলেন না এবং তাই এটির অনুবাদ করা দরকার)। এটির অনুবাদগুলির সাথে কাজগুলির আনমোডিং releaseসংস্করণ কিনা তা app_nameপরীক্ষার releaseজন্য, বিল্ডটি পরীক্ষা করুন বা একটি near-releaseবিল্ড টাইপ তৈরি করুন যা কেবলমাত্র অ্যাপ্লিকেশন আইডি প্রত্যয় যুক্ত করে এবং স্ট্রিংগুলি একা ফেলে দেয়।
কমন্সওয়ের

159

আপনি এই জাতীয় কিছু ব্যবহার করতে পারেন

 buildTypes {
    debug {
        applicationIdSuffix '.debug'
        versionNameSuffix '-DEBUG'
        resValue "string", "app_name", "AppName debug"
    }
    release {
        minifyEnabled true
        shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.release
        zipAlignEnabled true
        resValue "string", "app_name", "AppName"
    }
}

আপনি অ্যান্ড্রয়েডম্যানিফেস্ট.এক্সএমএল ফাইলগুলিতে @ স্ট্রিং / অ্যাপ_নাম ব্যবহার করতে পারেন ।

মান / ফোল্ডার থেকে আপনি অ্যাপ_নাম সরিয়েছেন তা নিশ্চিত করুন (এই নামে কোনও প্রবেশ নেই)।


অ্যাপ্লিকেশনটির নামটি একটি বাহ্যিক ফাইলের ফর্মটি পড়তে হবে তা নিখুঁত
জো মাহের

এইভাবে নির্মাণের সময় একটি ত্রুটি পেয়েছি। কার্য ': অ্যাপ্লিকেশন: মার্জডিবগআরসোর্সেস' এর জন্য কার্যকর করা ব্যর্থ হয়েছে .. সদৃশ সংস্থানসমূহ: রেস / মান / স্ট্রিং.এক্সএমএল: স্ট্রিং / অ্যাপ্লিকেশন
ব্যবহারকারী 2010496

5
যদি আপনি পান: এইভাবে বিল্ড করার সময় একটি ত্রুটি পেয়েছেন। কার্য ': অ্যাপ্লিকেশন: মার্জডিব্রুআর্সোর্সেস' এর জন্য এক্সিকিউশন ব্যর্থ হয়েছে .. ডুপ্লিকেট রিসোর্স: রাইস / মান / স্ট্রিংস। এক্সএমএল: স্ট্রিং / অ্যাপ_নাম, যেমন এটি করা উচিত: "আপনি মান / ফোল্ডার থেকে অ্যাপ_নাম সরিয়ে নিচ্ছেন তা নিশ্চিত করুন (এই নাম দ্বারা কোনও প্রবেশ নয়) )। "
ivan.panasiuk

আমি এটি পছন্দ করি কারণ স্ট্রিংস ফোল্ডার সমাধান (উপরে গৃহীত সমাধান) কেবলমাত্র তখনই কাজ করে যদি অ্যাপ্লিকেশনটির নাম নির্দিষ্ট উত্স সেট / পণ্যের স্বাদের জন্য নির্ধারিত হয়। আমার ক্ষেত্রে, আমি আলাদা আলাদা আলাদা নাম দিয়ে স্বয়ংক্রিয়ভাবে আমাদের অ্যাপের বিভিন্ন সংস্করণ তৈরি করতে একটি জেনকিনস পাইপলাইন কাজ সেট আপ করছি, এবং এই সমস্ত নামগুলিতে তাদের জন্য প্রোডাক্টফ্লেভারগুলি সংজ্ঞায়িত করা হয়নি। সুতরাং জেনকিনস সহজেই পরিবেশের মাধ্যমে অ্যাপটির নাম সরবরাহ করে এবং গ্রেডেল এটি পড়ে:resValue "string", "app_name", System.getenv("APP_NAME") ?: "MyApp"
অ্যাফেক্স

যদি আমি স্ট্রিং ফোল্ডার থেকে অ্যাপ_নাম সরিয়ে ফেলেছি তবে ত্রুটি হওয়ার সময় ত্রুটি পেয়ে ত্রুটি পাওয়া যাচ্ছে - ত্রুটি: টাস্কের জন্য এক্সিকিউশন ব্যর্থ হয়েছে ': অ্যাপ: প্রসেসডাডিবেগমেনিস্ট'। > একাধিক ত্রুটি সহ ম্যানিফেস্ট সংযুক্তি ব্যর্থ হয়েছে, লগগুলি দেখুন
aj0822ArpitJoshi

55

আপনি গ্রেড দিয়ে এটি করতে পারেন:

android {
    buildTypes {
        release {
            manifestPlaceholders = [appName: "My Standard App Name"]
        }
        debug {
            manifestPlaceholders = [appName: "Debug"]
        }
    }
}

তারপরে আপনার AndroidManifest.xmlকথায়:

<application
    android:label="${appName}"/>
    <activity
        android:label="${appName}">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

দ্রষ্টব্য: এটি সাথে কাজ করে productFlavors


ত্রুটি পেয়েছে - ত্রুটি: কার্যের জন্য কার্যকর করা ব্যর্থ হয়েছে ': অ্যাপ্লিকেশন: প্রক্রিয়াদেবব্যাগমেনিস্ট'। > ম্যানিফেস্ট একত্রীকরণ একাধিক ত্রুটি সহ ব্যর্থ হয়েছে, লগগুলি দেখুন
aj0822ArpitJoshi

কাজ করছে না --- বিল্ডটাইপস {রিলিজ {মিনিফাইএবলড ভুয়া প্রগুয়ার্ড ফাইলস ফাইলে ডিফল্টপ্রোগার্ড ফাইল ('প্রগুয়ার্ড-অ্যান্ড্রয়েড.টেক্সট'), 'প্রগুয়ার্ড-আরলস.প্রো'} ডিবাগ {ম্যানিফেস্টপ্লেসোল্ডার = [অ্যাপনাম: "গ্রিডল ডিবাগ"] অ্যাপ্লিকেশন আইডিসফিক্স dev "
JSONParser

44

অনুবাদগুলি সমর্থন করার জন্য এটি করুন:

1. স্ট্রিং "অ্যাপ_নাম" সরান

2. গ্রেড যোগ করুন

 buildTypes {
    admin {
       resValue "string", "app_name", "@string/app_name_admin"
    }
    release {
        resValue "string", "app_name", "@string/app_name_release"
    }
    debug {
        resValue "string", "app_name", "@string/app_name_debug"
    }
}

৩. "@ স্ট্রিং / অ্যাপ_নাম" হিসাবে ম্যানিফেস্টে অ্যাপের নাম সেট করুন

4. স্ট্রিং.এক্সএমএল মানগুলিতে যুক্ত করুন

<string name="app_name_admin">App Admin</string>
<string name="app_name_release">App  release</string>
<string name="app_name_debug">App debug</string>

বিভিন্ন ধরণের বিল্ড প্রকারগুলি কী কী? অ্যাডমিন, রিলিজ এবং ডিবাগ ছাড়া কি?
দিনেশ

@ দিনেশভিজি আপনি নিজের দ্বারা পার্থক্য নির্ধারণ করতে পারেন, উদাহরণস্বরূপ বিভিন্ন অ্যাপ্লিকেশনআইডি
নিকউনুশেখ

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

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত, আমার জন্য দুর্দান্ত কাজ করেছে
ওলেগ ড্যাটার

আমি সত্যিই এই পদ্ধতির মত, কারণ এটি আপনি এমনকি একটি কাস্টম যোগ করতে পারবেন app_nameমধ্যে productFlavors বিভাগে build.gradleফাইল। আপনার যখন প্রয়োজন এটি একটি অত্যন্ত সুবিধাজনক এবং নমনীয় পদ্ধতির।
ইগেল

15

অ্যাপ্লিকেশনটির নামটি ব্যবহারকারী-দ্বারা দৃশ্যমান এবং সেজন্য গুগল আপনাকে আপনার স্ট্রিং.এক্সএমএল ফাইলটিতে রাখতে উত্সাহ দেয়। আপনি একটি পৃথক স্ট্রিং রিসোর্স ফাইল সংজ্ঞা দিতে পারেন যাতে আপনার বিল্ডটাইপগুলির সাথে সুনির্দিষ্ট স্ট্রিং রয়েছে। দেখে মনে হচ্ছে আপনার কাস্টম qaবিল্ডটাইপ থাকতে পারে । যদি এটি সত্য না হয় তবে নীচের qa অংশটি উপেক্ষা করুন।

└── src
    ├── debug
       └── res
           └── buildtype_strings.xml
    ├── release
       └── res
           └── buildtype_strings.xml
    └── qa
        └── res
            └── buildtype_strings.xml

1
এটি কি কখনও আপনার জন্য কাজ করে? আমি আমার উদাহরণ নথিভুক্ত, এবং এটি কাজ ... না stackoverflow.com/questions/26032950/...
volkersfreunde

এগুলি স্বাদগুলি বিল্ড প্রকার নয়
জর্জিয়ান বেনেটাতোস 7'16

13

স্থানীয়করণের সাথে অ্যাপ্লিকেশন নামের সমর্থন করার জন্য আমাদের একটি সমাধান প্রয়োজন (বহু ভাষার জন্য)। আমি @ নিক আনুশেখ দ্রবণ দিয়ে পরীক্ষা করেছি, তবে বিল্ডিং ব্যর্থ হয়েছে (@ স্ট্রিং / পাওয়া যায় নি)। এই ত্রুটিটি ঠিক করতে সামান্য পরিবর্তন: বিল্ড.gradle ফাইল:

android {
    ext{
        APP_NAME = "@string/app_name_default"
        APP_NAME_DEV = "@string/app_name_dev"
    }

    productFlavors{

        prod{
            manifestPlaceholders = [ applicationLabel: APP_NAME]
        }

        dev{
            manifestPlaceholders = [ applicationLabel: APP_NAME_DEV ]
        }

    }

মান \ strings.xml:

<resources>
    <string name="app_name_default">AAA prod</string>
    <string name="app_name_dev">AAA dev</string>

</resources>

মান- en \ strings.xml:

<resources>
    <string name="app_name_default">AAA prod en</string>
    <string name="app_name_dev">AAA dev en</string>

</resources>

Manifest.xml:

<application
    android:label="${applicationLabel}" >
</application>

উদাহরণস্বরূপ "স্পিড ফর স্পিড" এর মতো একটি খেলাকে কখনই জার্মানিতে "বেডারফিনিস নাচ গেস্চবিন্দিগিট" বলা হবে না। সন্দেহজনক বিকাশকারীদের কাছ থেকে এটি কোনও ছাঁটাই না হলে ...
অবিশ্বাস্য জানুয়ারী

এটা কাজ করে। তোমাকে অনেক ধন্যবাদ. যাইহোক, আমার ক্ষেত্রে, আমি আরো 1 টি যোগ করতে হবে tools:replace="android:label"applicationমধ্যেAndroidManifest
ফান ভ্যান Linh

5

আরও গতিশীল গ্রেড ভিত্তিক সমাধানের জন্য (উদাহরণস্বরূপ একবারে বেসের প্রয়োগের নামটি সেট করুন strings.xml, এবং প্রতিটি স্বাদে / বিল্ড টাইপের সংমিশ্রণে নিজেকে পুনরাবৃত্তি করা এড়াতে strings.xml), আমার উত্তরটি এখানে দেখুন: https://stackoverflow.com/a/32220436/1128600


2

আপনি strings.xmlবিভিন্ন ফোল্ডারে ব্যবহার করতে পারেন , রিলিজ এবং ডিবাগ বিল্ডগুলির জন্য অ্যান্ড্রয়েডের পৃথক স্ট্রিং মানগুলি দেখতে পারেন ।

সুতরাং, এই ফাইলটি তৈরি করুন:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">Your app name</string>
</resources>

তারপরে এটি app\src\debug\res\values\এবং app\src\release\res\values\ফোল্ডারগুলিতে পেস্ট করুন । ডিবাগ এবং ফাইলগুলি মুক্তিতে "আপনার অ্যাপের নাম" প্রতিস্থাপন করুন। সরান app_nameথেকে আইটেম strings.xmlমধ্যে app\src\main\res\values\ফোল্ডার।

ইন AndroidManifestআপনি একই থাকবে

<application
    android:label="@string/app_name"
    ...

কোনও পরিবর্তন নেই এমনকি যদি আপনি এটি AndroidManifestফাইল এবং সহ একটি লাইব্রেরি যুক্ত করেন strings.xml


1

লেখক যেমন গ্রেডলে এটি করতে বলেছে , আমরা ধরে নিতে পারি যে তিনি এটি স্ক্রিপ্টে করতে চান, কনফিগারেশন ফাইলগুলিতে নয়। যেহেতু অ্যান্ড্রয়েড স্টুডিও এবং গ্রেডল উভয়ই গত বছরের (~ 2018) উপরের সমস্ত উত্তরগুলি ভারীভাবে আপডেট হয়েছে এবং সংশোধিত হয়েছে, তাই অতিরিক্ত সংকোচিত মনে হয়। সহজ-সহজ উপায় হ'ল নিম্নলিখিতটি আপনার সাথে যুক্ত করা app/build.gradle:

android {
    ...
    buildTypes {
        ...
        // Rename/Set default APK name prefix (app*.apk --> AwesomeApp*.apk)
        android.applicationVariants.all { variant ->
            variant.outputs.all { output ->
                def appName = "AwesomeApp"
                outputFileName = appName+"-${output.baseName}-${variant.versionName}.apk"
        }
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.