赞
踩
本章节对APP的Gradle文件进行详解
1.位置
signingConfigs{}闭包 存在于 android{}闭包中。
2.作用
配置打包时的签名信息,比如签名文件,签名密码等等。
3.代码
AndroidStudio自动生成signingConfigs{}配置步骤
步骤1:AndroidStudio中选择Project Structure 如下图
步骤2:选中app,点击Singing添加 如下图
注意:这里可以点击 图中的 “+” 按钮 创建任意名称的signingConfigs 比如这里我们编辑的两个 一个取名release 一个取名debug。
步骤3:选择事先配置放好的签名文件以及密码等配置。如下图
步骤4:手动 添加V1 V2支持 类似下图操作
最终生成的代码
- android {
-
- signingConfigs {
-
- release {
- storeFile file('C:\\Users\\XXX\\AndroidStudioProjects\\demo\\OKHttpMVPDemo\\test.jks')
- storePassword '123456'
- keyAlias 'key0'
- keyPassword '123456'
- v1SigningEnabled true
- v2SigningEnabled true
- }
-
- debug {
- storeFile file('C:\\Users\\XXX\\AndroidStudioProjects\\demo\\OKHttpMVPDemo\\test.jks')
- storePassword '123456'
- keyAlias 'key0'
- keyPassword '123456'
- v1SigningEnabled true
- v2SigningEnabled true
- }
- }
-
- ...
-
- }
1.位置
buildTypes{}闭包 存在于 android{}闭包中。
2.作用
配置打包时的各种信息,比如上述的签名信息,比如是否使用混淆等等。
3.代码
AndroidStudio自动生成buildTypes{}配置步骤
步骤1:AndroidStudio中选择Project Structure 如下图
步骤2: 左侧选择 Build Variants 中间选择 app 右侧选择 Build Types 如下图
注意:上图右侧中 有两个选项 release和debug 这两个就是我们上述生成signingConfigs{}闭包时,编辑的名称,这两个名称可以随意。
然后上图右侧中的各个选项都填写完成 点击OK 生成代码
- android{
-
-
- buildTypes {
-
- release {
- minifyEnabled false
- applicationIdSuffix ''
- versionNameSuffix '-Release-'
- debuggable false
- jniDebuggable false
- renderscriptDebuggable false
- renderscriptOptimLevel 3
- signingConfig signingConfigs.release
- multiDexEnabled false
- }
-
- debug {
- minifyEnabled false
- applicationIdSuffix '.debug'
- versionNameSuffix '-Debug-'
- debuggable true
- jniDebuggable true
- renderscriptDebuggable false
- renderscriptOptimLevel 3
- signingConfig signingConfigs.debug
- multiDexEnabled false
- }
- }
-
- ...
-
- }
各个属性含义
- 1.minifyEnabled:表明是否对代码进行混淆,true表示对代码进行混淆,false表示对代码不进行混淆,默认的是false。
-
- true时需要添加混淆文件的位置
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
-
-
- 2.proguardFiles:指定混淆的规则文件。这里指定了proguard-android.txt文件和proguard-rules.pro文件两个文件,proguard-android.txt文件为默认的混淆文件,里面定义了一些通用的混淆规则。proguard-rules.pro文件位于当前项目的根目录下,可以在该文件中定义一些项目特有的混淆规则。
-
-
- 3.applicationIdSuffix:配置不同的applicationId。不同的包/环境可能applicationId不一样。这里在debug包中在不同的applicationId中添加了一个后缀.debug。
-
-
- 4.versionNameSuffix:配置不同的versionName。和上述的applicationIdSuffix原理一样。这里在versionName "1.0"的基础上 release包加了-Release-后缀 debug包加了-Debug-后缀。
-
-
- 5.debuggable:是否支持断点调试。
-
-
- 6.jniDebuggable:是否可以调试NDK代码。使用不多。
-
-
- 7.renderscriptDebuggable:是否开启渲染脚本就是一些c写的渲染方法。使用不多。
-
-
- 8.renderscriptOptimLevel:渲染等级,默认是3。使用不多。
-
-
- 9.signingConfig:设置签名信息,通过signingConfigs.release或者signingConfigs.debug,配置相应的签名。配置此配置 需要先配置signingConfigs{}闭包。
-
-
- 10.multiDexEnabled:是否开启多个dex文件支持,一般用来解决打包时65536问题。
4.打包
打包方式一:AndroidStudio工具
打包方式二:命令行
- gradlew assembleDebug
-
-
-
- gradlew assembleRelease
两种方式打的包位置
包比较
1.位置
lintOptions{}闭包 存在于 android{}闭包中。
2.作用
代码扫描分析,Lint 是Android Studio 提供的 代码扫描分析工具,它可以帮助我们发现代码结构/质量问题,同时提供一些解决方案。
3.代码
- android{
-
- lintOptions {
- //打Release包的时候进行检测
- checkReleaseBuilds false
-
- //即便是报错也不会停止打包
- abortOnError false
- }
- ...
-
- }
1.位置
packagingOptions{}闭包 存在于 android{}闭包中。
2.作用
打包时的一些其他配置项,packagingOptions常见的设置项有exclude、pickFirst、doNotStrip、merge。
3.代码
<1> exclude:过滤掉某些文件或者目录不添加到APK中,作用于APK,常用来解决多个jar包引入时的冲突。 比如Retrofit使用时。
- android{
-
-
- packagingOptions {
- //解决编译时com.android.builder.merge.DuplicateRelativeFileException: More than one file was found with OS independent path 'META-INF/rxjava.properties'这个错误
- exclude 'META-INF/rxjava.properties'
- }
- ...
-
- }
<2> doNotStrip:可以设置某些动态库不被优化压缩。 比如so文件
- android{
-
-
- packagingOptions {
- doNotStrip "**/*.so"
- }
- ...
-
- }
<3> pickFirst:匹配到多个相同文件时,只使用第一个。只作用于APK,不能过滤aar和jar中的文件。比如
- android{
-
- packagingOptions {
- pickFirst "lib/armeabi/XXX.so"
- }
- ...
-
- }
<4> merge:将匹配的文件都添加到APK中,和pickFirst相反,会合并所有文件。
- android{
-
- packagingOptions {
- merge '**/name.txt'
- }
-
- ...
-
- }
1.位置
sourceSets{}闭包 存在于 android{}闭包中。
2.作用
配置目录指向,通过修改SourceSets中的属性,可以指定需要被编译的源文件。比如jar包和so文件等等。
3.代码
SourceSets默认的目录结构是固定的Java标准项目目录布局结构
- android {
-
- sourceSets {
-
- main {
-
- //指定清单文件的位置
- manifest.srcFile 'AndroidManifest.xml'
- //指定Java代码的位置
- java.srcDirs = ['src']
- //指定aidl的位置
- aidl.srcDirs = ['src']
- //指定资源的位置
- res.srcDirs = ['res']
- //指定assets资源的位置
- assets.srcDirs = ['assets']
- //指定本地jar包和so文件的位置
- jniLibs.srcDirs = ['libs']
- }
-
- }
一般的项目结构我们不会改变,比如Java代码的位置,比如res资源的位置等等。但是在多渠道打包的情况下,可能就需要修改一些默认的配置,因为不同的包可能需要不同的文件夹中的东西,而且文件夹中的东西还会不一样。比如不同的渠道需要的assets文件夹中的json文件就不相同。
Gradle文件
- apply plugin: 'com.android.application'
-
- android {
-
- compileSdkVersion 28
- /** defaultConfig闭包 默认配置 */
- defaultConfig {
- applicationId "com.wjn.okhttpmvpdemo"
- minSdkVersion 19
- targetSdkVersion 27
- versionCode rootProject.ext.android.versionInt
- versionName rootProject.ext.android.versionString
- testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
- }
-
- /** signingConfigs闭包 项目签名配置 */
- signingConfigs {
- release {
- storeFile file('C:\\Users\\wujianning\\AndroidStudioProjects\\demo\\OKHttpMVPDemo\\test.jks')
- storePassword '123456'
- keyAlias 'key0'
- keyPassword '123456'
- v1SigningEnabled true
- v2SigningEnabled true
- }
-
- debug {
- storeFile file('C:\\Users\\wujianning\\AndroidStudioProjects\\demo\\OKHttpMVPDemo\\test.jks')
- storePassword '123456'
- keyAlias 'key0'
- keyPassword '123456'
- v1SigningEnabled true
- v2SigningEnabled true
- }
- }
-
- /** buildTypes闭包 项目打包配置 比如是否混淆 是否压缩 是否支持调式等等 这里为了区分下面多渠道打包Debug包和Release包 在versionName后添加了不同的后缀*/
- buildTypes {
- release {
- minifyEnabled false
- debuggable false
- multiDexEnabled false
- }
-
- debug {
- minifyEnabled false
- debuggable true
- multiDexEnabled false
- buildConfigField "String", "MAPID", "\"" + rootProject.ext.android.mapId + "\""
- }
- }
-
- /** productFlavors闭包 多渠道打包 flavorDimensions属性确定维度 分支&免费付费 */
- flavorDimensions "branch", "free_pay"
- productFlavors {
- red {
- dimension "branch"
- applicationIdSuffix ".red"
- versionNameSuffix '-red'
- signingConfig signingConfigs.release
- }
-
- blue {
- dimension "branch"
- applicationIdSuffix ".blue"
- versionNameSuffix '-blue'
- signingConfig signingConfigs.debug
- }
-
- free {
- dimension "free_pay"
- buildConfigField "boolean", "IS_FREE", "true"
- }
-
- pay {
- dimension "free_pay"
- buildConfigField "boolean", "IS_FREE", "false"
- }
- }
-
- /** variantFilter闭包 过滤变体 可以设置忽略那个包 比如这里过滤掉了不在列表中的包*/
- variantFilter { variant ->
- def needed = variant.name in [
- 'redFreeRelease',
- 'redFreeDebug',
- 'redPayRelease',
- 'redPayDebug',
- 'blueFreeRelease',
- 'blueFreeDebug',
- 'bluePayRelease',
- 'bluePayDebug',
- ]
- setIgnore(!needed)
- }
-
- /** compileOptions闭包 配置项目使用JDK1.8 */
- compileOptions {
- sourceCompatibility JavaVersion.VERSION_1_8
- targetCompatibility JavaVersion.VERSION_1_8
- }
-
- /** applicationVariants闭包 配置项目打包包名 */
- android.applicationVariants.all {
- variant ->
- variant.outputs.all {
- outputFileName = "OkHttp_" + "${defaultConfig.versionName}_${releaseTime()}" + "_${variant.productFlavors[0].name}.apk"
- }
- }
-
- /** sourceSets闭包 配置项目文件 */
- sourceSets {
-
- /** 默认 配置项目文件 */
- main {
- jniLibs.srcDirs = ['libs']
- assets.srcDirs = ['src/main/assets']
- }
-
- /** blue包 配置项目文件 */
- blue {
- assets.srcDirs = ['../protectFileConfig/assets/blue']
- }
-
- /** red包 配置项目文件 */
- red {
- assets.srcDirs = ['../protectFileConfig/assets/red']
- }
-
- }
-
- }
-
- static def releaseTime() {
- return new Date().format("yyyyMMdd", TimeZone.getTimeZone("GMT+8"))
- }
-
- dependencies {
- implementation fileTree(dir: 'libs', include: ['*.jar'])
- implementation 'com.android.support:appcompat-v7:28.0.0'
- implementation 'com.android.support.constraint:constraint-layout:1.1.3'
- implementation 'com.android.support:support-v4:27.1.1'
- testImplementation 'junit:junit:4.12'
- androidTestImplementation 'com.android.support.test:runner:1.0.2'
- androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
-
- implementation 'io.reactivex:rxjava:1.3.2'
- implementation 'io.reactivex:rxandroid:1.2.1'
- implementation 'com.squareup.okhttp3:okhttp:3.9.0'
- implementation 'com.squareup.okhttp3:logging-interceptor:3.6.0'
- implementation 'com.readystatesoftware.systembartint:systembartint:1.0.3'
-
- implementation 'com.squareup.retrofit2:retrofit:2.7.0'
- implementation 'com.github.bumptech.glide:glide:4.4.0'
- }
项目截图
Java代码
- public class MainActivity extends AppCompatActivity {
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
-
- String versionName = getVersionName();
- String result = "";
- if (versionName.contains("-blue")) {
- result = getJson("blueJson.json");
- } else if (versionName.contains("-red")) {
- result = getJson("redJson.json");
- }
-
- Log.d("MainActivity", "versionName----:" + versionName);
- Log.d("MainActivity", "result----:" + result);
- }
-
- /**
- * 获取当前程序版本号名
- * android:versionName="2.0"
- */
-
- private String getVersionName() {
- PackageManager pm = getPackageManager();
- try {
- PackageInfo info = pm.getPackageInfo(getPackageName(), 0);
- return info.versionName;
- } catch (Exception e) {
- // 不会发生的异常
- return "";
- }
- }
-
- private String getJson(String fileName) {
- StringBuilder stringBuilder = new StringBuilder();
- try {
- //获取assets资源管理器
- AssetManager assetManager = this.getAssets();
- //通过管理器打开文件并读取
- BufferedReader bf = new BufferedReader(new InputStreamReader(assetManager.open(fileName)));
- String line;
- while ((line = bf.readLine()) != null) {
- stringBuilder.append(line);
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- return stringBuilder.toString();
- }
- }
结果
OkHttp_2.0.2_20210519_blue.apk包
-
- D/MainActivity: versionName----:2.0.2-blue
-
- D/MainActivity: result----:{ "args": { "age": "1", "Type": "blueJson", "context": "我是blueJson的Json报文" }}
OkHttp_2.0.2_20210519_red.apk包
-
- D/MainActivity: versionName----:2.0.2-red
-
- D/MainActivity: result----:{ "args": { "age": "4", "Type": "redJson", "context": "我是redJson的Json报文" }}
附:官网
https://docs.gradle.org/current/userguide/userguide.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。