Saya memiliki 2 build flavours, katakanlah, flavor1 dan flavor2 .
Saya ingin aplikasi saya diberi nama, misalnya, " AppFlavor1 " saat saya membuat untuk flavor1 dan " AppFlavor2 " saat saya membuat untuk flavor 2.
Bukan judul kegiatan yang ingin saya ubah. Saya ingin mengubah nama aplikasi seperti yang ditampilkan di menu ponsel dan di tempat lain.
Dari build.gradle
saya dapat mengatur berbagai parameter untuk rasa saya tetapi, tampaknya, bukan label aplikasi. Dan saya juga tidak dapat mengubah label aplikasi secara terprogram berdasarkan beberapa variabel.
Lantas, bagaimana orang menangani ini?
sourceSets
blok? Apakah di bawahandroid{...}
blok?android
memang di dalam blok.Hapus
app_name
daristrings.xml
(jika tidak, gradle akan mengeluhkan sumber daya duplikat). Kemudian ubah file build seperti ini:productFlavors { flavor1{ resValue "string", "app_name", "AppNameFlavor1" } flavor2{ resValue "string", "app_name", "AppNameFlavor2" } }
Juga pastikan
@string/app_name
nilai diberikan untukandroid:label
atribut di manifes.<application ... android:label="@string/app_name" ...
Ini tidak terlalu mengganggu daripada membuat yang baru di
strings.xml
bawah kumpulan bawaan yang berbeda atau menulis skrip khusus.sumber
@string/app_name
untukactivity
label peluncur ? Perlu diingat bahwalabel
dari peluncur utamaactivity
digunakan dalam preferensi untukapplication
label
untuk nama tampilan aplikasi.Jika Anda ingin mempertahankan pelokalan untuk nama aplikasi dalam ragam yang berbeda, Anda dapat mencapainya sebagai berikut:
1) Tentukan
android:label
di<application>
tersedia dalamAndroidManifest.xml
sebagai berikut:<application ... android:label="${appLabel}" ... >
2) Tentukan nilai default untuk
appLabel
di tingkat aplikasibuild.gradle
:manifestPlaceholders = [appLabel:"@string/defaultName"]
3) Ganti nilai ragam produk sebagai berikut:
productFlavors { AppFlavor1 { manifestPlaceholders = [appLabel:"@string/flavor1"] } AppFlavor2 { manifestPlaceholders = [appLabel:"@string/flavor2"] } }
4) Tambahkan sumber daya string untuk setiap Strings (defaultName, flavor1, flavor2) di file
strings.xml
. Ini akan memungkinkan Anda untuk melokalkannya.sumber
Anda bisa menambahkan file sumber daya string ke setiap ragam, lalu menggunakan file sumber daya tersebut untuk mengubah nama aplikasi Anda. Misalnya di salah satu aplikasi saya, saya memiliki versi gratis dan berbayar. Untuk mengganti namanya menjadi "Lite" dan "Pro", saya membuat
meta_data.xml
file, dan menambahkanapp_name
nilai saya ke XML itu dan menghapusnya daristrings.xml
. Selanjutnya, dalamapp/src
buat folder untuk setiap ragam (lihat di bawah untuk contoh struktur). Di dalam direktori ini, tambahkanres/values/<string resource file name>
. Sekarang, saat Anda membangun, file ini akan disalin ke dalam build Anda dan aplikasi Anda akan diganti namanya.Struktur file:
app/src /pro/res/values/meta_data.xml /lite/res/values/meta_data.xml
sumber
Opsi lain yang sebenarnya saya gunakan adalah mengubah manifes untuk setiap aplikasi. Daripada menyalin folder resource, Anda bisa membuat manifes untuk setiap ragam.
sourceSets { main { } release { manifest.srcFile 'src/release/AndroidManifest.xml' } debug { manifest.srcFile 'src/debug/AndroidManifest.xml' } }
Anda harus memiliki AndroidManifest utama di utama src Anda yang akan menjadi prinsipal. Kemudian Anda bisa menentukan manifes hanya dengan beberapa opsi untuk setiap ragam seperti (src / release / AndroidManifest.xml):
<manifest package="com.application.yourapp"> <application android:icon="@drawable/ic_launcher"> </application> </manifest>
Untuk debug, AndroidManifest (src / debug / AndroidManifest.xml):
<manifest package="com.application.yourapp"> <application android:icon="@drawable/ic_launcher2"> </application> </manifest>
Compiler akan menggabungkan manifes dan Anda dapat memiliki ikon untuk setiap ragam.
sumber
Ini dapat dengan mudah diselesaikan di bawah buildTypes
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 } }
Pastikan untuk menghapus app_name dari strings.xml
sumber
Pertama-tama, jawab pertanyaan ini: "Dapatkah pengguna menginstal kedua jenis aplikasi Anda pada perangkat yang sama?"
Saya menggunakan skrip Python yang menambal sumber. Ini berisi beberapa fungsi yang dapat digunakan kembali dan, tentu saja, pengetahuan apa yang perlu ditambal dalam proyek khusus ini. Jadi skripnya khusus aplikasi.
Ada banyak patching, data untuk patching disimpan dalam kamus Python (termasuk nama paket aplikasi, BTW berbeda dari nama paket Java), satu kamus per flavor.
Untuk l10n, string mungkin mengarah ke string lain, misalnya dalam kode saya, saya memiliki:
<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>
sumber
<application android:icon="@drawable/ic_launcher" android:label="@string/app_name" >
. Setelah Anda membersihkan dan membuat ulang semuanya (dua kali, sekali per rasa), Anda akan mendapatkan dua apk dengan nama paket Android yang berbeda dan label peluncur yang berbeda. BTW, Eclipse sering tidak mendeteksi perubahan sumber daya, jadi Anda harus memintanya untuk membersihkan.Bagaimana cara membuat string / app_name berbeda untuk setiap rasa?
Saya ingin menulis pembaruan, tetapi menyadari bahwa itu lebih besar dari jawaban asli yang mengatakan bahwa saya menggunakan skrip Python yang menambal sumbernya.
Skrip Python memiliki parameter, nama direktori. Direktori itu berisi aset per ragam, sumber daya seperti ikon peluncur, dan file properties.txt dengan kamus Python.
{ 'someBoolean' : True , 'someParam' : 'none' , 'appTitle' : '@string/x_app_name_xyz' }
Skrip Python memuat kamus dari file itu dan mengganti nilai antara
<string name="app_name">
dan</string>
dengan nilaiproperties['appTitle']
.Kode di bawah ini disediakan atas dasar apa adanya / apa adanya, dll.
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_/@\- ]+")
untuk membaca properti dari satu atau lebih file seperti itu:
with open(filename1) as f: properties = eval(f.read()) with open(filename2) as f: properties.update(eval(f.read()))
dan fungsi fileReplace adalah:
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+"'")
Baris pertama dari skrip tersebut adalah:
#!/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
sumber
Di file AndroidManifest, di tag aplikasi Anda memiliki baris ini:
android:label
Dan di sana Anda dapat mengatakan bagaimana label aplikasi akan muncul di menu aplikasi pada perangkat
sumber