当前位置:   article > 正文

Android APP的Gradle详解(一)_donotstrip

donotstrip

本章节对APP的Gradle文件进行详解

 

 

一.signingConfigs{}闭包详解

 

1.位置

signingConfigs{}闭包 存在于 android{}闭包中。

 

 

2.作用

配置打包时的签名信息,比如签名文件,签名密码等等。

 

 

3.代码

 

AndroidStudio自动生成signingConfigs{}配置步骤

 

步骤1:AndroidStudio中选择Project Structure 如下图

 

 

步骤2:选中app,点击Singing添加 如下图

 

注意:这里可以点击 图中的 “+” 按钮 创建任意名称的signingConfigs 比如这里我们编辑的两个 一个取名release 一个取名debug。

 

 

步骤3:选择事先配置放好的签名文件以及密码等配置。如下图

 

 

步骤4:手动 添加V1 V2支持 类似下图操作

 

 

最终生成的代码

  1. android {
  2. signingConfigs {
  3. release {
  4. storeFile file('C:\\Users\\XXX\\AndroidStudioProjects\\demo\\OKHttpMVPDemo\\test.jks')
  5. storePassword '123456'
  6. keyAlias 'key0'
  7. keyPassword '123456'
  8. v1SigningEnabled true
  9. v2SigningEnabled true
  10. }
  11. debug {
  12. storeFile file('C:\\Users\\XXX\\AndroidStudioProjects\\demo\\OKHttpMVPDemo\\test.jks')
  13. storePassword '123456'
  14. keyAlias 'key0'
  15. keyPassword '123456'
  16. v1SigningEnabled true
  17. v2SigningEnabled true
  18. }
  19. }
  20. ...
  21. }


 

 

 

 

 

 

二.buildTypes{}闭包详解

 

1.位置

buildTypes{}闭包 存在于 android{}闭包中。

 

 

2.作用

配置打包时的各种信息,比如上述的签名信息,比如是否使用混淆等等。

 

 

3.代码

 

AndroidStudio自动生成buildTypes{}配置步骤

 

步骤1:AndroidStudio中选择Project Structure 如下图

 

 

步骤2: 左侧选择 Build Variants 中间选择 app 右侧选择 Build Types  如下图 

注意:上图右侧中 有两个选项 release和debug 这两个就是我们上述生成signingConfigs{}闭包时,编辑的名称,这两个名称可以随意。

 

然后上图右侧中的各个选项都填写完成 点击OK 生成代码

  1. android{
  2. buildTypes {
  3. release {
  4. minifyEnabled false
  5. applicationIdSuffix ''
  6. versionNameSuffix '-Release-'
  7. debuggable false
  8. jniDebuggable false
  9. renderscriptDebuggable false
  10. renderscriptOptimLevel 3
  11. signingConfig signingConfigs.release
  12. multiDexEnabled false
  13. }
  14. debug {
  15. minifyEnabled false
  16. applicationIdSuffix '.debug'
  17. versionNameSuffix '-Debug-'
  18. debuggable true
  19. jniDebuggable true
  20. renderscriptDebuggable false
  21. renderscriptOptimLevel 3
  22. signingConfig signingConfigs.debug
  23. multiDexEnabled false
  24. }
  25. }
  26. ...
  27. }

 

各个属性含义

  1. 1.minifyEnabled:表明是否对代码进行混淆,true表示对代码进行混淆,false表示对代码不进行混淆,默认的是false
  2. true时需要添加混淆文件的位置
  3. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  4. 2.proguardFiles:指定混淆的规则文件。这里指定了proguard-android.txt文件和proguard-rules.pro文件两个文件,proguard-android.txt文件为默认的混淆文件,里面定义了一些通用的混淆规则。proguard-rules.pro文件位于当前项目的根目录下,可以在该文件中定义一些项目特有的混淆规则。
  5. 3.applicationIdSuffix:配置不同的applicationId。不同的包/环境可能applicationId不一样。这里在debug包中在不同的applicationId中添加了一个后缀.debug。
  6. 4.versionNameSuffix:配置不同的versionName。和上述的applicationIdSuffix原理一样。这里在versionName "1.0"的基础上 release包加了-Release-后缀 debug包加了-Debug-后缀。
  7. 5.debuggable:是否支持断点调试。
  8. 6.jniDebuggable:是否可以调试NDK代码。使用不多。
  9. 7.renderscriptDebuggable:是否开启渲染脚本就是一些c写的渲染方法。使用不多。
  10. 8.renderscriptOptimLevel:渲染等级,默认是3。使用不多。
  11. 9.signingConfig:设置签名信息,通过signingConfigs.release或者signingConfigs.debug,配置相应的签名。配置此配置 需要先配置signingConfigs{}闭包。
  12. 10.multiDexEnabled:是否开启多个dex文件支持,一般用来解决打包时65536问题。

 

 

4.打包

打包方式一:AndroidStudio工具

 

打包方式二:命令行

  1. gradlew assembleDebug
  2. gradlew assembleRelease

 

两种方式打的包位置

 

包比较

 

 

 

 

 

 

 

 

三.lintOptions{}闭包

 

1.位置

lintOptions{}闭包 存在于 android{}闭包中。

 

 

2.作用

代码扫描分析,Lint 是Android Studio 提供的 代码扫描分析工具,它可以帮助我们发现代码结构/质量问题,同时提供一些解决方案。

 

 

3.代码

  1. android{
  2. lintOptions {
  3. //打Release包的时候进行检测
  4. checkReleaseBuilds false
  5. //即便是报错也不会停止打包
  6. abortOnError false
  7. }
  8. ...
  9. }

 

 

 

 

 

 

 

四.packagingOptions{}闭包

 

1.位置

packagingOptions{}闭包 存在于 android{}闭包中。

 

 

2.作用

打包时的一些其他配置项,packagingOptions常见的设置项有exclude、pickFirst、doNotStrip、merge。

 

 

3.代码

 

<1> exclude:过滤掉某些文件或者目录不添加到APK中,作用于APK,常用来解决多个jar包引入时的冲突。 比如Retrofit使用时。

  1. android{
  2. packagingOptions {
  3. //解决编译时com.android.builder.merge.DuplicateRelativeFileException: More than one file was found with OS independent path 'META-INF/rxjava.properties'这个错误
  4. exclude 'META-INF/rxjava.properties'
  5. }
  6. ...
  7. }

 

 

<2>  doNotStrip:可以设置某些动态库不被优化压缩。 比如so文件

  1. android{
  2. packagingOptions {
  3. doNotStrip "**/*.so"
  4. }
  5. ...
  6. }

 

 

<3> pickFirst:匹配到多个相同文件时,只使用第一个。只作用于APK,不能过滤aar和jar中的文件。比如

  1. android{
  2. packagingOptions {
  3. pickFirst "lib/armeabi/XXX.so"
  4. }
  5. ...
  6. }

 

 

<4> merge:将匹配的文件都添加到APK中,和pickFirst相反,会合并所有文件。

  1. android{
  2. packagingOptions {
  3. merge '**/name.txt'
  4. }
  5. ...
  6. }

 

 

 

 

 

 

五.sourceSets{}闭包

 

 

1.位置

sourceSets{}闭包 存在于 android{}闭包中。

 

 

2.作用

配置目录指向,通过修改SourceSets中的属性,可以指定需要被编译的源文件。比如jar包和so文件等等。

 

 

3.代码

SourceSets默认的目录结构是固定的Java标准项目目录布局结构

  1. android {
  2. sourceSets {
  3. main {
  4. //指定清单文件的位置
  5. manifest.srcFile 'AndroidManifest.xml'
  6. //指定Java代码的位置
  7. java.srcDirs = ['src']
  8. //指定aidl的位置
  9. aidl.srcDirs = ['src']
  10. //指定资源的位置
  11. res.srcDirs = ['res']
  12. //指定assets资源的位置
  13. assets.srcDirs = ['assets']
  14. //指定本地jar包和so文件的位置
  15. jniLibs.srcDirs = ['libs']
  16. }
  17. }

 

一般的项目结构我们不会改变,比如Java代码的位置,比如res资源的位置等等。但是在多渠道打包的情况下,可能就需要修改一些默认的配置,因为不同的包可能需要不同的文件夹中的东西,而且文件夹中的东西还会不一样。比如不同的渠道需要的assets文件夹中的json文件就不相同。

 

Gradle文件

  1. apply plugin: 'com.android.application'
  2. android {
  3. compileSdkVersion 28
  4. /** defaultConfig闭包 默认配置 */
  5. defaultConfig {
  6. applicationId "com.wjn.okhttpmvpdemo"
  7. minSdkVersion 19
  8. targetSdkVersion 27
  9. versionCode rootProject.ext.android.versionInt
  10. versionName rootProject.ext.android.versionString
  11. testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
  12. }
  13. /** signingConfigs闭包 项目签名配置 */
  14. signingConfigs {
  15. release {
  16. storeFile file('C:\\Users\\wujianning\\AndroidStudioProjects\\demo\\OKHttpMVPDemo\\test.jks')
  17. storePassword '123456'
  18. keyAlias 'key0'
  19. keyPassword '123456'
  20. v1SigningEnabled true
  21. v2SigningEnabled true
  22. }
  23. debug {
  24. storeFile file('C:\\Users\\wujianning\\AndroidStudioProjects\\demo\\OKHttpMVPDemo\\test.jks')
  25. storePassword '123456'
  26. keyAlias 'key0'
  27. keyPassword '123456'
  28. v1SigningEnabled true
  29. v2SigningEnabled true
  30. }
  31. }
  32. /** buildTypes闭包 项目打包配置 比如是否混淆 是否压缩 是否支持调式等等 这里为了区分下面多渠道打包Debug包和Release包 在versionName后添加了不同的后缀*/
  33. buildTypes {
  34. release {
  35. minifyEnabled false
  36. debuggable false
  37. multiDexEnabled false
  38. }
  39. debug {
  40. minifyEnabled false
  41. debuggable true
  42. multiDexEnabled false
  43. buildConfigField "String", "MAPID", "\"" + rootProject.ext.android.mapId + "\""
  44. }
  45. }
  46. /** productFlavors闭包 多渠道打包 flavorDimensions属性确定维度 分支&免费付费 */
  47. flavorDimensions "branch", "free_pay"
  48. productFlavors {
  49. red {
  50. dimension "branch"
  51. applicationIdSuffix ".red"
  52. versionNameSuffix '-red'
  53. signingConfig signingConfigs.release
  54. }
  55. blue {
  56. dimension "branch"
  57. applicationIdSuffix ".blue"
  58. versionNameSuffix '-blue'
  59. signingConfig signingConfigs.debug
  60. }
  61. free {
  62. dimension "free_pay"
  63. buildConfigField "boolean", "IS_FREE", "true"
  64. }
  65. pay {
  66. dimension "free_pay"
  67. buildConfigField "boolean", "IS_FREE", "false"
  68. }
  69. }
  70. /** variantFilter闭包 过滤变体 可以设置忽略那个包 比如这里过滤掉了不在列表中的包*/
  71. variantFilter { variant ->
  72. def needed = variant.name in [
  73. 'redFreeRelease',
  74. 'redFreeDebug',
  75. 'redPayRelease',
  76. 'redPayDebug',
  77. 'blueFreeRelease',
  78. 'blueFreeDebug',
  79. 'bluePayRelease',
  80. 'bluePayDebug',
  81. ]
  82. setIgnore(!needed)
  83. }
  84. /** compileOptions闭包 配置项目使用JDK1.8 */
  85. compileOptions {
  86. sourceCompatibility JavaVersion.VERSION_1_8
  87. targetCompatibility JavaVersion.VERSION_1_8
  88. }
  89. /** applicationVariants闭包 配置项目打包包名 */
  90. android.applicationVariants.all {
  91. variant ->
  92. variant.outputs.all {
  93. outputFileName = "OkHttp_" + "${defaultConfig.versionName}_${releaseTime()}" + "_${variant.productFlavors[0].name}.apk"
  94. }
  95. }
  96. /** sourceSets闭包 配置项目文件 */
  97. sourceSets {
  98. /** 默认 配置项目文件 */
  99. main {
  100. jniLibs.srcDirs = ['libs']
  101. assets.srcDirs = ['src/main/assets']
  102. }
  103. /** blue包 配置项目文件 */
  104. blue {
  105. assets.srcDirs = ['../protectFileConfig/assets/blue']
  106. }
  107. /** red包 配置项目文件 */
  108. red {
  109. assets.srcDirs = ['../protectFileConfig/assets/red']
  110. }
  111. }
  112. }
  113. static def releaseTime() {
  114. return new Date().format("yyyyMMdd", TimeZone.getTimeZone("GMT+8"))
  115. }
  116. dependencies {
  117. implementation fileTree(dir: 'libs', include: ['*.jar'])
  118. implementation 'com.android.support:appcompat-v7:28.0.0'
  119. implementation 'com.android.support.constraint:constraint-layout:1.1.3'
  120. implementation 'com.android.support:support-v4:27.1.1'
  121. testImplementation 'junit:junit:4.12'
  122. androidTestImplementation 'com.android.support.test:runner:1.0.2'
  123. androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
  124. implementation 'io.reactivex:rxjava:1.3.2'
  125. implementation 'io.reactivex:rxandroid:1.2.1'
  126. implementation 'com.squareup.okhttp3:okhttp:3.9.0'
  127. implementation 'com.squareup.okhttp3:logging-interceptor:3.6.0'
  128. implementation 'com.readystatesoftware.systembartint:systembartint:1.0.3'
  129. implementation 'com.squareup.retrofit2:retrofit:2.7.0'
  130. implementation 'com.github.bumptech.glide:glide:4.4.0'
  131. }

 

项目截图

 

Java代码

  1. public class MainActivity extends AppCompatActivity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.activity_main);
  6. String versionName = getVersionName();
  7. String result = "";
  8. if (versionName.contains("-blue")) {
  9. result = getJson("blueJson.json");
  10. } else if (versionName.contains("-red")) {
  11. result = getJson("redJson.json");
  12. }
  13. Log.d("MainActivity", "versionName----:" + versionName);
  14. Log.d("MainActivity", "result----:" + result);
  15. }
  16. /**
  17. * 获取当前程序版本号名
  18. * android:versionName="2.0"
  19. */
  20. private String getVersionName() {
  21. PackageManager pm = getPackageManager();
  22. try {
  23. PackageInfo info = pm.getPackageInfo(getPackageName(), 0);
  24. return info.versionName;
  25. } catch (Exception e) {
  26. // 不会发生的异常
  27. return "";
  28. }
  29. }
  30. private String getJson(String fileName) {
  31. StringBuilder stringBuilder = new StringBuilder();
  32. try {
  33. //获取assets资源管理器
  34. AssetManager assetManager = this.getAssets();
  35. //通过管理器打开文件并读取
  36. BufferedReader bf = new BufferedReader(new InputStreamReader(assetManager.open(fileName)));
  37. String line;
  38. while ((line = bf.readLine()) != null) {
  39. stringBuilder.append(line);
  40. }
  41. } catch (IOException e) {
  42. e.printStackTrace();
  43. }
  44. return stringBuilder.toString();
  45. }
  46. }

 

结果

OkHttp_2.0.2_20210519_blue.apk包

  1. D/MainActivity: versionName----:2.0.2-blue
  2. D/MainActivity: result----:{ "args": { "age": "1", "Type": "blueJson", "context": "我是blueJson的Json报文" }}

 

OkHttp_2.0.2_20210519_red.apk包

  1. D/MainActivity: versionName----:2.0.2-red
  2. D/MainActivity: result----:{ "args": { "age": "4", "Type": "redJson", "context": "我是redJson的Json报文" }}

 

 

附:官网

https://docs.gradle.org/current/userguide/userguide.html

 

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/244450?site
推荐阅读
相关标签
  

闽ICP备14008679号