前言
在項(xiàng)目中配置release和debug環(huán)境還是很有必要的玩讳,可以隨時(shí)打包線下和線上的版本并且在一部手機(jī)上同時(shí)開發(fā)線下app涩蜘,又可以體驗(yàn)觀察線上app的情況。
當(dāng)然熏纯,配置的主要思路都是一樣的同诫,但是具體細(xì)節(jié)可以有很多不同,文章只是按照思路實(shí)現(xiàn)樟澜,具體的細(xì)節(jié)有很多可以根據(jù)自己的喜好來配置误窖,都是可以的。
(1)在project項(xiàng)目結(jié)構(gòu)視圖中往扔,根目錄下創(chuàng)建一個(gè)config.gradle文件,用來配置一些項(xiàng)目公共的參數(shù)熊户,這樣其他部分直接引用就好萍膛,其實(shí)這部分完全可以在project的build.gradle里去配置或者project的gradle.properties等這些項(xiàng)目級(jí)別的都可以。
config.gradle文件內(nèi)容:
ext{
url = [
"debug":"https://......",
"release":"https://......"
]
}
這里我們只設(shè)置線上線下服務(wù)器接口地址的變化部分(一般為服務(wù)器地址)嚷堡,當(dāng)然可以設(shè)置很多公共的參數(shù)蝗罗,比如版本號(hào)艇棕,相關(guān)sdk版本號(hào),但是這里我們以實(shí)現(xiàn)配置release和debug兩種版本app為目標(biāo)串塑。
(2)在project的build.gradle引用config.build(所以說可以直接定義在project的build.gradle這里面)
apply from: "config.gradle"
這段代碼寫在最外層就ok沼琉,不影響文件的其他部分內(nèi)容。
(3)在工程moudle的build.gradle中正式配置
android {
compileSdkVersion 27
defaultConfig {
applicationId "com.dhasa.fun"
minSdkVersion 19
targetSdkVersion 27
versionCode 2
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
sourceSets.main {
jniLibs.srcDirs = ['libs']
}
}
signingConfigs {
release {
keyAlias RELEASE_KEY_ALIAS
keyPassword RELEASE_KEY_PASSWORD
storeFile file('C:/appsign/abc.jks')
storePassword RELEASE_KEYSTORE_PASSWORD
}
debug {
keyAlias DEBUG_KEY_ALIAS
keyPassword DEBUG_KEY_PASSWORD
storeFile file('C:/appsign/debugabc.jks')
storePassword DEBUG_KEYSTORE_PASSWORD
}
}
buildTypes {
release {
buildConfigField "String", "HostUrl", "\"${url["release"]}\""
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
android.applicationVariants.all { variant ->
variant.outputs.all {
outputFileName = "easymeetingmanager_v${defaultConfig.versionName}.apk"
}
}
manifestPlaceholders = [
//這里也是在AndroidManifest.xml中配置的app圖標(biāo)桩匪,同樣在這里寫了了不同的資源文件打瘪,從而實(shí)現(xiàn)了動(dòng)態(tài)配置
app_icon: "@mipmap/logo",
app_name: "@string/app_name_release"
]
}
debug {
applicationIdSuffix '.debug'
signingConfig signingConfigs.debug
buildConfigField "String", "HostUrl", "\"${url["debug"]}\""
manifestPlaceholders = [
//這里也是在AndroidManifest.xml中配置的app圖標(biāo),同樣在這里寫了了不同的資源文件傻昙,從而實(shí)現(xiàn)了動(dòng)態(tài)配置
app_icon: "@mipmap/logo_debug",
app_name: "@string/app_name_debug"
]
}
}
}
1闺骚、defaultConfig中是一些默認(rèn)的配置,無論是release還是debug都會(huì)執(zhí)行的部分妆档,其中包名applicationId還有版本號(hào)這些都可以配置到其他部分引入進(jìn)來僻爽。
2、signingConfigs翻譯過來簽名配置贾惦,分為release和debug兩部分胸梆,簽名需要使用不同的簽名,可以看到這部分很明顯是其他文件聲明好的须板,這里我寫在了gradle.properties文件中碰镜,這些值都是生成簽名文件時(shí)隨便定義的:
DEBUG_KEY_ALIAS=debuga
DEBUG_KEYSTORE_PASSWORD=debugmeet
DEBUG_KEY_PASSWORD=debugmeet
RELEASE_KEY_ALIAS=abcxy
RELEASE_KEYSTORE_PASSWORD=zwxy
RELEASE_KEY_PASSWORD=sss
3、buildTypes中同樣分成了release和debug兩部分逼纸,其中根據(jù)版本引用了不同的服務(wù)器地址洋措,不同的簽名,混淆配置文件杰刽,是否壓縮菠发,是否去除無用資源文件等等,其中:
- buildConfigField是會(huì)在BuildConfig文件(這個(gè)文件在app->build->generated->source->buildConfig->包名->BuildConfig)中生成一個(gè)對應(yīng)類型的變量贺嫂,并且將設(shè)置好的值付給它(我們還經(jīng)常通過里面的布爾值DEBUG來判斷是否輸出日志)滓鸠,因?yàn)槭窃诰幾g期完成,java代碼中就可以這樣來引用:
public static final String COMMON_URL = BuildConfig.HostUrl;
當(dāng)然這也是在公共文件中聲明的第喳,可以在任何代碼處使用糜俗。
- manifestPlaceholders,這個(gè)里面根據(jù)名字可以看到是可以和Manifest文件關(guān)聯(lián)起來的曲饱,上面代碼我們設(shè)置了不同版本app的圖標(biāo)悠抹,AndroidManifest中其他的需要?jiǎng)討B(tài)配置變量也可以通過對manifestPlaceholders數(shù)組配置相應(yīng)的鍵值對來實(shí)現(xiàn),但是這篇忽略這個(gè)不講了扩淀⌒ǖ校看一下在Manifest文件中的使用情況(這樣一來開發(fā)版本和線上版本從圖標(biāo)和名字上都可以區(qū)分了,這主要是幫助使用者清楚的區(qū)分):
<application
android:allowBackup="true"
android:icon="${app_icon}"
android:label="${app_name}"
android:supportsRtl="true"
android:theme="@style/AppTheme">
......
</application>
- applicationIdSuffix '.debug'驻谆,注意buildTypes下debug中的這行代碼卵凑,可以看出是在之前applicaionId后面加個(gè)字符串庆聘,這樣才能打成兩個(gè)包名,而這也是在同一部手機(jī)上同時(shí)運(yùn)行開發(fā)版本和正式版本的關(guān)鍵
(4)也許設(shè)置完這些后應(yīng)該就可以打包出兩個(gè)app了勺卢,這時(shí)候要注意了伙判,還是可能存在問題,因?yàn)槟愕腶pplicationId為了app能在同一部手機(jī)上同時(shí)運(yùn)行黑忱,兩種打包出來的名字是不同的宴抚,如果你在app中用到了applicationId的部分同樣需要?jiǎng)討B(tài)替換,比如android7.0訪問文件時(shí)需要provider
在AndroidManifest.xml中:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
在java代碼中:
public static final String PROVIDER_FILE = BuildConfig.APPLICATION_ID+".fileprovider";
這樣就ok了