此文章用以记录项目开发中遇到的一些比较常见的bug,以及解决方法,以便以后再次遇到能够有据可查。
1、将一个项目复制,改名之后,重新打开编译错误,报了如下错误:
com.android.builder.internal.aapt.AaptException: Failed to crunch file
经过搜索后发现原来是在Windows中不允许存在比较长的路径名称所造成的,路径长度必须低于240个字符,如果有那个文件的绝对路径长度超过了240个字符,则会报次错误,编译报错。随意把路径改短后,Android Studio顺利编译通过。
2. 项目打包编译报错:
java.lang.UnsatisfiedLinkError:dlopen failed: /data/app/***.so:has text relocations
原因:在android 开发中调用.so文件,在android 7.0版本中报了上面的错误,经过反向查证,是so文件的编译版本sdk过低了,应该在7.0的sdk以下去编译。
解决办法:将项目目标(targetSdkVersion)SDK版本降低。(我是之前将SDK从18调到了27,故报此错),所以将我自己项目中的SDK27降回了18,重新编译就OK了。
3、Thread already started
进程已经开启,再次开启此进程就会报错
解决办法: new Thread(进程名).start();
4、ANR抓取Log步骤:
adb logcat -d > abc.log 将Log导入到abc.log文件中,默认路径为:C:\Users\(计算机用户名)中;
抓取anr Log 不要过滤,要按确定之后得到的堆信息。
不用root 也可以访问到文件 cat /data/anr/traces.txt(logcat看到堆栈信息的目录)
adb shell cat /data/anr/traces.txt > (目标目录)
文件中ANR的信息过滤,找anr和stack分析,看看是什么原因引起的程序无响应(卡死)。
5、用ApplicationContext去启动Standard模式的Activity会报错:
android .util.AndroidRuntimeException:Calling start Activity from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
解决办法:stardard模式的Activity默认会进入到启动它的Activity所属任务栈中,但是非Activity类型的Context(如ApplicationContext)并没有所谓的任务栈,故报错。将Application改为Activity类型的context即可。
6、android sutdio真机调试[INSTALL_FAILED_UNKNOWN_SOURCES]
解决办法:系统设置 设置->安全->未知来源->开启 即可。
7、打开android studio报错:
Unable to create Debug Bridge:Unable to start adb server: error: could not install *smartsocket* listener:cannot bind to 127.0.0.1:5037:通常每个套接字地址(协议/网络地址/端口)只允许使用一次。(10048)
error: unknown host servicecould not read ok from ADB Server* failed to start daemon *error:cannot connect to daemon'D:\installed\Android\sdk\platform-tools\adb.exe,start-server'failed -- run manually if necessar...
原因:端口复用,可能是手机助手占用了5037端口
解决办法:在控制台查看adb的端口号5037被谁占用了:netstat -aon|findstr "5037"找出对应的PID号:
可以看出我这里是pid = 8896 的进程占用了5037端口,所以再用命令 tasklist查看一下所有进程的信息:
可以看出,我这里是LdsMobileLink.exe占用5037端口,即鲁大师手机助手,然后只需要去任务管理器,找到进程LdsMobileLink.exe,将其关闭即可。
8. 防止RecycleView刷新时焦点不错乱bug的步骤:
1.adapter初始化后执行setHaStableIds(true)方法;
2.重写Adapter的getItemId(position)方法,让每个view都有各自的id;
3.RecycleView的动画必须去掉;mRecyclerView.setItemAnimator(null);
9. 项目编译的时候报了如下错误:
More than one file was found with OS independent path 'META-INF/library_release.kotlin_module'
这种问题的解决方案:
app下的build.gralde的android {}模块里面添加要过滤的文件的配置:
android {
......
packagingOptions {
exclude 'META-INF/library_release.kotlin_module'
//后面如果再出现这样的问题,同样接着往后添加exclude即可
}
......
}
然后Sync Now, 然后重新Rebuid 或者 重新打包即可解决;
10. 项目编译报如下错误:
Failed to transform 'D:\Android\gradle\gradle-5.4.1\caches\modules-2\files-2.1\org.bouncycastle\bcprov-jdk15on\1.68\46a080368d38b428d237a59458f9bc915222894d\bcprov-jdk15on-1.68.jar' using Jetifier. Reason: IllegalArgumentException, message: Unsupported class file major version 59.
解决方案:在工程项目的gradle.properties文件中增加一行
android.jetifier.blacklist=bcprov-jdk15on-1.68.jar
如果后面还有这样的问题,用逗号隔开,往后添加.jar文件皆可;
11.跳转界面日志显示:
ExtraActivityManagerService: MIUILOG- Permission Denied Activity
这是小米(红米)手机限制引起,解决方法:
手机管家-> 授权管理 -> 应用权限管理 -> 后台弹出界面-> 勾选
12. AS打包Android App Bundle生成上架Google的aab文件时报错
A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade
'other' has different root
解决方法:项目路径,签名文件(.jks文件或者.keystore文件),打包生成的abb文件(要上架的abb包)要放在相同的根目录下,无论是 c盘d盘e 盘都行,但是必须一致,然后clean下,打包就能成功了。
13. 编译报错:Entry name 'classes.dex' collided
* What went wrong:
Execution failed for task ':app:packageIconvnetRelease'.
> A failure occurred while executing com.android.build.gradle.tasks.PackageAndroidArtifact$IncrementalSplitterRunnable
> Entry name 'classes.dex' collided
解决方案:要在Module的build.gradle中添加如下代码:
android {
...
packagingOptions {
...
exclude 'classes.dex'
exclude '**.**'
}
}
然后同步一下即可。
后期遇到常见的Bug还会持续更新。