昨天给项目添加了SmartRefreshLayout框架后,因为SmartRefreshLayout的“com.aaron.gradle.bintray-release” gradle使用的4.4版本所以原本的项目4.6也进行了降级操作。
- 项目中在 Gradle 包装中gradle/wrapper/gradle-wrapper.properties文件修改编辑 URL:distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip
- 在项目级生成. gradle 文件中更改插件版本,项目的build.gradle文件中:
dependencies {
classpath 'com.android.tools.build:gradle:3.1.1'classpath 'com.aaron.gradle:bintray-release:1.3.7'
}
本来也用的好好的,上午又改了样式之类后来莫名其妙电脑就卡住动不了,等再能动时候发现报了“AAPT2 error: check logs for details”错误。
排查代码
代码排查没有找出问题点。
上网查阅资料,有网友表示“如果有问题可以退回到之前的版本,打开gradle.properties,添加如下内容”
android.enableAapt2=false
实践后发现已被废弃
The option 'android.enableAapt2' isdeprecated and should not be used anymore.
Use 'android.enableAapt2=true' to removethis warning.
It removed at the end of 2018..
很明显,我们使用“android.enableAapt2=false”来关闭AAPT2是行不通的,这个方法已经过时了,关闭之后Android Studio告诉我们要把它打开,这样就陷入了一个死循环,所以我们还是需要找到问题的根本原因在哪里才能解决。
打印报错信息
在命令行中进入项目的根目录,或者可以在Android studio的Terminal中直接操作也可以,然后敲入一个命令:
gradlew compileDebug --stacktrace
就可以输出较详细的信息,然后根据命令行给出的提示,还可以在后面加上-info或者-debug的选项得到更详细的信息,于是这个命令可以这样写:
gradlew compileDebug --stacktrace -info
或者:gradlew compileDebug --stacktrace -debug
首先报JAVA_HOME找不到目录,去找了下确实如此,改了环境变量后重启了电脑,仍然还是报“AAPT2 error: check logs for details”,再次命令行打印,报错
Error occurred during initialization of VM
Could not reserve enough space for 1572864KB object heap
这个错误的大意就是说IDEA无法给虚拟机分配内存空间。解决这类问题大体是调整idea.exe.vmoptions里面的内存配置。
编译器里调整heap调到2G
问题还在,想想这是gradle里报的错,gradle应该有需要占用内存的配置。打开一看,大吃一惊,gradle默认的jvm内存居然就是1536m,对上了报错信息里的1572864KB,所以修改项目中gradle.properties文件的jvm大小
#org.gradle.jvmargs=-Xmx1536m
org.gradle.jvmargs=-Xmx512m
改完后又报了新的错误提示
出现Error:Execution failed for task ':app:processDebugResources'
觉得是缓存太多,将android项目build目录下的所有文件删除掉,然后重新编译 后出现新错误提示
14:00:54.181 [DEBUG] [org.gradle.internal.progress.DefaultBuildOperationExecutor] Completing Build operation 'Calculate task graph'
14:00:54.200 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]
14:00:54.200 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] FAILURE: Build failed with an exception.
14:00:54.201 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]
14:00:54.201 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] * What went wrong:
14:00:54.201 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] Task 'compileDebug' is ambiguous in root project 'ECard20190301'. Candid
ates are: 'compileDebugAidl', 'compileDebugAndroidTestAidl', 'compileDebugAndroidTestJavaWithJavac', 'compileDebugAndroidTestNdk', 'compileDebugAndroi
dTestRenderscript', 'compileDebugAndroidTestShaders', 'compileDebugAndroidTestSources', 'compileDebugJavaWithJavac', 'compileDebugNdk', 'compileDebugR
enderscript', 'compileDebugShaders', 'compileDebugSources', 'compileDebugUnitTestJavaWithJavac', 'compileDebugUnitTestSources'.
14:00:54.201 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]
14:00:54.201 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] * Try:
14:00:54.203 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] Run gradlew tasks to get a list of available tasks. Run with --scan to
get full insights.
注意到这句话Task 'compileDebug' is ambiguous in root project 'DefineViewStudy'. 单词ambiguous是模糊不清的意思.尝试着把命令改为
gradlew compileDebugJavaWithJavac
这次打印的信息很明了了.
D:\php\androidProject\ECard20190301>gradlew compileDebugJavaWithJavac
D:\php\androidProject\ECard20190301\app\src\main\res\layout\activity_eventsearch.xml:30: AAPT: error: resource android:color/dim_foreground_inverse_ho
lo_light is private.
error: failed linking file resources.
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:processDebugResources'.
> Failed to process resources, see aapt output above for details.
代码中确实有被我修改引用module的资源文件,
<com.scwang.smartrefresh.layout.SmartRefreshLayout
android:id="@+id/refreshLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:srlEnablePreviewInEditMode="false">
<com.scwang.smartrefresh.layout.header.ClassicsHeader
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:srlAccentColor="android:color/dim_foreground_inverse_holo_light
"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/search_recyclerview"
android:name="com.php.ecardzz.EventMapCertSearchActivity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
app:layoutManager="LinearLayoutManager"
android:scrollbars="vertical"
android:fadeScrollbars="true"
android:scrollbarStyle="outsideOverlay"
tools:context="com.php.ecardzz.EventMapCertSearchActivity"
tools:listitem="@layout/item_eventsearch_recyclerview" />
<com.scwang.smartrefresh.layout.footer.ClassicsFooter
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:srlClassicsSpinnerStyle="Translate"/>
</com.scwang.smartrefresh.layout.SmartRefreshLayout>
原因是:低级且致命的错误
资源文件中颜色的值直接引用别的资源的颜色名,直接报错。
修改成
app:srlAccentColor="#ff000000"
问题解决。