Android 3.0及以上刨坑集锦

前言

本来想多挖点坑总结再分享出来的,但最近的坑折磨的我够呛,想提前分享出来帮助其它受难的小伙伴,哎,不说了。。。

持续刨坑中...

1.配置ButterKnife

只需设置如下代码即可:

    implementation 'com.jakewharton:butterknife:8.8.1'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'

在module的build.gradle 文件中设置支持插件 ,添加如下代码

apply plugin: 'com.jakewharton.butterknife'  

否则无法使用R.id.R2

2.组件化项目升级3.0以上后报错

Could not find runtime.aar (android.arch.lifecycle:runtime:1.0.0).
Searched in the following locations:
https://jcenter.bintray.com/android/arch/lifecycle/runtime/1.0.0/runtime-1.0.0.aar

    // 组件化Architecture Components
    compile "android.arch.lifecycle:runtime:1.1.1"
    compile "android.arch.lifecycle:extensions:1.1.1"
    annotationProcessor "android.arch.lifecycle:compiler:1.1.1"

3.依赖方式改变

implementation、api、compileOnly等

https://blog.csdn.net/yuzhiqiang_1993/article/details/78366985?locationNum=6&fps=1

4.打开一个3.0的GitHub项目报错(使用的是3.0以下AS)

QError:This Gradle plugin requires a newer IDE able to request IDE model level 3. For Android Studio this means version 3.0+
A
(1): 升级android studio IDE的版本。
(2):在项目的gradle.properties配置文件中加入以下这句:
gradle.properties中:android.injected.build.model.only.versioned = 3

5.Gradle自定义apk名称报错

  • 在AS 3.0之前自定义apk名称:
    variant.outputs.each { output ->
    def fileName = "${variant.versionName}_release.apk"
    def outFile = output.outputFile
    if (outFile != null && outFile.name.endsWith('.apk')) {
        output.outputFile =newFile(outFile.parent, fileName)
    }  
}

但是在AS 3.0之后,同样代码自定义apk名称却会报错:

Error:(56, 0) Cannot set the value of read-only property 'outputFile' for ApkVariantOutputImpl_Decorated{apkData=Main{type=MAIN, fullName=debug, filters=[]}} of type com.android.build.gradle.internal.api.ApkVariantOutputImpl.

由于3.0中outputFile变为只读,不能修改输出的名称所以报错。
解决方式:

applicationVariants.all { variant ->
    variant.outputs.all { output ->  // each 改为 all
    def fileName = "${variant.versionName}_release.apk"
    def outFile = output.outputFile
    if (outFile != null && outFile.name.endsWith('.apk')) {
        outputFileName = fileName  //  output.outputFile 改为 outputFileName 
    }    
}

each修改为all,然后通过outputFileName修改生成apk的名称。此外,AS 3.0后打包完,除了apk包文件,还会多一个output.json参数文件。

6.AS3.0多渠道打包报错

Error:All flavors must now belong to a named flavor dimension. The flavor 'xiaomi' is not assigned to a flavor dimension. Learn more at https://d.android.com/r/tools/flavorDimensions-missing-error-message.html

解决方法:

flavorDimensions "default"  
    productFlavors {  
        kuan {  
            dimension "default"  
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "kuan"]  
        }  
        xiaomi {  
            dimension "default"  
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]  
        }  
        qh360 {  
            dimension "default"  
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "qh360"]  
        }  
        baidu {  
            dimension "default"  
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]  
        }  
        wandoujia {  
            dimension "default"  
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]  
        }  
    }  

或者写成:

flavorDimensions "default"  
    productFlavors {  
        kuan {dimension "default"}  
        xiaomi {dimension "default"}  
        qh360 {dimension "default"}  
        baidu {dimension "default"}  
        wandoujia {dimension "default"}  
    }  
  
    productFlavors.all {  
        flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]  
    }  

7.第三方库导致support版本冲突

一般这种问题解决方法是:在指定的有冲突的库的依赖处,添加exclude group: 'com.android.support',可以将冲突库不包含在编译,如:

compile('xx.xxx.xxxxx:xxxxx:1.5.5') {
    exclude group: 'com.android.support'
}

但是问题是我不知道哪个第三方库冲突,不可能一个个检查吧?

这时候只需要在gradle文件中添加如下代码,让所有的第三方包强制使用指定版本的support包:

configurations.all {
    resolutionStrategy.eachDependency { DependencyResolveDetails details ->
        def requested = details.requested
        if (requested.group == 'com.android.support') {
            if (!requested.name.startsWith("multidex")) {
                details.useVersion '26.1.0'
            }
        }
    }
} 

同时,需要注意的是,在自己写第三方库给别人用的时候,对于support包的依赖方式改成provided(或者compileOnly,gradle3.0),这样不会把support打包,方便其他人使用。

8.组件化项目报错 Manifest merger failed

这个错误是我手贱升级AS3.1.2后,报出来的


崩溃啊

什么玩意

上网搜索好几个夜晚。。。没有找到解决方法,直到我发现了

好开心

新大陆,骚操作啊!!!
可以发现因为我设置了tools:replace="android:exported",而我在Manifest中没有给四大组件设置过android:exported属性,没升级前没报这个错。。。

这里!就是这里

去掉后就可以正常运行啦!!:)

额外说一句哈,关于这个android:exported属性的

  • 四大组件 Activity,Service,Provider,Receiver 四大组件中都会有这么一个属性。
  • 它的主要作用是:是否支持其它应用调用当前组件。
  • 默认值:如果包含有intent-filter 默认值为true; 没有intent-filter默认值为false。

详细的可以看这里:
https://blog.csdn.net/watermusicyes/article/details/46460347

9.矢量图报错

Q: A failure occurred while executing com.android.build.gradle.tasks.MergeResources$FileGenerationWorkAction. Error while processing C:\androidProject\xxx\app\src\main\res\drawable\ic_storage_24dp.xml : Can't process attribute android:fillColor="@color/color_storage": references to other resources are not supported by build-time PNG generation. See http://developer.android.com/tools/help/vector-asset-studio.html for details.

A: 问题出在矢量图,2.0+的Android Studio需要如下进行设置:

defaultConfig{  
   vectorDrawables.useSupportLibrary = true  
} 

10.分包multidex问题

在依赖中添加了MultiDex后,报错提示包重复。

// 添加MultiDex支持库的依赖
api 'com.android.support:multidex:1.0.1'

找了好久,也没发现在哪加了1.0.2的包啊。。。尼玛

后来终于发现,在3.0中只要设置

multiDexEnabled true

就会自动添加上述两个1.0.2的包。

  • Android 5.0以下的版本

Android 5.0(API leve 21)之前的系统使用Dalvik执行应用程序代码。默认情况下,Dalvik限制一个apk只有一个Dex文件。为了绕过这个限制, 我们可以使用multidex support library,它成为我们APK的主要DEX文件的一部分,负责管理我们APK访问其他DEX文件和代码。
注意: 如果咱的项目minSdkVersion是20或更低,运行到Android 4.4(API leve 20)或者更低版本的设备上时需要禁用AndroidStudio的即时运行

  • Android 5.0和更高版本

Android 5.0(API leve 21)和更高的系统使用runtime是ART ,原生支持从应用的apk文件加载多个DEX文件。ART在安装应用时预编译应用程序,会扫描多个classes(..N).dex文件编译成一个.oat的文件。更多Android5.0 runtime的更多信息,请参见即时运行-instant-run。
注意: 如果你使用即时运行 , AndroidStudio自动配置你的应用程序,你应用程序的minSdkVersion应该设置为21或更高。因为即时只工作在你APP的Debug版本,你任然需要配置你的release版本构建时用multidex避免64k的限制。

综上,multiDexEnabled true即可解决问题。另外,别忘了

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(base);
    }

11.Android Studio下载插件超时

File->Settings->Apparence & Behavior->System Settings->Updates->use secure connnection 勾去掉


12.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,397评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,585评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,521评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,645评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,489评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,366评论 1 274
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,787评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,432评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,732评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,775评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,550评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,393评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,802评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,036评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,324评论 1 253
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,757评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,958评论 2 336

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,145评论 25 707
  • afinalAfinal是一个android的ioc,orm框架 https://github.com/yangf...
    wgl0419阅读 6,257评论 1 9
  • 金色的人儿在起伏的山峦上奔跑着 像一滴雨珠从伞脊上滑落似的 像孩童从蹦床上一跃而起又淹没在彩色的气泡中 风从双臂间...
    云堤之外阅读 247评论 1 4
  • 原创声明:本文参加“读经典好书,写读书感悟”活动本人承诺,文章内容为原创,且未在其它平台发表过。 «鲁宾逊...
    兔子2222阅读 569评论 0 0
  • 城关镇
    和为贵0608阅读 164评论 0 0