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

目录
相关文章
|
7月前
|
数据采集 监控 API
告别手动埋点!Android 无侵入式数据采集方案深度解析
传统的Android应用监控方案需要开发者在代码中手动添加埋点,不仅侵入性强、工作量大,还难以维护。本文深入探讨了基于字节码插桩技术的无侵入式数据采集方案,通过Gradle插件 + AGP API + ASM的技术组合,实现对应用性能、用户行为、网络请求等全方位监控,真正做到零侵入、易集成、高稳定。
874 91
|
9月前
|
Android开发
复杂项目即时通讯从android 5升级android x后遗症之解决报错#79 java.io.EOFException Unexpected end of ZLIB input stream-优雅草卓伊凡|bigniu
复杂项目即时通讯从android 5升级android x后遗症之解决报错#79 java.io.EOFException Unexpected end of ZLIB input stream-优雅草卓伊凡|bigniu
555 4
复杂项目即时通讯从android 5升级android x后遗症之解决报错#79 java.io.EOFException Unexpected end of ZLIB input stream-优雅草卓伊凡|bigniu
|
人工智能 安全 API
Higress MCP Server 安全再升级:API 认证为 AI 连接保驾护航
Higress MCP Server 新增了 API 认证功能,为 AI 连接提供安全保障。主要更新包括:1) 客户端到 MCP Server 的认证,支持 Key Auth、JWT Auth 和 OAuth2;2) MCP Server 到后端 API 的认证,增强第二阶段的安全性。新增功能如可重用认证方案、工具特定后端认证、透明凭证透传及灵活凭证管理,确保安全集成更多后端服务。通过 openapi-to-mcp 工具简化配置,减少手动工作量。企业版提供更高可用性保障,详情参见文档链接。
1650 42
|
10月前
|
人工智能 供应链 安全
AI驱动攻防升级,API安全走到关键档口
在AI与数字化转型加速背景下,API已成为企业连接内外业务的核心枢纽,但其面临的安全威胁也日益严峻。瑞数信息发布的《API安全趋势报告》指出,2024年API攻击流量同比增长162%,占所有网络攻击的78%。攻击呈现规模化、智能化、链式扩散等新特征,传统防护手段已难应对。报告建议企业构建覆盖API全生命周期的安全体系,强化资产梳理、访问控制、LLM防护、供应链管控等七大能力,提升动态防御水平,保障AI时代下的业务安全与稳定。
352 0
|
8月前
|
缓存 Unix Android开发
Android安卓项目调试之Gradle 与 Gradle Wrapper的概念以及常用gradle命令深度详解-优雅草卓伊凡
Android安卓项目调试之Gradle 与 Gradle Wrapper的概念以及常用gradle命令深度详解-优雅草卓伊凡
998 8
|
8月前
|
存储 API Android开发
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
839 4
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
|
9月前
|
Java Android开发 C++
复杂项目即时通讯从android 5升级android x后遗症之解决报错#1057 SIGABRT #00 pc 0000000000073898-优雅草卓伊凡|bigniu
复杂项目即时通讯从android 5升级android x后遗症之解决报错#1057 SIGABRT #00 pc 0000000000073898-优雅草卓伊凡|bigniu
355 2
 复杂项目即时通讯从android 5升级android x后遗症之解决报错#1057 SIGABRT #00 pc 0000000000073898-优雅草卓伊凡|bigniu
|
8月前
|
Java 开发工具 Maven
【01】完整的安卓二次商业实战-详细的初级步骤同步项目和gradle配置以及开发思路-优雅草伊凡
【01】完整的安卓二次商业实战-详细的初级步骤同步项目和gradle配置以及开发思路-优雅草伊凡
1143 6
|
Android开发 Windows
Android studio 报错Connect to 127.0.0.1:8888 [/127.0.0.1] failed: Connection refused: connect(已解决)
这是一篇关于解决Android Studio报错“Connect to 127.0.0.1:8888 failed: Connection refused”的文章。问题通常因系统代理设置被Android Studio自动保存导致。解决方法是找到系统中Android Studio使用的gradle.properties文件(位于Windows的C:\Users\你的电脑用户名\.gradle或Mac的/Users/.{你的用户目录}/.gradle),删除或注释掉多余的代理配置后保存并重新Sync项目。希望此经验能帮助快速解决同类问题!
2413 36
|
9月前
|
Java 开发工具 Android开发
复杂项目即时通讯从android 5升级android x后遗症之解决#209 java.lang.IndexOutOfBoundsException.解决-优雅草卓伊凡
复杂项目即时通讯从android 5升级android x后遗症之解决#209 java.lang.IndexOutOfBoundsException.解决-优雅草卓伊凡
215 0

热门文章

最新文章

推荐镜像

更多