Android常见开发错误记录(一)

"Android开发"

Posted by jhljx on August 22, 2016

目录

1. Authentication scheme ‘all’(Authentication) is not supported by protocol ‘file’相关错误
2. java.exe finished with non-zero exit value相关错误
2.1 java.exe finished with non-zero exit value 1错误
2.2 java.exe finished with non-zero exit value 2错误
2.3 java.exe finished with non-zero exit value 3错误
3. Android 百度地图开发问题
3.1 Android 百度地图闪退问题
3.2 Android 百度地图无法显示问题
3.3 Android 6.0下百度地图无法显示问题
4. Android Studio使用相关

1. Authentication scheme ‘all’(Authentication) is not supported by protocol ‘file’相关错误

使用Android Studio开发Android项目中经常会遇到gradle更新的情况,如果一个项目的gradle版本比较低,在一不小心点了系统提示的update之后,再次编译就会出现下面的错误:

Authentication scheme 'all'(Authentication) is not supported by protocol 'file'

这是在update gradle版本时经常容易导致的错误,但是网上百度谷歌都没有好的解决方案,让人非常头疼。
在update gradle之后,此时Android Studio自动会修改top-level的build.gradle文件(即项目根目录下的build.gradle文件)中的dependenciesclasspath变量和gradle/wrapper/gradle-wrapper.properties文件中的distributionUrl变量。

如果要消除这个错误,我们第一反应是将上面两个被修改的值改回原来的值,但是会出现新的错误:

最后发现,消除此错误只需要在菜单栏的Setting中修改编译的gradle即可,只需取消选择Use local gradle distribution、改选Use Default gradle wrapper选项即可。

2. java.exe finished with non-zero exit value相关错误

使用Android Studio开发Android项目时,和java.exe finished with non-zero exit value错误相关经常遇到,网上各种解决方案也满天飞,但是都不太全,有时候可能是这个原因引起,有时候又可能是另外一个原因引起的,在这里整理一下。

2.1 java.exe finished with non-zero exit value 1错误

  • 可能jdk版本和sdk编译版本不兼容
    Android Studio可以在JDK8的虚拟机运行,但Android SDK不支持JDK8的新特性。 但是应该可以在使用JDK8时,让Compatibility设置为JAVA 1.7时编译通过。

    我就是在这里出现的错误,将

      android {
    
          ......			
    
          compileOptions {
              sourceCompatibility JavaVersion.VERSION_1_8
              targetCompatibility JavaVersion.VERSION_1_8
          }
    
          ......
    
      }
    

    改为下面这段代码即可。

      android {
    
          ......			
    
          compileOptions {
              sourceCompatibility JavaVersion.VERSION_1_7
              targetCompatibility JavaVersion.VERSION_1_7
          }
    
          ......
    
      }
    

    附注:我的jdk版本是1.8,所以一开始将compileOptions中的值都设置为了1.8。

    但是在另外一个项目中遇到了同样的问题,我用这个方法却没有解决成功,参考了一下这个问题。本以为需要将java1.8重装为java1.7,但是感觉太蠢了,不想重装。然后,发现了新项目中引用了一个java的类库,但是这个类库的build.gradle文件中没有指定java版本为java1.7。于是,我深深地感觉到一定是这里的锅。
    然后,找到了如何在java项目中设置build.gradle文件,参考了gradle的这个官方文档。在build.gradle文件中添加了下面的代码就可以正常编译和运行了。

      sourceCompatibility=1.7
      targetCompatibility=1.7
    

    所以一定要注意安卓库和java库的build.gradle文件java版本的设置写法啊==。

  • Android Studio设置的内存不够

    解决方案是在module的build.gradle文件中增加下面的语句。

      android {
    
          ......			
    
          dexOptions {
              incremental true
              javaMaxHeapSize "2g"
          }
    
          ......
    
      }
    

    当然,也可以将javaMaxHeapSize设置为‘4g’。

2.2 java.exe finished with non-zero exit value 2错误

  • 项目中出现了重复加载的jar包

    • libs目录下存放有jar包,但是build.gradle中也写了依赖包语句。

    • 新引入的Library项目中引用了主项目中已经引用的jar包,导致重复加载包。

    项目包含了两个相同包名的不同project或者jar。有时候可能是在lib文件夹中有一个jar文件,但是在module的build.gradle文件中的dependencies里又添加了这个文件,导致重复。

    解决方案就是保留一个即可。

  • 未知错误,莫名其妙的问题

    解决方案是先clean这个project,然后再rebuild

  • app的方法数量已经突破了65536的最大限制

    解决这个问题需要使用多重dex。但是应该是在android 21版本及其以后才支持多重dex,之前的版本要解决这个问题很麻烦==。

    因此在android 21及其以后的版本上进行开发时遇到该问题,可以在modulebulid.gradle文件中添加下面的语句:

      android {
    
          .......
    
          defaultConfig {
              multiDexEnabled true
          }
    
          .......
    
      }
    

2.3 java.exe finished with non-zero exit value 3错误

  • 一般出现这个错误是因为项目太大,导致java heap内存溢出。

    解决方案是在modulebuild.gradle文件中添加下面的语句:

      android {
    
          .......
    
          dexOptions {
      		incremental true
      		javaMaxHeapSize "2g"
          }
    
          .......
    
      }
    

3. Android 百度地图开发问题

之前在进行Android百度地图应用开发时,遇到过很多问题。比如百度提供的许多.so文件和.jar文件一定要版本一致,否则极有可能出现闪退。这是一个坑。

3.1 Android 百度地图闪退问题

此外,我之前在Android 5.0的手机上开发百度地图应用,即便是.so文件和.jar是同一个版本一一对应。但是将.so文件放在libs文件夹中却会导致出现闪退。当时百度谷歌这个错误折腾了很久,凡是说更改.so文件的放置目录的做法我都试过一遍,结果还是跪了。后来无意间查到了一种做法解决了闪退的问题,这个方法也教会了我如何在Android Studio中正确引入.so文件

直接用gradle将.so文件编译成.jar文件,然后放在libs文件夹中就不会出现闪退了。这个错误当时坑了很久,之前忘了记下来,这次赶紧记一下,免得以后再被坑。

modulebuild.gradle文件中添加下面的语句:

android {

	......

    task nativeLibsToJar(type: Zip, description: "create a jar archive of the native libs") {
        destinationDir file("$projectDir/libs")
        baseName "你编译成的jar的名字"
        extension "jar"
        from fileTree(dir: "libs", include: "**/*.so")
        into "lib"
    }

    tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn(nativeLibsToJar)
    }

	......

}

这样会把libs目录下所有子目录下的.so文件编译成.jar文件存放到lib文件夹中。然后我们删掉这些.so文件,然后将这个编译好的jar包重新放到libs目录中。

build.gradle文件的dependencies中添加下面这条语句

compile fileTree(dir: 'libs', include: '*.jar')

即可将libs目录下的所有jar包都引入进来。

3.2 Android 百度地图无法显示问题

百度地图无法显示的问题很多,我自己也出过一些错误。比如:

  • 百度地图的key申请时的包名和实际项目apk文件的包名不一致

  • 百度地图的key申请时写的sha1签名和实际运行时的签名的不一致,需要注意debug key和release key。

    这个地方也比较坑,尤其是在生成签名的时候。关于Android Studio手动生成签名(Generate Signed APK)的过程可以详细查看这篇博客

    除了自己在Android Studio的菜单栏buildGenerate Signed APK以外,我们也可以使用系统默认的签名证书。在Android Studio底部的terminal中输入cd C:/users/xxxx/.android,就会切换到C:/users/xxxx/.android这个目录下,然后输入keytool -list -keystore debug.keystore就能看到系统默认的debugkeySHA1安全码。输入这条语句后,命令行中会提示你输入密钥口令,因为系统默认的key的密码是空的,所以直接回车就好了。

    如果是通过Generate Signed APK方式生成key文件,查看SHA1安全码的方法和上面一样,找到文件所在目录,用keytool工具来获取签名就可以了。

  • AndroidManifest.xml文件中和百度地图相关的一些用户权限未开启

    百度地图SDK的Demo中给出了以下用户权限:

      <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
      <!-- 这个权限用于进行网络定位 -->
      <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
      <!-- 这个权限用于访问GPS定位 -->
      <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
      <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->
      <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
      <!-- 获取运营商信息,用于支持提供运营商信息相关的接口 -->
      <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
      <uses-permission android:name="android.permission.WRITE_SETTINGS" />
      <!-- 用于读取手机当前的状态 -->
      <uses-permission android:name="android.permission.READ_PHONE_STATE" />
      <!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据 -->
      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
      <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
      <!-- 访问网络,网络定位需要上网 -->
      <uses-permission android:name="android.permission.INTERNET" />
    

    下面这些是我在AndroidManifest.xml中添加的和百度地图相关的用户权限,比百度地图SDK的demo中给出来的多了几个。

      <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
      <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
      <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
      <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
      <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
      <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
      <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
      <uses-permission android:name="android.permission.WRITE_SETTINGS" />
      <uses-permission android:name="android.permission.READ_PHONE_STATE" />
      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
      <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
      <uses-permission android:name="android.permission.INTERNET" />
    

3.3 Android 6.0下百度地图无法显示问题

在Android 6.0的手机上开发百度地图应用的时候其他一切正常,AndroidManifest.xml文件中的key还有权限都没有问题,但是打开手机APP仍然无法显示百度地图,出现以下错误:

remote E/SQLiteDatabase: Failed to open database '/storage/3631-3165/baidu/tempdata//ls.db'.
     android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (Sqlite code 14): Could not open database, (OS error - 13:Permission denied)
         at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
         at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:217)
         at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:201)
         at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:493)
         at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:194)
         at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:183)
         at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:827)
         at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:811)
         at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:714)
         at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:729)
         at com.baidu.location.c.b$b.a(Unknown Source)
         at com.baidu.location.c.b$b.doInBackground(Unknown Source)
         at android.os.AsyncTask$2.call(AsyncTask.java:307)
         at java.util.concurrent.FutureTask.run(FutureTask.java:237)
         at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:246)
         at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
         at java.lang.Thread.run(Thread.java:833)

对于这个Failed to open database '/storage/3631-3165/baidu/tempdata/ls.db新错误,我发现是Android 6.0系统的问题。

Android 6.0新增了动态权限控制,如果您的app所声明target api低于23,则6.0系统会默认禁用所有的应用权限;这时需要到系统设置中,点击对应应用详情,在其中设置相应权限。

为了适配Android 6.0Androidmanifest中设定target api为23,并且在您调用定位SDK代码前,调用动态权限有关的api进行权限设置。这样应用运行到定位功能系统会自动弹窗提示用户授予应用权限。

然后,我在手机设置–>权限管理中添加了信任此应用,再次打开应用就可以正常显示百度地图了。

在Android上引入百度地图SDK的时候需要注意很多地方,下面是一些比较好的网址:

4. Android Studio使用相关

您可以随时通过按两下 Shift 键或点击 Android Studio 窗口右上角的放大镜搜索源代码、数据库、操作和用户界面的元素等。此功能非常实用,例如在您忘记如何触发特定 IDE 操作时,可以利用此功能进行查找。

The settings.gradle file, located in the root project directory, tells Gradle which modules it should include when building your app. For most projects, the file is simple and only includes the following:

include ‘:app’