android studio 奇怪问题收集(gradle问题详解)

  1. plugin is too old,please update to a more recent version, or set ANDROID_DAILY_OVERRIDE environment variable to …

临时解决方案:去环境变量里面照着配置就对了,比如 ANDROID_DAILY_OVERRIDE = “c9940005c…fdcb919e0”。as需要重启。
这种方式的弊端是,下次创建新项目的时候你又得配一次,每次的值都不一样啊。

终极解决方案:
http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece76310579135480ddd276b97844b22918448e435061e5a25a4ec66644b598f84616607a84c5cecf73c6f645f76f7c693de5dddcdd36e68de7c69671cf04105d36faddc4653837ed70fb2f30ee7ccab7384aea495820944ca255824d6e78b2c424a9d3cb14326e3d0de0a430c56edfa3013b9046029e97057b631a6bd72391081809d0b1d9476967611e1eb62f07f49e84fb05a466412af0eef4f047d6cf74f56a4052a04e3ad00ba3d79317ee81ea4b9b0e5b71e9bdc9b62c4ac8bf274c377e7b5fdfe05557122ac76e5f5f6a53c145205addddf669976ebbaace11abe03d76118e90331787cce1acfc39857833104b5ba7ffe587f616e5c8cf523a962701e26a84f0fb06f822be6dd371c&p=882a9644d6d21aef00acc7710f519d&newp=aa759a46d7c30bfc57ef853d4e4281231610db2151d7d41e6b82c825d7331b001c3bbfb423231600d4c47f6d06ac4c5eebf43c71350327a3dda5c91d9fb4c57479c2&user=baidu&fm=sc&query=Plugin+is+too+old+and+ANDROID_DAILY_OVERRIDE+value+is+also+outdated%2C+please+use+new+value&qid=e55465a90000691f&p1=7

首先得明白以下一些问题:
可以先看看gralde基础,https://segmentfault.com/a/1190000002439306
a. gradle wrapper task利用gradle-wrapper.properties来下载指定的gradle
b. build.gradle中classpath 'com.android.tools.build:gradle:xxx’表示要使用这个android gradle plugin
这是as对gradle进行支持的插件,插件版本一般和gradle版本配合使用。

所以,对应的解决方案,就是下载最新的gradle,路径在gradle-wrapper.properties中配置,可以在项目gradle/wrapper/gradle-wrapper.properties中找到

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip

然后要更新对应版本的插件,project的build.gradle中的classpath将插件地址更到最新

dependencies {
        classpath 'com.android.tools.build:gradle:2.2.0'
}

然后build的过程中,你可能遇到这样的问题:Error:Minimum supported Gradle version is 2.14.1. Current version is 2.10.
解决方案在此:http://blog.csdn.net/qq_32365567/article/details/52671275
可能需要先下载2.14.1版本的gradle到手机。

2.Error:(3) Error retrieving parent for item: No resource found that matches t
看看你的build.gradle文件里面的compileSdkVersion
和compile 'com.android.support:'版本是不是对应的

3.关于multidex,用于解决方法超过65535的问题相信都不陌生,随着as的不断升级,貌似只要在app的build.gradle中添加这个就行了。
defaultConfig {
multiDexEnabled true
}
一开始我以为这是新用法,后来发现这里面有坑哇,大概就是导致某些第三方包在不同机型上有的可以有的不可以。所以还是得用最全版本的:

1)在app的build.gradle文件的dependencies 节中添加分包设置:

dependencies {

compile ‘com.android.support:multidex:’

}
2)通过在defaultConfig节中设置multiDexEnabled标签为true,开启multi-dexing支持.

defaultConfig {

multiDexEnabled true

}
3)分三种情况,由于我并未创建自己的Application.class,直接在AndroidManifest.xml文件的Application声明中添加;
android:name=“android.support.multidex.MultiDexApplication”

如果有自定义的Application,请在其中添加方法:
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}

4 随着第三方so的版本越来越多,armeabi ,v7,x86。。。丢到app中会很大,而且不同第三方提供的版本不一样你就惨了。所以只能做减法,留一个armeabi,里面一般都用v7的so。奇葩的是,有的第三方在编译的时候会自动生成不同包的so,比如个推,如果你个推更新到2.9以上后,你可能会突然发现某些手机其他第三方的so找不到了,所以要避免其生成各个版本的so,在defaultConfig节中添加:
ndk {
abiFilters “armeabi”
}

5 com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: Duplicate files

解决方案:在app的build.gradle中添加:

packagingOptions {
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/NOTICE'
    }

6 This version of android studio is incompatible with the gradle version used.看起来貌似是gradle升级后引起的,解决方案在此:http://blog.csdn.net/sinat_15417921/article/details/51907728

2016/11/19:
7.startActivityForResult时需要设置RequestCode,这里有两个坑:
第一个坑是,如果在Fragment中使用了startActivityForResult,后面发现fragment的onActivityResult拦截不到RequestCode,说明该Fragment的Activity中有onActivityResult,它会先拦截所有RequestCode,此时需要在Activity中做Fragment的请求应答。如果想让fragment处理事件,这时候需要在Activity的onActivityResult中添加super.xxx。

第二个坑是最近发现的一个坑,当我习惯第一个坑的存在后,经常会在fragment请求startActivityForResult后,在activity中去处理,这时候遇到第二个坑,发现回来的RequestCode变了。所以,如果没有其他RequestCode,fragment的请求应在frament中处理完毕。

8.点击事件中的全局变量值莫名其妙被改变?这个坑后来发现是这么回事。大体结构是这样的:

Entity entity=...;

if(layout==null){
	layout = View.inflate...;
	button = layout.findViewById...;
	button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                entity....;
            }
        });
}

然后发现当entity的内容发生变化后,onClick中的entity始终保持第一个entity的值。

解决方案:把点击事件放到if条件外,每次点击重新设置点击事件。或者使用setTag的方式,每次数据变了给button重新setTag,然后在事件里取出tag就是对的。

2016/11/24
8.如果有一天发现file.mkdirs()不起作用了,看看你的targetSdkVersion是不是超过了22。23以上的权限模式有点点不一样,所以最简单的恢复方式就是将其改回22。

2016/12/06
9.今天突然发现as的布局preview不能正常工作了,提示:android.support.v7.widget.ActionBarOverlayLayout can not cast to android.support.v7.internal.widget.ActionBarOverlayLayout
最终解决方案是:修改AppTheme,在前面添加Base,比如: