Android Studio 第五十五期 - Studio3.0升级到gradle3.0.0后API失效方案

简介:

    刚刚升级了正式版的Android Studio3.0部分API不能用了,但是官网还是给出了解决方案,不过很模糊,需要自己琢磨,今天带大家一起看看。

    首先gradle3.0之前的多版本打版方法:(可以看出挺费劲的~)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
apply plugin:  'com.android.application'
apply plugin:  'android-apt'
 
def demo1 =  '0001' ; //DemoAPK1
def demo2 =  '0002' ; //DemoAPK2
 
android {
 
//    signingConfigs {
//        debug {
//            keyAlias '****'
//            keyPassword '****'
//            storeFile file('签名文件.jks路径')
//            storePassword '****'
//        }
//        release {
//            keyAlias '****'
//            keyPassword '****'
//            storeFile file('签名文件.jks路径')
//            storePassword '****'
//        }
//    }
 
     compileSdkVersion  25
     buildToolsVersion  "25.0.2"
     sourceSets {
         main {
             jniLibs.srcDirs = [ 'libs' ]
         }
     }
 
     packagingOptions {
         exclude  'META-INF/DEPENDENCIES'
         exclude  'META-INF/NOTICE'
         exclude  'META-INF/LICENSE'
         exclude  'META-INF/LICENSE.txt'
         exclude  'META-INF/NOTICE.txt'
     }
 
     defaultConfig {
         applicationId  "com.example.p031_mokuaihua_viewpager_fragment"
         minSdkVersion  21
         targetSdkVersion  25
         versionCode  1
         versionName  "1.0"
 
         multiDexEnabled  true
         renderscriptTargetApi  21
         renderscriptSupportModeEnabled  true
         ndk {
             moduleName  "native-modbus-jni,libxmediaplayer"
             ldLibs  "log" "z" "m" "android" "c"
             abiFilters  "armeabi" "armeabi-v7a" "x86"
         }
         sourceSets.main {
             jni.srcDirs = []
             //LOCAL_LDFLAGS += -fuse-ld=bfd
             //jni.srcDirs 'src/main/jni'
             jniLibs.srcDir  'src/main/libs'
 
         }
         signingConfig signingConfigs.debug
 
         manifestPlaceholders = [
                 DEMO3_CONFIG_VALUE:  ".demo3.factorys.Demo3Factory" ,
                 DEMO4_CONFIG_VALUE:  ".demo4.factorys.Demo4Factory"
         ]
 
     }
     buildTypes {
         release {
             minifyEnabled  true
             zipAlignEnabled  true
             shrinkResources  false
             proguardFiles getDefaultProguardFile( 'proguard-android.txt' ),  'proguard-rules.pro'
             signingConfig signingConfigs.debug
         }
     }
 
     def  int  minSdk =  21 ;
     def  int  targetSdk =  25 ;
     def String appId =  'com.example.p031_mokuaihua_viewpager_fragment' ;
 
     def  int  vCode =  1 ;
     def String vNameCode = vCode +  "" ;
     productFlavors {
         //demo1 DemoAPK1_T_1_0001 线上
         DemoAPK1 {
             minSdkVersion minSdk
             applicationId appId
             targetSdkVersion targetSdk
             versionCode vCode
             versionName  "DemoAPK1_"  "T_"  + vNameCode +  "_"  + demo1
             multiDexEnabled  true
             renderscriptTargetApi  21
             renderscriptSupportModeEnabled  true
             ndk {
                 moduleName  "native-modbus-jni,libxmediaplayer"
                 ldLibs  "log" "z" "m" "android" "c"
                 abiFilters  "armeabi" "armeabi-v7a" "x86"
             }
             sourceSets.main {
                 jni.srcDirs = []
                 jniLibs.srcDir  'src/main/libs'
             }
             signingConfig signingConfigs.debug
         }
         //demo2   DemoAPK2_D_1_0002 线上
         DemoAPK2 {
             minSdkVersion minSdk
             applicationId appId
             targetSdkVersion targetSdk
             versionCode vCode
             versionName  "DemoAPK2_"  "D_"  + vNameCode +  "_"  + demo2
             multiDexEnabled  true
             renderscriptTargetApi  21
             renderscriptSupportModeEnabled  true
             ndk {
                 moduleName  "native-modbus-jni,libxmediaplayer"
                 ldLibs  "log" "z" "m" "android" "c"
                 abiFilters  "armeabi" "armeabi-v7a" "x86"
             }
             sourceSets.main {
                 jni.srcDirs = []
                 jniLibs.srcDir  'src/main/libs'
             }
             signingConfig signingConfigs.debug
         }
     }
 
     // 自定义输出配置
     applicationVariants.all { variant ->
         variant.outputs.each { output ->
             def outputFile = output.outputFile
             if  (outputFile !=  null  && outputFile.name.endsWith( '.apk' )) {
//                def fileName = "UerbT_v${variant.versionName}_${releaseTime()}_${variant.flavorName}.apk"
                 def fileName =  "${variant.versionName}.apk"
                 output.outputFile =  new  File(outputFile.parent, fileName)
             }
         }
     }
 
     productFlavors.all { flavor ->
         def currentMode = flavor.versionName.split( "_" )[ 3 ]
         def currentEnvironment = flavor.versionName.split( "_" )[ 1 ]
         def stValue =  true
         // t == currentEnvironment 以前的判断条件
         if  (currentEnvironment.endsWith( "T" )) { //判断是否为测试版 是否以T结尾
             stValue =  false
         else  {
             stValue =  true
         }
         if  (currentMode == demo1) {
             flavor.manifestPlaceholders = [DEMO2_CONFIG_VALUE:  ".demo2.factorys.Demo2Factory1" , STATISTICS_VALUE: stValue]
         else  if  (currentMode == demo2) {
             flavor.manifestPlaceholders = [DEMO2_CONFIG_VALUE:  ".demo2.factorys.Demo2Factory2" , STATISTICS_VALUE: stValue]
         }
     }
}
 
dependencies {
     compile fileTree(dir:  'libs' , include: [ '*.jar' ])
     androidTestCompile( 'com.android.support.test.espresso:espresso-core:2.2.2' , {
         exclude group:  'com.android.support' , module:  'support-annotations'
     })
     compile  'com.android.support:appcompat-v7:25.3.1'
     compile  'com.android.support:recyclerview-v7:25.3.1'
     compile  'com.android.support:design:25.3.1'
     compile  'com.android.support:cardview-v7:25.3.1'
     compile  'com.android.support.constraint:constraint-layout:1.0.0-alpha7'
 
     //the third file
     compile  'com.jakewharton:butterknife:8.2.1'
     apt  'com.jakewharton:butterknife-compiler:8.2.1'
     compile  'com.android.support:multidex:1.0.1'
 
}

    这里说一下:gradle3.0后apt就废除了,现在都是这样的方法:

1
2
compile  'com.jakewharton:butterknife:8.8.1'
annotationProcessor  'com.jakewharton:butterknife-compiler:8.8.1'

    再来看看gradle3.0后是什么样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
apply plugin:  'com.android.application'
 
def demo1 =  '0001' ; //DemoAPK1
def demo2 =  '0002' ; //DemoAPK2
 
android {
 
//    signingConfigs {
//        debug {
//            keyAlias '****'
//            keyPassword '****'
//            storeFile file('签名文件.jks路径')
//            storePassword '****'
//        }
//        release {
//            keyAlias '****'
//            keyPassword '****'
//            storeFile file('签名文件.jks路径')
//            storePassword '****'
//        }
//    }
 
     compileSdkVersion  25
     buildToolsVersion  '26.0.2'
     sourceSets {
         main {
             jniLibs.srcDirs = [ 'libs' ]
         }
     }
 
     packagingOptions {
         exclude  'META-INF/DEPENDENCIES'
         exclude  'META-INF/NOTICE'
         exclude  'META-INF/LICENSE'
         exclude  'META-INF/LICENSE.txt'
         exclude  'META-INF/NOTICE.txt'
     }
 
     defaultConfig {
         applicationId  "com.example.p031_mokuaihua_viewpager_fragment"
         minSdkVersion  21
         targetSdkVersion  25
         versionCode  1
         versionName  "1.0"
 
         multiDexEnabled  true
         renderscriptTargetApi  21
         renderscriptSupportModeEnabled  true
 
         javaCompileOptions {
             annotationProcessorOptions {
                 includeCompileClasspath  true
             }
         }
 
         ndk {
             moduleName  "native-modbus-jni,libxmediaplayer"
             ldLibs  "log" "z" "m" "android" "c"
             abiFilters  "armeabi" "armeabi-v7a" "x86"
         }
         sourceSets.main {
             jni.srcDirs = []
             //LOCAL_LDFLAGS += -fuse-ld=bfd
             //jni.srcDirs 'src/main/jni'
             jniLibs.srcDir  'src/main/libs'
 
         }
         signingConfig signingConfigs.debug
 
         manifestPlaceholders = [
                 DEMO3_CONFIG_VALUE:  ".demo3.factorys.Demo3Factory" ,
                 DEMO4_CONFIG_VALUE:  ".demo4.factorys.Demo4Factory"
         ]
 
     }
     buildTypes {
         release {
             minifyEnabled  true
             zipAlignEnabled  true
             shrinkResources  false
             proguardFiles getDefaultProguardFile( 'proguard-android.txt' ),  'proguard-rules.pro'
             signingConfig signingConfigs.debug
         }
     }
 
     def  int  minSdk =  21 ;
     def  int  targetSdk =  25 ;
     def String appId =  'com.example.p031_mokuaihua_viewpager_fragment' ;
 
     def  int  vCode =  1 ;
     def String vNameCode = vCode +  "" ;
 
     // 自定义输出配置 classpath 'com.android.tools.build:gradle:3.0.0'
     android.applicationVariants.all { variant ->
         variant.outputs.all {
//            outputFileName = "${variant.name}-${variant.versionName}.apk"
             outputFileName =  "${variant.versionName}.apk"
         }
     }
 
     // Specifies two flavor dimensions.
     flavorDimensions  "keep" "change1"
     productFlavors {
         demo {
             dimension  "keep"
             minSdkVersion minSdk
             applicationId appId
             targetSdkVersion targetSdk
             versionCode vCode
             multiDexEnabled  true
             renderscriptTargetApi  21
             renderscriptSupportModeEnabled  true
             ndk {
                 moduleName  "native-modbus-jni,libxmediaplayer"
                 ldLibs  "log" "z" "m" "android" "c"
                 abiFilters  "armeabi" "armeabi-v7a" "x86"
             }
             sourceSets.main {
                 jni.srcDirs = []
                 jniLibs.srcDir  'src/main/libs'
             }
             signingConfig signingConfigs.debug
         }
         apk1 {
             dimension  "change1"
             versionName  "DemoAPK1_"  "T_"  + vNameCode +  "_"  + demo1
             def stValue =  false
             manifestPlaceholders = [DEMO2_CONFIG_VALUE:  ".demo2.factorys.Demo2Factory1" , STATISTICS_VALUE: stValue]
         }
         apk2 {
             dimension  "change1"
             versionName  "DemoAPK2_"  "D_"  + vNameCode +  "_"  + demo2
             def stValue =  true
             manifestPlaceholders = [DEMO2_CONFIG_VALUE:  ".demo2.factorys.Demo2Factory2" , STATISTICS_VALUE: stValue]
         }
     }
}
 
dependencies {
     compile fileTree(dir:  'libs' , include: [ '*.jar' ])
     androidTestCompile( 'com.android.support.test.espresso:espresso-core:2.2.2' , {
         exclude group:  'com.android.support' , module:  'support-annotations'
     })
     compile  'com.android.support:appcompat-v7:25.3.1'
     compile  'com.android.support:recyclerview-v7:25.3.1'
     compile  'com.android.support:design:25.3.1'
     compile  'com.android.support:cardview-v7:25.3.1'
     compile  'com.android.support.constraint:constraint-layout:1.0.0-alpha7'
 
     //the third file
     annotationProcessor   'com.jakewharton:butterknife-compiler:8.6.0'
     compile  'com.jakewharton:butterknife:8.6.0'
 
     compile  'com.android.support:multidex:1.0.1'
 
}

    是不是简单很多,Google真是越来越叼~

    打版后代码效果图:

    7570ce0b6bb9da081fd7834dd2546d50.png

    官网方案地址:https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html?utm_source=android-studio#variant_aware

    本代码git地址:

https://github.com/geeklx/MyApplication/tree/master/p031_mokuaihua_viewpager_fragment

    附图:

    a1ee3bfbd02fd43246c50b9323496cad.jpg









本文转自 吴雨声 51CTO博客,原文链接:http://blog.51cto.com/liangxiao/1976767,如需转载请自行联系原作者

目录
相关文章
|
9天前
|
API Python
飞桨x昇腾生态适配方案:13_API离线推理
ais_bench 提供了基于昇腾硬件的 Python API,用于离线模型(.om模型)推理。支持静态与动态API场景,如单个或多个OM模型推理。通过 `InferSession` 类加载模型并执行推理,可灵活处理输入输出形状转换。示例代码涵盖图片读取、形状调整、多模型串联推理及资源释放等操作,满足多样化推理需求。
64 26
|
24天前
|
数据采集 JSON 网络安全
移动端数据抓取:Android App的TLS流量解密方案
本文介绍了一种通过TLS流量解密技术抓取知乎App热榜数据的方法。利用Charles Proxy解密HTTPS流量,分析App与服务器通信内容;结合Python Requests库模拟请求,配置特定请求头以绕过反爬机制。同时使用代理IP隐藏真实IP地址,确保抓取稳定。最终成功提取热榜标题、内容简介、链接等信息,为分析热点话题和用户趋势提供数据支持。此方法也可应用于其他Android App的数据采集,但需注意选择可靠的代理服务。
80 11
移动端数据抓取:Android App的TLS流量解密方案
|
3月前
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
243 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
3月前
|
缓存 Java 测试技术
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
337 3
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
|
7月前
|
Android开发
Android基于gradle task检查各个module之间资源文件冲突情况
Android基于gradle task检查各个module之间资源文件冲突情况
Android基于gradle task检查各个module之间资源文件冲突情况
|
3月前
|
机器学习/深度学习 人工智能 自然语言处理
企业级API集成方案:基于阿里云函数计算调用DeepSeek全解析
DeepSeek R1 是一款先进的大规模深度学习模型,专为自然语言处理等复杂任务设计。它具备高效的架构、强大的泛化能力和优化的参数管理,适用于文本生成、智能问答、代码生成和数据分析等领域。阿里云平台提供了高性能计算资源、合规与数据安全、低延迟覆盖和成本效益等优势,支持用户便捷部署和调用 DeepSeek R1 模型,确保快速响应和稳定服务。通过阿里云百炼模型服务,用户可以轻松体验满血版 DeepSeek R1,并享受免费试用和灵活的API调用方式。
297 12
|
8月前
|
Cloud Native 关系型数据库 Serverless
基于阿里云函数计算(FC)x 云原生 API 网关构建生产级别 LLM Chat 应用方案最佳实践
本文带大家了解一下如何使用阿里云Serverless计算产品函数计算构建生产级别的LLM Chat应用。该最佳实践会指导大家基于开源WebChat组件LobeChat和阿里云函数计算(FC)构建企业生产级别LLM Chat应用。实现同一个WebChat中既可以支持自定义的Agent,也支持基于Ollama部署的开源模型场景。
1341 48
|
7月前
|
Android开发
Android gradle task任务检查各个module之间资源文件冲突.md
Android gradle task任务检查各个module之间资源文件冲突.md
Android gradle task任务检查各个module之间资源文件冲突.md
|
7月前
|
Java Android开发 Windows
玩转安卓之配置gradle-8.2.1
为安卓开发配置Gradle 8.2.1,包括下载和解压Gradle、配置环境变量、修改配置文件以增加国内镜像,以及在Android Studio中配置Gradle和JDK的过程。
340 0
玩转安卓之配置gradle-8.2.1
|
8月前
|
开发框架 Dart 前端开发
Android 跨平台方案对比之Flutter 和 React Native
本文对比了 Flutter 和 React Native 这两个跨平台移动应用开发框架。Flutter 使用 Dart 语言,提供接近原生的性能和丰富的组件库;React Native 则基于 JavaScript,具备庞大的社区支持和灵活性。两者各有优势,选择时需考虑团队技能和项目需求。
602 8