Android开发中有时候会碰到打包不同特性App的需求,一般只有一些特性不同,比如App名字,App图标,App的包名,App主色调,还有一些第三方的SDK配置等。这种需求通过Gradle配置可以快速的实现。
先介绍一些Gradle的常用配置:
android {
compileSdkVersion 24
buildToolsVersion "24.0.1"
//默认的一些设置
defaultConfig {
applicationId "com.example.demo" //应用包名
minSdkVersion 15 //支持的最低版本,低于此版本的设备无法安装应用
targetSdkVersion 19 //目标版本
multiDexEnabled true
ndk { //ndk相关设置
moduleName = "core" //对应的C/C++文件名
abiFilters "armeabi", "armeabi-v7a", "x86" //支持的平台
}
}
//编译的版本的一些设置,默认生成debug和release,也可以自定义
buildTypes {
release { //release版本的一些默认设置
// signingConfig signingConfigs.config
minifyEnabled true //是否进行混淆
zipAlignEnabled true //安装包中的资源按4字节对齐,减少应用在运行时的内存消耗
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug { //debug版本的设置
applicationIdSuffix ".debug" //包名加后缀,即生成的包名是com.example.demo.debug
}
//创建一个新的BuildType,名字是jnidebug,同时配置它是复制自debug Build Type;
jnidebug.initWith(buildTypes.debug)
jnidebug {
packageNameSuffix ".jnidebug" //添加一个不同的包名后缀
jniDebuggable true //配置jnidebug开启debug版本的JNI组件
}
}
//签名的一些设置
signingConfigs { //不同的版本可以配置不同的签名
demo1 {
keyAlias 'demo'
keyPassword '111111'
storeFile file('C:\\Desktop\\apps\\demo1.jks')
storePassword '111111'
}
}
}
下面是打包两个版本的App的配置,分别是demo1,demo2
//除了默认的配置以外还要配置不同版本的签名
signingConfigs { //不同的版本可以配置不同的签名
demo1 { //版本1
keyAlias 'demo1'
keyPassword '111111'
storeFile file('C:\\Desktop\\apps\\demo1.jks')
storePassword '111111'
}
demo2 { //版本2
keyAlias 'demo2'
keyPassword '111111'
storeFile file('C:\\Desktop\\apps\\demo2.jks')
storePassword '111111'
}
}
//利用productFlavors配置不同特性的App
flavorDimensions "flavor"
productFlavors {
//App1
demo1 {
dimension "flavor"
applicationId "com.example.demo1" //不同的包名
versionCode 10
versionName "1.0"
signingConfig signingConfigs.demo1 //demo1的签名配置
buildConfigField "String", "App_Name", "\"我的Demo1\"" //配置一些常量,用以代码中做版本判断
buildConfigField "String", "App_Name_En", "\"demo1\""
buildConfigField "String", "App_Version", "\"1.0\""
}
//App2
demo2 {
dimension "flavor"
applicationId "com.example.demo2"
versionCode 10
versionName "1.0"
signingConfig signingConfigs.demo2
buildConfigField "String", "App_Name", "\"我的Demo2\""
buildConfigField "String", "App_Name_En", "\"demo2\""
buildConfigField "String", "App_Version", "\"1.0\""
}
}
经过以上的配置以后,点击Android Studio左下角的Build Variant,可以看到一共有四个版本的App可以编译,分别是:demo1Debug、demo1Release、demo2Debug、demo2Release;而且demo1和demo2的包名不同,可以安装在同一部手机里。
不同的特性的应用往往很多东西需要改,比如名字,图标,启动图,主题色,及其他一些功能,比如推送、更新的一些设置等,而且这些都需要在AndroidManifest.xml文件中修改,一个个修改很麻烦。在Gradle中可以通过manifestPlaceholders设置,编译时动态修改AndroidManifest.xml文件配置:
//根据不同的版本配置AndroidManifest.xml文件,同productFlavors的manifestPlaceholders属性
productFlavors {
//App1
demo1 {
......
manifestPlaceholders = ["app_name":"demo1", "app_icon":"@mipmap/icon","umeng_app_key": "111111"]
......
//App2
demo2 {
......
manifestPlaceholders = ["app_name":"demo2", "app_icon":"@mipmap/icon", "umeng_app_key": "1123211"]
.....
}
}
//在AndroidManifest.xml文件中更改对应的属性,格式为 “${变量名}”
<application
android:name="com.caibo_inc.happyshopping.application.HSApplication"
android:allowBackup="true"
android:icon="${app_icon}"
android:label="${app_name}"
android:theme="@style/AppTheme"
android:windowIsTranslucent="true"
tools:replace="android:icon,android:allowBackup">
......
<meta-data
tools:replace="android:value" //在需要替换的属性处加tools:replace="属性名",否则会报冲突错误
android:name="UMENG_APPKEY"
android:value="${umeng_app_key}" />
......
</applocation>
除了以上的简单配置以外,还可以根据需要更改其他的一些特性,比如不同版本的App需要不同的启动图,以及更改主色等。方法是直接再Src目录下,建立一个与main同级的结构和main一样的目录,去除所有的Java代码和资源等,在需要更改的地方,比如需要修改字符串或者颜色,就重写values下的colors,或是strings文件,编译的时候同样的属性会合并替换,layout下的同名xml文件会替换。这样不同版本的App只要建立不同的目录,修改对应的资源文件即可。然后在代码中根据不同的版本做相应处理即可。
所建立的目录不能有和main中一样的类,否则会报同名冲突错误;但是可以增加类, 也就是可以增加功能。
欢迎关注我的公众号,和我一起每天进步一点点!
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/e09dd5a089f31710126d61972c3122f1.jpeg)