বিভিন্ন বিল্ড স্বাদের জন্য আলাদা অ্যাপের নাম?


94

আমার কাছে 2 বিল্ড ফ্লেভার রয়েছে, বলুন, ফ্লেভার 1 এবং ফ্লেভার 2 রয়েছে

আমি চাই আমার আবেদন, নাম প্রকাশে অনিচ্ছুক বলুন, " AppFlavor1 " যখন আমি flavor1 এবং "জন্য গড়ে তুলতে AppFlavor2 " যখন আমি গন্ধ 2 জন্য নির্মাণ।

আমি যে ক্রিয়াকলাপগুলি পরিবর্তন করতে চাই তা এটি শিরোনাম নয়। আমি অ্যাপের নামটি ফোনের মেনুতে এবং অন্য কোথাও প্রদর্শিত হওয়ায় এটি পরিবর্তন করতে চাই।

থেকে build.gradleআমি আমার স্বাদগুলির জন্য বিভিন্ন পরামিতি সেট করতে পারি তবে এটি অ্যাপ্লিকেশন লেবেল নয় not এবং আমি অ্যাপ্লিকেশন লেবেলটিকেও কিছু পরিবর্তনশীলের উপর ভিত্তি করে প্রোগ্রামগতভাবে পরিবর্তন করতে পারি না।

সুতরাং, লোকেরা কীভাবে এটি পরিচালনা করে?

উত্তর:


24

স্ক্রিপ্টের সাহায্যে আপনার মূল স্ট্রিং.এক্সএমএল পরিবর্তনের পরিবর্তে এবং আপনার উত্স নিয়ন্ত্রণকে জড়িত করার ঝুঁকি নিয়ে, অ্যান্ড্রয়েড গ্রেডল বিল্ডের স্ট্যান্ডার্ড মার্জিং আচরণের উপর নির্ভর করবেন না কেন?

আমার build.gradleরয়েছে

sourceSets {
    main {
        manifest.srcFile 'AndroidManifest.xml'
        java.srcDirs = ['src']
        resources.srcDirs = ['src']
        aidl.srcDirs = ['src']
        renderscript.srcDirs = ['src']
        res.srcDirs = ['res']
        assets.srcDirs = ['assets']
    }

    release {
        res.srcDir 'variants/release/res'
    }

    debug {
        res.srcDir 'variants/debug/res'
    }
}

সুতরাং এখন আমি আমার app_nameস্ট্রিং সংজ্ঞায়িত করতে পারি variants/[release|debug]/res/strings.xml। এবং আমি অন্য কিছু পরিবর্তন করতে চাই!


সম্পাদিত: সম্পূর্ণরূপে নতুন করে সংজ্ঞায়িত করার পরিবর্তে অ্যারেতে যুক্ত করতে res.srcDir ব্যবহার করুন।
পিয়েরে-লাক পাওর

হ্যাঁ, আমি এটি এতক্ষণে খুঁজে পেয়েছি। অনেক অনেক ধন্যবাদ
আলেকজান্ডার কুলিয়াখতিন

4
কোথায় sourceSetsব্লক যুক্ত করা উচিত ? এটি কি android{...}ব্লকের অধীনে ?
আবেল কালেজো

নিবন্ধটি androidঅবরুদ্ধ করা আবশ্যক।
পিয়েরে-লুক পাওর

262

app_nameথেকে সরান strings.xml(অন্য গ্রেডগুলি সদৃশ সংস্থার অভিযোগ করবে)। তারপরে বিল্ড ফাইলটি এটির মতো পরিবর্তন করুন:

productFlavors {
    flavor1{
        resValue "string", "app_name", "AppNameFlavor1"
    }

    flavor2{
        resValue "string", "app_name", "AppNameFlavor2"
    }
   } 

এছাড়াও ম্যানিফেস্টে @string/app_nameগুণকের জন্য মান নির্ধারিত হয়েছে তা নিশ্চিত করুন android:label

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

strings.xmlবিভিন্ন নির্মিত সেটগুলির অধীনে নতুন তৈরি করা বা কাস্টম স্ক্রিপ্টগুলি লেখার চেয়ে এটি কম বিঘ্নিত ।


9
এটি একটি কবজির মতো কাজ করে তবে প্রশ্ন: স্ট্রিং রিসোর্সটি যুক্ত করার সময় আমরা অন্যান্য লোকেলের জন্য কীভাবে স্থানীয় স্ট্রিং যুক্ত করব?
অ্যান্ড্রয়েডমেচনিক - ভাইরাল প্যাটেল

এখানে এর জন্য একটি প্রশ্ন পোস্ট করেছেন: stackoverflow.com/questions/36105494/… আপনি কি দয়া করে একবার দেখে কিছু মনে করেন?
অ্যান্ড্রয়েডমেচনিক - ভাইরাল প্যাটেল

4
একাধিক স্বাদ মাত্রা ব্যবহার সম্পর্কে কী? প্রতিটি স্বাদ / গন্ধ সংমিশ্রণের জন্য আমি কীভাবে এটির নামকরণ করতে পারি?
জোকট

4
সবকিছু ঠিক আছে, তবে গ্রেডের পণ্যের স্বাদ অনুসারে লঞ্চার আইকনটির নীচে প্রদর্শিত অ্যাপের নাম পরিবর্তন হচ্ছে না। আমি স্ট্রিংস.এক্সএমএল থেকে "অ্যাপ_নাম" মুছে ফেলেছি এবং পণ্যের স্বাদে সেট করেছি। যদি আমি অ্যান্ড্রয়েডের অ্যাপ তথ্য পৃষ্ঠা থেকে অ্যাপের নাম দেখতে পাই, পণ্যের স্বাদ অনুসারে সেট করা অ্যাপ্লিকেশন নাম দেখায়, তবে লঞ্চ আইকনের অধীনে আমার পূর্ববর্তী অ্যাপ্লিকেশনটির নাম দেখাচ্ছে।
iamcrypticcoder

4
@ মাহবুব.কুয়েট আপনি কি @string/app_nameআপনার লঞ্চের activityলেবেলের জন্য ব্যবহার করছেন ? মনে রাখবেন যে অ্যাপ্লিকেশন নামের নামের জন্য labelপ্রধান লঞ্চারটি থেকে আগতটি activityব্যবহার করা হয় application label
ব্যবহারকারী 650881

13

আপনি যদি বিভিন্ন স্বাদে অ্যাপের নামের জন্য স্থানীয়করণ বজায় রাখতে চান তবে আপনি এটি নিম্নলিখিত হিসাবে অর্জন করতে পারেন:

1) উল্লেখ করুন android:labelমধ্যে <application>পাওয়া AndroidManifest.xmlনিম্নরূপ:

<application
    ...
    android:label="${appLabel}"
    ...
>

2) appLabelঅ্যাপ স্তরে ডিফল্ট মান উল্লেখ করুন build.gradle:

manifestPlaceholders = [appLabel:"@string/defaultName"]

3) পণ্যের স্বাদের জন্য মূল্যটিকে ওভাররাইড করুন:

productFlavors {
    AppFlavor1 {
        manifestPlaceholders = [appLabel:"@string/flavor1"]
    }
    AppFlavor2 {
        manifestPlaceholders = [appLabel:"@string/flavor2"]
    }

}

4) আপনার প্রতিটি স্ট্রিংয়ের জন্য স্ট্রিং রিসোর্স যুক্ত করুন (ডিফল্ট নাম, flavore1, flavore2) আপনার strings.xml। এটি আপনাকে সেগুলির স্থানীয়করণের অনুমতি দেবে।


পদক্ষেপ # 2 অবশ্যই 'অ্যান্ড্রয়েড' স্তরে বিল্ড.gradle এর 'ডিফল্টকনফিগ' স্তরে থাকতে হবে, অন্যথায় আপনি ম্যানিফেস্টপ্লেসোল্ডারদের নামের সাথে সম্পর্কিত একটি অজানা সম্পত্তি ত্রুটি পাবেন।
ব্রেন্ডন ওয়াটলি

8

আপনি প্রতিটি স্বাদে একটি স্ট্রিং রিসোর্স ফাইল যুক্ত করতে পারেন, তারপরে আপনার অ্যাপ্লিকেশনটির নাম পরিবর্তন করতে সেই সংস্থানগুলি ব্যবহার করুন। উদাহরণস্বরূপ আমার অ্যাপ্লিকেশনগুলির মধ্যে একটিতে আমার কাছে একটি নিখরচায় এবং অর্থ প্রদানের সংস্করণ রয়েছে। তাদের "লাইট" এবং "প্রো" নামকরণ করতে, আমি একটি meta_data.xmlফাইল তৈরি করেছিলাম এবং app_nameসেই এক্সএমএলে আমার মান যুক্ত করে এটিকে সরিয়ে দিয়েছি strings.xml। এর পরে, app/srcপ্রতিটি স্বাদের জন্য একটি ফোল্ডার তৈরি করুন (উদাহরণস্বরূপ কাঠামোর জন্য নীচে দেখুন)। এই ডিরেক্টরিগুলির ভিতরে, অ্যাড করুন res/values/<string resource file name>। এখন, আপনি তৈরি করার সময়, এই ফাইলটি আপনার বিল্ডে অনুলিপি করা হবে এবং আপনার অ্যাপ্লিকেশনটির নাম পরিবর্তন করা হবে।

ফাইল গঠন:

app/src
   /pro/res/values/meta_data.xml
   /lite/res/values/meta_data.xml

4
গ্রেড ফাইল ঘোষণার চেয়ে এটি আরও ভাল। একটি যাদুমন্ত্র মত কাজ করে. ধন্যবাদ.
ফিলিপ লুচিয়েনকো

7

আরেকটি বিকল্প যা আমি আসলে ব্যবহার করি তা হ'ল প্রতিটি অ্যাপ্লিকেশনের ম্যানিফেস্টে পরিবর্তন। রিসোর্স ফোল্ডারটি অনুলিপি না করে আপনি প্রতিটি স্বাদে একটি ম্যানিফেস্ট তৈরি করতে পারেন।

sourceSets {
  main {
 }

  release {
    manifest.srcFile 'src/release/AndroidManifest.xml'
 }

  debug {
    manifest.srcFile 'src/debug/AndroidManifest.xml'
 }
}

আপনার সিআরসি মেইনে আপনার একটি অধ্যক্ষ অ্যান্ড্রয়েড ম্যানিফেস্ট থাকতে হবে যা অধ্যক্ষ হবে। তারপরে আপনি প্রতিটি স্বাদের মতো (সিসিআর / রিলিজ / অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএল) কেবলমাত্র কিছু বিকল্প সহ ম্যানিফেস্টকে সংজ্ঞায়িত করতে পারেন:

<manifest package="com.application.yourapp">
  <application android:icon="@drawable/ic_launcher">
  </application>
</manifest>

ডিবাগের জন্য, অ্যান্ড্রয়েড ম্যানিফেস্ট (src / ডিবাগ / অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএল):

<manifest package="com.application.yourapp">
  <application android:icon="@drawable/ic_launcher2">
  </application>
</manifest>

সংকলক ম্যানিফেস্টের একত্রিত করবে এবং প্রতিটি স্বাদে আপনার আইকন থাকতে পারে।


4

বিল্ডটাইপগুলির আওতায় এটি সহজেই সম্পন্ন করা যায়

buildTypes {
    debug {
        buildConfigField("String", "server_type", "\"TEST\"")
        resValue "string", "app_name", "Eventful-Test"
        debuggable true
        signingConfig signingConfigs.debug_key_sign
    }

    stage {
        buildConfigField("String", "server_type", "\"STAGE\"")
        resValue "string", "app_name", "Eventful-Stage"
        debuggable true
        signingConfig signingConfigs.debug_key_sign
    }

    release {
        buildConfigField("String", "server_type", "\"PROD\"")
        resValue "string", "app_name", "Eventful"
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        //TODO - add release signing
    }
}

কেবল স্ট্রিংস.এক্সএমএল থেকে অ্যাপ_নাম সরাতে নিশ্চিত করুন


2

সবার আগে, এই প্রশ্নের উত্তর দিন: "ব্যবহারকারী কি আপনার অ্যাপ্লিকেশনটির উভয় স্বাদ একই ডিভাইসে ইনস্টল করতে পারবেন?"

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

প্রচুর প্যাচিং রয়েছে, প্যাচিংয়ের ডেটা পাইথন অভিধানে রাখা হয়েছে (অ্যাপ্লিকেশন প্যাকেজের নাম সহ, তারা বিটিডাব্লু জাভা প্যাকেজের নাম থেকে আলাদা), স্বাদে প্রতিটি অভিধান dictionary

L10n হিসাবে, স্ট্রিংগুলি অন্যান্য স্ট্রিংগুলিতে ইঙ্গিত করতে পারে, যেমন আমার কোডটিতে আমার রয়েছে:

<string name="app_name">@string/x_app_name_xyz</string>

<string name="x_app_name_default">My Application</string>
<string name="x_app_name_xyz">My App</string>

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

তারপরে আপনাকে অ্যাপ্লিকেশন প্যাকেজের নামটি পরিবর্তন করতে হবে, যেমন com.example.mysoft.pro বনাম com.example.mysoft.light , অন্যথায় ব্যবহারকারীরা তাদের মধ্যে কেবল একটি ডিভাইসে ইনস্টল করতে সক্ষম হবেন।
18446744073709551615

আমি এটি করেছি কিন্তু আমি কীভাবে ফোনের মেনুতে "আমার অ্যাপ" বনাম "আমার অ্যাপ প্রো" পাব? আমার এখন 2 টি অ্যাপস (হালকা এবং প্রো) রয়েছে তবে দুজনেরই একই নাম। এর জন্য আমার দুটি স্বতন্ত্র অ্যাপ্লিকেশনের নাম প্রয়োজন এবং এটি যেমন আপনি বলছেন, তত সহজ নয়?
আলেকজান্ডার কুলিয়াখতিন

অন্যান্য (নিম্নমানের) উত্তর হিসাবে উল্লিখিত হয়েছে, অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএলে রয়েছে <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" >। আপনি সমস্ত কিছু পরিষ্কার ও পুনঃনির্মাণের পরে (একবারে প্রতিটি গন্ধে একবারে) একবার আপনার দুটি অ্যান্ড্রয়েড প্যাকেজ নাম এবং বিভিন্ন লঞ্চার লেবেল সহ দুটি এপি-এস পাবেন। বিটিডাব্লু, Eclipse প্রায়শই সংস্থানগুলির পরিবর্তনগুলি সনাক্ত করে না, তাই আপনাকে এটি পরিষ্কার করতে বলতে হবে।
18446744073709551615

আমি স্বাদ অনুযায়ী স্ট্রিং / অ্যাপ_নাম কীভাবে আলাদা করব? আমি দুঃখিত আমি এখনও এটি পেতে পারি না।
আলেকজান্ডার কুলিয়াখতিন

0

আমি স্বাদ অনুযায়ী স্ট্রিং / অ্যাপ_নাম কীভাবে আলাদা করব?

আমি একটি আপডেট লিখতে চেয়েছিলাম, তবে বুঝতে পেরেছিলাম যে এটি মূল উত্তরের চেয়ে বড় যে আমি উত্সটিকে প্যাচানো একটি পাইথন স্ক্রিপ্ট ব্যবহার করি।

পাইথন স্ক্রিপ্টের একটি প্যারামিটার, একটি ডিরেক্টরি নাম রয়েছে। সেই ডিরেক্টরিতে প্রতি-স্বাদযুক্ত সম্পদ, লঞ্চার আইকনের মতো সংস্থানসমূহ এবং পাইথন অভিধান সহ ফাইল বৈশিষ্ট্য t টেক্সট রয়েছে।

{ 'someBoolean' : True
, 'someParam' : 'none'
, 'appTitle' : '@string/x_app_name_xyz'
}

পাইথন স্ক্রিপ্ট সেই ফাইলটি থেকে অভিধানটি লোড করে এবং এর মান <string name="app_name">এবং </string>এর মান দ্বারা প্রতিস্থাপন করে properties['appTitle']

নীচের কোডটি যেমন হিসাবে রয়েছে তেমন ভিত্তিতে প্রদান করা হয়েছে ইত্যাদি etc.

for strings_xml in glob.glob("res/values*/strings.xml"):
    fileReplace(strings_xml,'<string name="app_name">',properties['appTitle'],'</string>',oldtextpattern=r"[a-zA-Z0-9_/@\- ]+")

এই জাতীয় এক বা একাধিক ফাইল থেকে বৈশিষ্ট্যগুলি পড়তে:

with open(filename1) as f:
    properties = eval(f.read())
with open(filename2) as f:
    properties.update(eval(f.read()))

এবং ফাইলপ্লেস ফাংশনটি হ'ল:

really = True
#False for debugging

# In the file 'fname',
# find the text matching "before oldtext after" (all occurrences) and
# replace 'oldtext' with 'newtext' (all occurrences).
# If 'mandatory' is true, raise an exception if no replacements were made.
def fileReplace(fname,before,newtext,after,oldtextpattern=r"[\w.]+",mandatory=True):
    with open(fname, 'r+') as f:
        read_data = f.read()
        pattern = r"("+re.escape(before)+r")"+oldtextpattern+"("+re.escape(after)+r")"
        replacement = r"\g<1>"+newtext+r"\g<2>"
        new_data,replacements_made = re.subn(pattern,replacement,read_data,flags=re.MULTILINE)
        if replacements_made and really:
            f.seek(0)
            f.truncate()
            f.write(new_data)
            if verbose:
                print "patching ",fname," (",replacements_made," occurrence" + ("s" if 1!=replacements_made else ""),")",newtext,("-- no changes" if new_data==read_data else "-- ***CHANGED***")
        elif replacements_made:
            print fname,":"
            print new_data
        elif mandatory:
            raise Exception("cannot patch the file: "+fname+" with ["+newtext+"] instead of '"+before+"{"+oldtextpattern+"}"+after+"'")

স্ক্রিপ্টের প্রথম লাইনগুলি হ'ল:

#!/usr/bin/python
# coding: utf-8

import sys
import os
import re
import os.path
import shutil
import argparse
import string
import glob
from myutils import copytreeover

-4

অ্যান্ড্রয়েডমেনিস্ট ফাইলটিতে, অ্যাপ্লিকেশন ট্যাগে আপনার এই লাইন রয়েছে:

android:label

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


হ্যাঁ আমি প্রশ্নটি পড়েছি ... আপনি পৃথক অ্যান্ড্রয়েড সেট করতে 2 টি শাখা এবং প্রতিটি (একটি ফ্লেভার 1 এবং একটি স্বাদ 2 এর জন্য) সেট করতে পারেন: আপনার AndroidManLive ফাইলটিতে লেবেল।
হিটম্যান

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