最近在項目上測試經常會讓打包測試服和正式服的項目,來交替測試,經常卸載和安裝項目很麻煩。為了更方便的同事們的測試,準備折騰下gradle的配置。
給自己定了幾個需求:
- gradle配置多applicationId
- gradle配置多appName
- gradle配置多HOST
正常配置gradle只需配置app下的gradle文件即可
android {
productFlavors {
//默認版本,不設置 applicationId ,繼承 defaultConfig 中的配置
online {
resValue "string", "app_name", "線上應用" //替換appName,通過替換strings中的資源名字,一定要刪除strings中的app_name,否則會報錯
applicationId "com.xx.xx"
buildConfigField "String", "API_HOST", "\"https://192.168.1.14/\""
}
//153版本
dev_153 {
resValue "string", "app_name", "測試應用"
applicationId "com.xx.yy"
buildConfigField "String", "API_HOST", "\"https://192.168.1.16/\""
}
}
}
- 替換appName,通過替換strings中的資源名字,一定要刪除strings中的app_name,否則會報錯
- applicationId 為你要替換的包名
- 通過buildConfigField生成HOST常量,在java代碼中通過BuildConfig.API_HOST調用
配置多applicationId時要注意,applicationId動態替換了,項目中用到applicationId的地方也要修改為動態。
-
7.0適配中的FileProvider,AndroidManifest中的替換
<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> 7.0中應用安裝時applicationId的替換
-
動態PackageName,形勢不止一種,如果你不是多moudle,也可以通過buildConfig獲取applicationId
public static void startInstall(Context context, File apkfile) {
if (!apkfile.exists()) {
KLog.d(TAG, "startInstallexists");
return;
}
KLog.d(TAG, "startInstall");
Intent i = new Intent(Intent.ACTION_VIEW);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (Build.VERSION.SDK_INT >= 24) { //判讀版本是否在7.0以上
//參數1 上下文, 參數2 Provider主機地址 和配置文件中保持一致 參數3 共享的文件
Uri apkUri =
FileProvider.getUriForFile(context, context.getPackageName() + ".fileprovider", apkfile);//動態PackageName,形勢不止一種,如果你不是多moudle,也可以通過buildConfig獲取applicationId
//添加這一句表示對目標應用臨時授權該Uri所代表的文件
i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
i.setDataAndType(apkUri, "application/vnd.android.package-archive");
} else {
i.setDataAndType(Uri.fromFile(apkfile),
"application/vnd.android.package-archive");
}
context.startActivity(i);
}
以上是正常項目的配置,但是由于我的項目是多moudle依賴,網絡層在整個項目依賴的最下層,如果在app的gradle中配置HOST,無法在最下層的依賴moudle中調用,因為gradle的依賴關系只能正向調用,上層引用底層的moudle,則只能上層使用底層moudle中的資源和代碼,底層moudle無法逆向使用上層的,所以app的BuildConfig.API_HOST,底層無法調用到。
我在app的build中定義buildConfig參數傳遞給最下層moudle中來切換HOST
UrlConstant.API_HOST = BuildConfig.API_HOST;
UrlConstant.H5_HOST = BuildConfig.H5_HOST;
UrlConstant.SERVICE_HOST = BuildConfig.SERVICE_HOST;
UrlConstant.SHOP_HOST = BuildConfig.SHOP_HOST;
參考:http://www.tuicool.com/articles/Nzm6fiI
以上就是我需求的配置,如果你有多渠道或者其他需求也可依照配置。
如果哪里寫的不對,也歡迎大家多多指出和交流??