实现了: 不同环境,不同包名; 不同环境,修改不同的 string.xml 资源文件; 不同环境,修改指定的常量; 不同环境,修改 AndroidManifest.xml 里渠道变量; 不同环境,引用不同的...不同环境,添加 string.xml 资源文件 利用 resValue 来定义资源的值,顾名思义 res 底下的内容应该都可以创建,最后用 R.xxx.xxx 来引用。...'com.roughike:bottom-bar:2.0.2' prodCompile 'com.roughike:bottom-bar:2.0.2' } xxxCompile 代表 各个渠道的名称...然后把需要分渠道的文件,放到不同的 module 里面,把主项目的文件删掉。 千万注意:如果这样做了,每次需要引用的时候,在各个渠道的 module 里面都必须要放置文件哦,不然会找不到资源。...打包完成之后,然后就可以在我们指定的目录下,看到我们所生成的apk包。
.所有依赖库里去掉 buildToolsVersion 这个会提示错误:buildToolsVersion rootProject.ext.buildToolsVersion,一键就可以去掉 4.引入名称修正... inner element must either be a resource reference or empty 错误内部元素必须是资源引用或空 如果是自己的库中出现的情况...可以借助gradle中的resValue这个方法去修改编译中的文件: android { ......buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile...","" } debug{ resValue "id", "webviewload_monitor_cancel_point",""
不同版本之间通常有不同的设置。 Build types 定义APP或者模块该被如何构建。 可以用buildTypes来定义构建类型。...staging构建类型 buildTypes { // staging 是一个自定义名字 // 生成signed App时可以选择这个类型 staging.initWith(buildTypes.debug...initWith()创建一个新的构建类型并复制现有的构建类型。用这个方法可以复写已有的构建类型。 资源目录 创建了新的构建类型后,可以建立新的资源文件。...└── test 不同资源目录里的文件可以用相同的文件名。...-- staging strings.xml --> GStaging 生成不同版本的app时,会自动去找相应的资源文件
不同的渠道可能需要不一样的 Logo,不一样的包名,不一样的资源文件,不一样的功能模块等等,那么就可以通过这里来配置。...resValue:这是 productFlavors 或 buildTypes 里的方法,用法跟 buildConfigField 一模一样,区别仅仅是 buildConfigField 是在 BuildConfig...中生成常量,而 resValue 是在 res/value.xml 中生成对应的字符串资源。...tech.meituan.com/mt-apk-packaging.html 6.5 Gradle 性能检测 命令:gradlew build -profile 在项目根目录下执行完该命令后,就可以在 build/report 下找到生成的报告文件...,也可以是网络上的脚本,本地脚本时,from 后面填写脚本的相对路径名称即可,如果脚本文件跟 build.gradle 在同一层级,直接写脚本文件名即可。
***Android***实现同时安装测试环境与生产环境包 众所周知,相同包名的APP,是不能同时安装的,但是我们实际开发中,测试同学往往在测试环境没问题,上了生产环境,却发现了bug,这时候就只能卸载生产环境的包...那么有没有一种可能,同时安装测试与生产环境的包呢?...这个当然是可以的,我们更换包名就行了,Android Studio早已为我们准备了相应的操作: 很简单,就一句,给你的app, buildTypes -debug下面增添加如下代码: applicationIdSuffix...需要注意的地方 叮叮当 如果你的APP内含有分享或者推送,那么测试版如果与线上用的是同一个appid与servert,那么测试版可能都会失败,当然这也很正常(如果不是同一个,自己处理下即可,怎么处理呢...所以这点需要注意,逻辑上的功能都没什么问题。 如果不是同一个id,处理方式如下 同样是buildType下更改debug和release,分别对应的不同id, ...
每一个Build Type都会指明是否为Debug,Application Id,是否无用的资源应该被删除掉等等。你也可以在buildTypes的代码块中定义多种Build Types。...Android Studio默认生成的标准的build Types代码块如下: android { buildTypes { release {...当你创建一个新的build type时,该目录不会自动创建,你必须在你使用代码与资源前自己为每一个build type创建source set目录。...Product flavors Build Type可以对于相同的App配置生成不同类型的构建,与Build Type相反,product flavors用来创建相同的App,但是不同的版本。...在这种情况下,Flavor的SourceSet中的资源会被打包到APK中。而Library工程的资源优先级会是最低的。
buildSrc + setting 给大家安利下这个模式,buildSrc的模式下,我们可以不需要推本地的jar就可以直接调试plugin插件,这个就解决了plugin插件非常不好调试的问题。...安利下我大佬的一个Demo项目,有兴趣的可以参考下这个。 小贴士 对于插件的调试 可以在....debug buildTypes resValue 我们有时候在写build.gradle的时候,会在buildTypes中增加一些resValue "string", "AppName", "app1...我们最后会在build/generated/下面生成一个资源文件gradleResValue.xml,它会在在编译时会被合并到项目资源文件内。...这个时候我们只要获取到android的Extension,就可以像在build.gradle调用resValue一样,调用defaultConfig内的resValue方法,去添加资源信息了。
看其属性的名字就可以知道其作用,比如applicationId是配置包名的,versionCode是版本号,versionName是版本名称等。...下面我们分析一下,Android Gradle任务比较复杂,它的很多任务都是自动生成的,为了可以更灵活的控制,Android Gradle提供了applicationVariants、libraryVariants...,也是和buildConfigField,只不过它控制生成的是资源,比如我们在android的values.xml定义生成的字符串。...可以用它来动态生成我们想要的字符串,比如应用的名字,可能一些渠道会不一样,这样就可以很灵活的控制自动生成,关于resValue详细介绍请参考相关文档,这里不再举例说明。...一般我们这个插装只是在特性情况下,那么我们新增一个特殊的flavor好了,专门做这个使用,这里我姑且叫feature。
resValue 属性 , 目的是生成一个 res 资源属性 ; 该操作相当于在 res/value 目录下定义了一个资源 ; android { defaultConfig {...// 生成 res/values 目录下定义的资源 resValue("String", "gradle_res_config", "Gradle Res Config") }...; 查看在 string.xml 配置文件中配置的应用名称 : ClassLoader_Demo 标签的名称是 string , 首字母是小写的 , 这里注意与 String 区分 ; 使用 resValue("string", "gradle_res_config", "Gradle...Res Config") 配置 ; 正确配置如下 : android { defaultConfig { // 生成 res/values 目录下定义的资源 resValue
在项目的根目录(在Project的Top-Level)下会生成settings.gradle和build.gradle。而在Android app模块中会创建一个build.gradle文件。...在这种场景下,Gradle创建了为每个Settings文件都创建了一个Serttings对象,并且可以从该对象中调用所需要的Methods。我们不需要知道Settings类的细节,但是最好关注一下。...在这种情况下,仓库代表了这个Project所依赖的资源或者说我们所需要的一些可下载的Libraries都是保存在这个仓库中。JCenter是一个知名的Maven仓库。...值会被生成一个真实的String。...而最近,Android Tool团队也会通过以下方式来配置资源: android { buildTypes { debug { resValue
BaseApi是我们自己定义的,其他的都是默认生成的,这里我们可以看到,应用包名也是我们指定的。...resValue我们可以修改变量的值,这个值会生成在string.xml中,比如上面我们定义了一个tip变量,需要注意的是,这个变量不能出现在string.xml中,否则会提示资源重复。...raw下的资源或者assets下的资源,这种情况下我们就需要 使用下面的方式: 在src目录下新建与main同级且与渠道名称一样的文件包名,并且新建res资源目录,放入图标使用的图片资源,必须要与main...中的名称相同才可以覆盖,如图所示: ?...我们直接编译会出现上面的问题,因为module模块可能没有生成对应的编译资源,因为android的默认编译是debug类型的,所以为了和app主模块同步,我们设置去掉默认的发布类型,需要在module中的
比如一个Android APK的编译可能包含:Java源码编译Task、资源编译Task、JNI编译Task、lint检查Task、打包生成APK的Task、签名Task等。...有时我们需要发布介于debug与release之间的preview 版本。...Build Variant 差异管理 比如app生成不同版本(免费,收费),适配特殊机型,多渠道等需要发多个包,最终能编译出的apk的数量是由Product Flavor(产品种类)与Build Type...需要注意的是BuildConfig定义的变量实在当前module下,如果还有一个基础module需要直接在基础module的gradle下配置。...资源和mainfests的优先级是这样的: ? 如果一个资源在main中和在flavor中定义了,那么那个在flavor中的资源有更高的优先级。
当执行gradle hello的时候,Gradle就会去调用这个hello task来执行给定操作(Action)。...构建一下,就能生成一系列的Build Variant了: devDebug devRelease officialDebug officialRelease wandoujiaDebug wandoujiaRelease...,稍微解释一下: // minifyEnabled 混淆处理 // shrinkResources 去除无用资源 // signingConfig 签名 // proguardFiles 混淆配置 //...自定义导出的APK名称 默认android studio生成的apk名称为app-debug.apk或者app-release.apk,当有多个渠道的时候,需要同时编出50个渠道包的时候,就麻烦了,不知道谁是谁了...这个时候,就需要自定义导出的APK名称了,不同的渠道编出的APK的文件名应该是不一样的。
注意:这里的参数值没有一个规定的值,需要调整数值来测试一下哪个更适合,不然会得到一个负面的影响。...dev { dimension 'channel' //避免编译不必要的资源 resConfigs "...) 将来,KTS会比Groovy更适合用于编写Gradle脚本,因为采用Kotlin编写的代码可读性更高,并且Kotlin提供了更好的编译时检查和IDE支持 虽然与Groovy相比,KTS当前能更好地在...(现在Groovy与Kotlin DSL混合情况下,会一直报错,所以先把原有的全注释掉) 原 build.gradle buildscript { ext.kotlin_version...与productFlavors这里,就只有这两处改动最大,其他的要么改为=;要么改为("xx")。
/2.3/com.android.build.gradle.internal.dsl.ProductFlavor.html ProductFlavor#resValue 方法用于生成同一个 resource...资源 , 该操作等价于在 res/values 目录下的文件中配置一个特定类型的值 ; 如 : 在 build.gradle 的 " android # defaultConfig " 层级中设置如下内容..., android { defaultConfig { // 生成 res/values 目录下定义的资源 resValue("string", "gradle_res_config...Gradle Res Config 编译之后 , 可以在 Android 代码中 , 使用 R.string.gradle_res_config 获取该生成的配置数据...; 在 Android 的 Activity 代码中 , 可以直接通过 R 资源获取该数据内容 ; 二、ProductFlavor#dimension 维度属性 ---- ProductFlavor
生成BuildConfig文件,资源文件 在引入Gradle编译工具之后,Apk的打包流程就多了这么一步,生成BuildConfig文件和资源文件。...把所有的Android资源文件进行解析,生成扩展名为.flat的二进制文件。比如是png图片,那么就会被压缩处理,采用.png.flat的扩展名。...首先,这一步会生成辅助文件,比如R.java(R文件),R文件大家应该都比较熟悉,就是一个资源索引文件,我们平时引用也都是通过R.的方式引用资源id。...1、链接过程优化 在AAPT中是没有链接功能的,会将所有的资源进行编译生成压缩包。这样处理方式有个缺点就是每次编译都要全量编译。...当注解的生命周期被设置为CLASS的时候,就代表该注解会在编译class文件的时候生效,并且存在与java源文件和Class字节码文件。
AndroidStudio使用的一些理解与经验。...4 Gradle环境下Android的默认文件结构 ?...AAPT(Android Asset Packaging Tool)打包 R.java文件 资源ID app.ap 压缩包 对png图进行优化等 源码编译: 生成.class字节码,在这里可以进行删除无用类...3、java调试或者说单元测试: 对于纯java的业务(相信在model层里有很多都是)我们可以通过只运行java来调试,比如我最近在做单词的短语匹配算法,那么我在调试的时候再class...,没有记住的模糊搜索下操作指令名称也能快速找到,如果没有可以去keymap里边自定义设置。
版本号名称的后缀 ; 在计算 变体 ( debug 或 release ) 的最终版本名时,这会附加到 “基本” 版本名之后 , 基本版本名称就是 defaultConfig 中的 versionName..."1.0" 配置 ; 版本名称后缀 ; 在计算 变体 ( debug 或 release ) 的最终版本名时,这会附加到 “基本” 版本名之后。.../2.3/com.android.build.gradle.internal.dsl.BuildType.html BuildType#initWith 方法 作用是 拷贝一个 " 给定的 编译类型 "...方法 ; 此时 如果不配置 tom 编译类型的其它选项 , 则 tom 编译类型 与 debug 是一模一样的 ; android { compileSdkVersion 30 buildToolsVersion...未使用的资源会被优化 shrinkResources true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt
、实例名、变量名替换为简短且无意义的名称,例如Student类的名称可能改为a,方法getName的名称可能改为b等等; App的Java代码经过压缩和混淆之后,打包生成的APK文件会随之变小。...时便会自动移除无用的资源文件。...同时开启代码压缩和资源压缩的buildTypes节点配置示例如下: buildTypes { release { minifyEnabled true ...,原始质量的高清图片与有损压缩后的图片在视觉上没有什么差别,因此适当压缩图片质量也是减小APK体积的一个重要途径。...此时需要修改模块的build.gradle,在release节点下添加so文件的过滤规则,详细的过滤配置如下所示: buildTypes { release {
把这些manifest属性放到build文件中的一个重要功能就是它可以被动态的设置。例如,可以通过读取一个文件或者其他逻辑来获取版本名称。...它结合了代码(例如jar包或者本地.so文件)和资源(manifest,res,assets)。每个library也可以单独设置Build Type等来指定生成不同版本的aar。...每个Build Type都会生成一个apk.Product Flavors也是同样的:项目的输出僵尸所有Build Types与Product Flavors的结合。...不仅会移除项目中未使用的资源,而且还会移除项目所以来的类库中的资源。注意,资源清理只能在与代码清理结合使用(例如ProGuad)。这就是为什么它能移除所依赖类库的无用资源。...通常,类库中的所有资源都是使用的,只有类库中无用代码被移除后这些资源才会变成没有代码引用的无用资源。 android { ...
领取专属 10元无门槛券
手把手带您无忧上云