AndroidStudio3.0使用过程中遇到的bug

来源:互联网 发布:intelij idea java web 编辑:程序博客网 时间:2024/06/05 14:28

一、导入项目报错问题:

如果是AndroidStudio3.0以上的编译工具编译的项目,可直接导入

如果是AndroidStudio3.0以下的编译工具编译的项目,切记改完之后再导入。

Project目录下:

1、app的build.gradle文件下 // buildToolsVersion "26.0.3",即注释buildToolsVersion xx 这句

2、compileSdkVersion xx 改为 xx版本在26及以上

3、gradle/wrapper/gradle-wrapper.properties文件修改:

distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip

AndroidStudio3.0不支持  4.1以下的gradle版本,gradle-4.1-all.zip是你电脑上已安装的gradle版本


二、安装包问题

1、debug-apk复制到设备上,安装不上,提示应用安装有误

解决办法:打包签名后使用release安装包可以安装,

注意打包签名时,选择V1(jar Signature)   V2(full apk Signature),两个都选中,编译的安装包可以适配,如果只选择v2,则不能兼容7.0以下设备,如果只选V1,只生成jar包(小编暂时只摸索得这一个方法,如果读者收其他方法,还望分享)


三、x.Utils等第三方框架初始化出错(Android5.0以上出现的问题):

问题app 安装成功之后,打开就停止运行,报错:Java.lang.NoClassDefFoundError: org.xutils.common.task.TaskControllerImpl

原因:在android stuido 中进行了分包的处理。分包处理之后导致的

解决办法:分包处理后把项目application继承的父类Application改为MultiDexApplication 即可

项目编译报错

错误:Android Studio Caused by: java.lang.ClassNotFoundException

原因:Android系统中,一个App的所有代码都在一个Dex文件里面。Dex是一个类似Jar的存储了多有Java编译字节码的归档文件。因为Android系统使用Dalvik虚拟机,所以需要把使用Java Compiler编译之后的class文件转换成Dalvik能够执行的class文件。这里需要强调的是,Dex和Jar一样是一个归档文件,里面仍然是Java代码对应的字节码文件。当Android系统启动一个应用的时候,有一步是对Dex进行优化,这个过程有一个专门的工具来处理,叫DexOpt。DexOpt的执行过程是在第一次加载Dex文件的时候执行的。这个过程会生成一个ODEX文件,即Optimised Dex。执行ODex的效率会比直接执行Dex文件的效率要高很多。 但是在早期的Android系统中,DexOpt的LinearAlloc存在着限制: Android 2.2和2.3的缓冲区只有5MB,Android 4.x提高到了8MB或16MB。当方法数量过多导致超出缓冲区大小时,会造成dexopt崩溃,导致无法安装.

解决方案:

1) 在app目录下build.gradle中android中的defaultConfig中添加multiDexEnabled true

2) 集成类Application的类中在onCreate方法中添加代码MultiDex.install(this); 


四、so包报错

错误:main java.lang.UnsatisfiedLinkError: dlopen failed: "/data/app-lib/com.makeparams1111-2/libclib.so" is too small to be an ELF executable

原因:错误信息说在工程中找不到64位的so文件,32位的不能代替。遇到这个问题应该就不知所措了,明明都是按照三方文档上的步骤导入的,怎么还会有报错,这个问题出现的原因就是有些三方的架包只提供了32的so文件,而没有提供64位的so文件。说到这,首先想到的办法就是从网上在下载个64位的so文件不就完了,问题就来了,有些网上找的64位的不一定是三方官方提供的,那么就不能去使用和兼容。

解决方案:

就是在自己工程app目录下build.gradle的Android根目录添加上一句话:

ndk{

abiFilters "armeabi"

}

这句话意思是只加载32位的so文件,那么如果是64位系统的手机肯定也是可以兼容的。

这时如果还是有报错,可能是因为gradle的配置中,并不知道是否要做操作系统的兼容,这时只要在gradle.properties文件中加上Android.useDeprecatedNdk=true;


五、签名打包报错

错误

Error:(34, 24) Error: This fragment should provide a default constructor (a public constructor with no arguments) (com.base.component.FragmentCamera) [ValidFragment]

import com.hndist.monitor.main.R;  

D:\AndroidStudioWorkSpace\jc\app\src\main\java\com\base\component\FragmentCamera.java:50: Error: Avoid non-default constructors in fragments: use a default constructor plus Fragment#setArguments(Bundle) instead [ValidFragment]

原因:Fragment要有空构造

解决办法:在各个自定义的Fragment里面都添加上空构造方法