今天给大家示范一下基本设置和说明
ps:博主的这套配置让你的项目可以在任意电脑使用as打开无需额外文件、无需额外配置哦,当然as的版本是不能差距太大
复制项目减少体积见:android 快速方便的将项目复制到其他电脑上
首先根目录project的build.gradle
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'https://jitpack.io' }
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.1.3'//gradle版本,大版本一般和as版本号对应,尽量匹配
//3.0废弃并且作者不再维护
// classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'https://jitpack.io' }
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
ext {//为整个gradle添加,方便统一管理
//用于编译的SDK版本
COMPILE_SDK_VERSION = 27
//最低支持Android版本
MIN_SDK_VERSION = 16
//目标版本
TARGET_SDK_VERSION = 27
//implementation "com.android.support:appcompat-v7:${APPCOMPAT_VERSION}"
//或者implementation 'com.android.support:appcompat-v7:'+APPCOMPAT_VERSION
//等等,反正就是字符串拼接
APPCOMPAT_VERSION = "27.0.2"
}
app里的build.gradle配置
apply plugin: 'com.android.application'
android {
buildToolsVersion '27.0.3'//建议下载最新的
compileSdkVersion COMPILE_SDK_VERSION//建议和targetSdkVersion一样
defaultConfig {
applicationId "等于packageName必填目前是你的包路径"
minSdkVersion MIN_SDK_VERSION//适配的最低版本,建议4.0以上
targetSdkVersion TARGET_SDK_VERSION//目标版本(可以暂时理解为最高版本),建议最新(6.0和7.0的api改动较大,需要全面测试)
versionCode 25152//版本int值,一般是日期或者和version对应
versionName "2.5152"//版本号
multiDexEnabled true//true表示分包,基本是必须的了,app很容易就会出现65536的问题,了解更多见分包的博客
flavorDimensions "default"//多渠道的维度,不会就填default,了解更多见①
//增加静态值BUILD_TIME,代码中Build.BUILD_TIME即可获取
buildConfigField("long", "BUILD_TIME", System.currentTimeMillis() + "L")
ndk {//支持架构,v8a运行会有问题,建议不写
//abiFilters "armeabi", "armeabi-v7a", "arm64-v8a", "mips", "mips64", "x86", "x86_64"
abiFilters "armeabi", "armeabi-v7a", "x86"
}
//在AndroidManifest.xml增加一些值(xml没有代码,但此处可以动态修改),了解更多见②
manifestPlaceholders = [
GAODE_KEY : "000000"//比如增加一个高德的key的string值
]
}
signingConfigs {//debug时签名位置,请保存好自己的签名,不然以后有的你麻烦
release {
keyAlias '123456'
keyPassword '123456'
storeFile file('../123456.jks')//签名位置,..表示上一级目录,这里写的是相对位置:项目跟目录的123456.jks签名文件(这样的话别人也可以直接使用)
storePassword '123456'
}
}
buildTypes {//Build apk(打包)或build variants(debug)时选择的apk类型
release {//正式,静态常量BuildConfig(这个类太多,注意不要导错!不要导错!不要导错!).DEBUG=false,线上包用这个
minifyEnabled false//是否开启混淆,不会的暂时不开启,了解更多见混淆相关的博客
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release//告诉编译器debug时用哪个签名,不然会出现debug包和线上包替换安装都必须先卸载的情况
//AndroidManifest增加值,了解更多见②
manifestPlaceholders = [
JPUSH_APPKEY : "111111"
]
}
debug {//测试,静态常量BuildConfig.DEBUG=true,测试包
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
//AndroidManifest增加值,了解更多见②
manifestPlaceholders = [
JPUSH_APPKEY : "123456"
]
signingConfig signingConfigs.release
}
//不混淆,便于debug
NoProguard {//此处表示可以自定义
initWith debug//来源于debug的自定义
minifyEnabled false
}
}
dexOptions {//此处不需要改:项目大了有时java会内存溢出,这里表示扩大java运行内存
javaMaxHeapSize "4g"
}
productFlavors {
//一般多渠道用的,和上面的多渠道对应,了解更多见①
yingyongbao {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "yingyongbao"]
flavorDimensions "default"
}
ali {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "ali"]
flavorDimensions "default"
}
}
lintOptions {//抑制某些错误继续打包:此处不需要改,有问题解决问题,不要在这加
//禁用掉丢失多国语言的错误提示
disable 'MissingTranslation'
//下面两个是忽略lint的报错信息继续打包,不建议使用.孩子哭就捂住嘴是解决不了问题的
// checkReleaseBuilds false
// abortOnError false
}
//这个方法是将打包生成的apk修改到项目根目录.apk目录下,生成的apk都需要在此目录中查找,不会用的可以删除这段
applicationVariants.all { applicationVariantImpl ->
//输出目录修改
if (!applicationVariantImpl.getPackageApplication().outputDirectory.toString().contains("/build/")) {
//不是build就输出到根目录下/.apk
applicationVariantImpl.getPackageApplication().outputDirectory = new File(".apk", getRootDir())
}
applicationVariantImpl.outputs.all {apkVariantOutputImpl ->
//获取app名称
InputStreamReader xmlIsr = new InputStreamReader(new FileInputStream(getProjectDir().getAbsolutePath() + "/src/main/res/values/strings.xml"))
String readSt, appName = ""
while ((readSt = xmlIsr.readLine()) != null) {
if (readSt.contains("app_name")) {
appName = readSt.split(">")[1].split("<")[0]
break
}
}
xmlIsr.close()
//修改apk的文件名
if (applicationVariantImpl.buildType.debuggable) {
apkVariantOutputImpl.apkData.outputFileName = appName + "测试V${defaultConfig.versionName}.apk"
} else {
apkVariantOutputImpl.apkData.outputFileName = appName + "V${defaultConfig.versionName}.apk"
}
}
}
}
repositories {//此处不需要改
flatDir {//aar的配置
dirs 'libs'
}
}
dependencies {
//新版的导入为api,旧版的导入为compile
api fileTree(include: ['*.jar'], dir: 'libs')//一次性导入所有libs目录下的jar
//基础包
api project(':mylibrary')
api 'com.android.support:gridlayout-v7:' + APPCOMPAT_VERSION//support包需要统一,不然某些方法可能会崩溃
}
①多渠道设置
举例(这只是个例子,实际运用请不要模仿,主意原因applicationId和包路径不一样会导致一些第三方识别错误的问题(貌似只有微信),比如wx的分享支付(直接调的intent跳转,两个不一样的话根本跳不回来)。谷歌设想是好的,但人(微)各(信)有(坑)志(爹)):
项目需求,要10个完全一样的app,第一时间大家都想到的是复制10个,然后改包名吧。但是当项目需求修改时每次都要复制n遍,这岂不是要上天...
这时applicationId应运而生,你只需要将applicationId改10次就会发现你安装了10个app,如下。但是作为程序猿,每次改applicationId、app名等也是也是一个体力活啊。
代码的包路径com.a.0,固定不改
applicationId "com.a.0"//这是原来默认的进程名com.a.0,getPackageName为com.a.0
//增加str资源
resValue "string", "app_name", "app0“
//修改applicationId
applicationId "com.a.a"//进程名com.a.a,getPackageName为com.a.a(此时已经不是包路径了)
//增加str资源
resValue "string", "app_name", "appa“
applicationId "com.a.b"//进程名com.a.b,同理
//增加str资源
resValue "string", "app_name", "appb“
于是多渠道应运而生,当你使用多渠道时,问题又来了,类似友盟这种多渠道配置早已占坑,根本没法动态修改applicationId(不然怎么叫多渠道呢...)
//理想情况是这样的
productFlavors {
app0 {
applicationId "com.a.0"
//增加str资源
resValue "string", "app_name", "app0“
}
appa {
applicationId "com.a.a"
//增加str资源
resValue "string", "app_name", "appa“
}
...
}
//但是类似友盟这种多渠道早已占坑
yingyongbao {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "yingyongbao"]
}
ali {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "ali"]
}
//这两个完全冲突,想合并得需要渠道数*项目数的代码倍数,每增加一个项目都麻烦死
而此时二维的多渠道再次打破这一僵局,这就是flavorDimensions这个主角
defaultConfig {
// applicationId 不需要了,多渠道中配置
flavorDimensions "chanel","appType"
...
}
productFlavors {
Yyb_ {
dimension "channel"
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "yingyongbao"]
}
Ali_ {
dimension "channel"
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "ali"]
}
...
// 不同的APP
app0_ {
dimension "appType"
//主意细节,初始化applicationId比较晚,gradle的其他地方可能引用不了
applicationId "com.a.0"
//增加str资源
resValue "string", "app_name", "app0“
}
appa_ {
dimension "appType"
applicationId "com.a.a"
//增加str资源
resValue "string", "app_name", "appa“
}
//每增加一个项目只需要再加个就行了
...
}
②AndroidManifest.xml动态修改,比如原配置里build.gradle极光的key正式和测试的区分,AndroidManifest直接使用即可。
不同级别的manifestPlaceholders最后会合并在一起,你不用担心GAODE_KEY和JPUSH_APPKEY会冲突
applicationId也可以使用(虽然会报错):${applicationId}
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="${GAODE_KEY}"/>
转载请注明出处:王能的博客Android studio build.gradle 基本设置配置_王能的博客-优快云博客