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,如需转载请自行联系原作者

目录
相关文章
|
20天前
|
编译器 API Android开发
Android经典实战之Kotlin Multiplatform 中,如何处理不同平台的 API 调用
本文介绍Kotlin Multiplatform (KMP) 中使用 `expect` 和 `actual` 关键字处理多平台API调用的方法。通过共通代码集定义预期API,各平台提供具体实现,编译器确保正确匹配,支持依赖注入、枚举类处理等,实现跨平台代码重用与原生性能。附带示例展示如何定义跨平台函数与类。
48 0
|
4天前
|
Web App开发 网络协议 Android开发
Android平台一对一音视频通话方案大比拼:WebRTC VS RTMP VS RTSP,谁才是王者?
【9月更文挑战第4天】本文详细对比了在Android平台上实现一对一音视频通话时常用的WebRTC、RTMP及RTSP三种技术方案。从技术原理、性能表现与开发难度等方面进行了深入分析,并提供了示例代码。WebRTC适合追求低延迟和高质量的场景,但开发成本较高;RTMP和RTSP则在简化开发流程的同时仍能保持较好的传输效果,适用于不同需求的应用场景。
15 1
|
10天前
|
存储 安全 API
Android经典实战之存储方案对比:SharedPreferences vs MMKV vs DataStore
本文介绍了 Android 开发中常用的键值对存储方案,包括 SharedPreferences、MMKV 和 DataStore,并对比了它们在性能、并发处理、易用性和稳定性上的特点。通过实际代码示例,帮助开发者根据项目需求选择最适合的存储方案,提升应用性能和用户体验。
30 1
|
10天前
|
Android开发
Android Studio: 解决Gradle sync failed 错误
本文介绍了解决Android Studio中出现的Gradle同步失败错误的步骤,包括从`gradle-wrapper.properties`文件中获取Gradle的下载链接,手动下载Gradle压缩包,并替换默认下载路径中的临时文件,然后重新触发Android Studio的"Try Again"来完成同步。
178 0
Android Studio: 解决Gradle sync failed 错误
|
18天前
|
Android开发 C++ 开发者
Android经典实战之跨平台开发方案:Kotlin Multiplatform vs Flutter
本文对比了Kotlin Multiplatform与Flutter两大跨平台开发框架,从技术特性、性能、开发效率、UI体验、可扩展性及适用场景等维度进行了详尽分析,帮助开发者根据项目需求和技术背景选择最优方案。
34 2
|
26天前
|
Java 开发工具 Maven
Flutter和Android中覆盖gradle中的repositories仓库地址
Flutter和Android中覆盖gradle中的repositories仓库地址
74 4
|
10天前
|
Java 开发工具 Android开发
Android Studio利用Build.gradle导入Git commit ID、Git Branch、User等版本信息
本文介绍了在Android Studio项目中通过修改`build.gradle`脚本来自动获取并添加Git的commit ID、branch名称和用户信息到BuildConfig类中,从而实现在编译时将这些版本信息加入到APK中的方法。
19 0
|
19天前
|
IDE API 开发工具
与Android Gradle Plugin对应的Gradle版本和Android Studio版本
与Android Gradle Plugin对应的Gradle版本和Android Studio版本
122 0
|
23天前
|
开发框架 .NET API
分享一个 ASP.NET Web Api 上传和读取 Excel的方案
分享一个 ASP.NET Web Api 上传和读取 Excel的方案
|
25天前
|
Web App开发 网络协议 Android开发
### 惊天对决!Android平台一对一音视频通话方案大比拼:WebRTC VS RTMP VS RTSP,谁才是王者?
【8月更文挑战第14天】随着移动互联网的发展,实时音视频通信已成为移动应用的关键部分。本文对比分析了Android平台上WebRTC、RTMP与RTSP三种主流技术方案。WebRTC提供端到端加密与直接数据传输,适于高质量低延迟通信;RTMP适用于直播场景,但需服务器中转;RTSP支持实时流播放,但在复杂网络下稳定性不及WebRTC。三种方案各有优劣,WebRTC功能强大但集成复杂,RTMP和RTSP实现较简单但需额外编码支持。本文还提供了示例代码以帮助开发者更好地理解和应用这些技术。
81 0
下一篇
DDNS