开发者社区> 余二五> 正文

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Android源码剖析之Framework层升级版(窗口、系统启动)
 本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 看本篇文章之前,建议先查看: Android源码剖析之Framework层基础版 前面讲了framework的整体层次和基础定义与服务,接下来我们讲讲窗口的创建,底层与应用层界面的交互和管理。
1121 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
19593 0
【百度地图API】今日小年大进步,齐头共进贺佳节——API优化升级上线,不再增加内存消耗
原文:【百度地图API】今日小年大进步,齐头共进贺佳节——API优化升级上线,不再增加内存消耗   任务描述:   今天是2011年01月26日,小年夜。百度地图API在小年夜献给广大API爱好者一份给力的礼物!那就是,百度地图API内存消耗优化升级了!   此次API优化升级后,内存消耗保持平稳,绝大部分测试中,内存消耗趋于一条直线。
908 0
datapump跨平台升级迁移的对比测试和优化
    目前计划对跨平台的数据库环境进行迁移,一来降低运维成本,二来更加可控。其实对于很多机器来说,如果机器跑了很多年,一直没有重启过,那么时间长了,一个直观的感受就是稳定,这也是小机口碑远远好于PC的一个重要原因吧,但是如果机器有一天出了问题,那么可能就会让大家坐立不安。
807 0
datapump跨平台升级迁移的总结
最近测试了使用datapump来迁移百G数据的场景,因为实际需要,需要把Unix下10gR2的库迁移到Linux下11gR2,所以这个过程相对来说牵制也较多。考虑了多种方案,最后权衡后决定使用datapump来迁移。
849 0
阿里云新品发布会周刊第108期 丨 阿里云混合云 Apsara Stack 重磅升级
新产品、新版本、新技术、新功能、价格调整,评论在下方,下期更新!关注更多新品发布会!
196 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
17904 0
+关注
20381
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载