Apakah mungkin untuk mengakses nilai BuildConfig dari AndroidManifest.xml?
Dalam file build.gradle saya, saya memiliki:
defaultConfig {
applicationId "com.compagny.product"
minSdkVersion 16
targetSdkVersion 21
versionCode 1
versionName "1.0"
// Facebook app id
buildConfigField "long", "FACEBOOK_APP_ID", FACEBOOK_APP_ID
}
FACEBOOK_APP_ID
didefinisikan dalam file gradle.properties saya:
# Facebook identifier (app ID)
FACEBOOK_APP_ID=XXXXXXXXXX
Untuk menggunakan Facebook Connect di aplikasi saya, saya harus menambahkan baris ini ke AndroidManifest.xml saya:
<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/applicationId"/>
Saya ingin mengganti @string/applicationId
dengan bidang BuildConfig yang FACEBOOK_APP_ID
ditentukan dalam gradle, seperti ini:
<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="FACEBOOK_APP_ID"/>
Apakah itu mungkin menggunakan BuildConfig? Jika tidak, bagaimana saya bisa mencapai ini?
<item name="facebook_app_id" type="string">15233522...</item>
Cara lain untuk mengakses nilai Gradle Build Config dari AndroidManifest.xml Anda adalah melalui placeholder seperti ini:
android { defaultConfig { manifestPlaceholders = [ facebookAppId:"someId..."] } productFlavors { flavor1 { } flavor2 { manifestPlaceholders = [ facebookAppId:"anotherId..." ] } } }
dan kemudian di manifes Anda:
<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="${facebookAppId}"/>
Lihat detail lebih lanjut di sini: https://developer.android.com/studio/build/manifest-build-variables.html
(Tautan lama hanya untuk referensi: http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger )
sumber
catatan: ketika Anda menggunakan
resValue
nilai dapat secara tidak sengaja diganti oleh file sumber daya string (misalnya untuk bahasa lain)Untuk mendapatkan nilai konstanta sebenarnya yang dapat Anda gunakan dalam manifes dan dalam kode java, gunakan keduanya
manifestPlaceholders
danbuildConfigField
: misalnyaandroid { defaultConfig { def addConstant = {constantName, constantValue -> manifestPlaceholders += [ (constantName):constantValue] buildConfigField "String", "${constantName}", "\"${constantValue}\"" } addConstant("FACEBOOK_APP_ID", "xxxxx") }
akses di file manifes:
<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="${FACEBOOK_APP_ID}"/>
dari java:
BuildConfig.FACEBOOK_APP_ID
Jika nilai konstanta perlu berupa buildType-specific, helper
addConstant
perlu disesuaikan (untuk bekerja dengan semantik closure yang groovy), misalnya,buildTypes { def addConstantTo = {target, constantName, constantValue -> target.manifestPlaceholders += [ (constantName):constantValue] target.buildConfigField "String", "${constantName}", "\"${constantValue}\"" } debug { addConstantTo(owner,"FACEBOOK_APP_ID", "xxxxx-debug") } release { addConstantTo(owner,"FACEBOOK_APP_ID", "xxxxx-release") }
sumber
addConstant()
dua kali (dengan berbedaconstantNames
tentu saja). Kesalahan apa yang Anda dapatkan?+=
operator seperti inimanifestPlaceholders += [...]
Akses properti build.gradle di manifes Anda seperti dalam contoh berikut:
Misalnya Anda memiliki properti "applicationId" di build.gradle dan Anda ingin mengaksesnya di AndroidManifest:
Akses "applicationId" di AndroidManifest:
<receiver android:name="com.google.android.gms.gcm.GcmReceiver" android:exported="true" android:permission="com.google.android.c2dm.permission.SEND"> <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <category android:name="${applicationId}" /> </intent-filter> </receiver>
Demikian pula, kita dapat membuat sumber daya string untuk konstanta lain dan mengaksesnya dalam file kode sesederhana:
context.getString(R.string.GCM_SENDER_ID);
sumber
@stkent bagus tapi lupa menambahkan bahwa Anda perlu membangun kembali proyek Anda setelahnya
Menggantikan
buildConfigField "long", "FACEBOOK_APP_ID", FACEBOOK_APP_ID
dengan
resValue "string", "FACEBOOK_APP_ID", FACEBOOK_APP_ID
kemudian
Ini akan memungkinkan android menghasilkan sumber daya string yang dapat diakses melalui
R.string.FACEBOOK_APP_ID
sumber
Opsi lain: gunakan file sumber daya string yang berbeda untuk mengganti semua nilai yang bergantung pada Flavor:
Langkah 1: Buat folder baru di folder "src" dengan nama flavor Anda, im my case "stage"
Langkah 2: Buat file sumber daya untuk semua file yang bergantung pada ragamnya, misalnya:
Langkah 3: Saya juga menggunakan ikon yang berbeda, jadi Anda juga melihat folder mipmap. Untuk quetion ini, hanya "strings.xml" yang penting. Sekarang Anda dapat menimpa semua sumber daya string yang penting. Anda hanya perlu menyertakan yang ingin Anda timpa, yang lainnya akan digunakan dari "strings.xml" utama, ini akan muncul di Android Studio seperti ini:
Langkah 4: Gunakan sumber daya string dalam proyek Anda dan santai:
sumber
Anda dapat menggunakan nilai panjang seperti di bawah ini
buildConfigField 'long', 'FLAVOR_LONG', '11500L'
sumber