Android错误整理(保持更新)

  • 问题1

Android Studio 三个错误,归结为一个错误(目录迁移)

  1. 弹出窗口,错误如下
    Application Installation Failed…INSTALL_FAILED_INVALID_APK…
    WARNING: Uninstalling will remove the applation data:
    Do you want to uninstall the existing applation?

  2. Event Log,错误如下
    Session ‘app’: Error Installing APKs

  3. Run,错误如下
    Unknown failure (Failure - not installed for 0)
    Error while Installing APKs

这三个错误可归结为一个,也调试了数小时,各种搜索。终于找到了办法:

在设置中可以解决:File–>Settings
在这里插入图片描述


  • 问题2

当使用cmake引入第三方so库的时候会出现,ninjin *** need by ** no rule to build ,原因有如下

add_library(core SHARED IMPORE)
set_target_properties(core PROPERTIES IMPORET_LOCATION 
&{PROJECT_SOURECE_DIR}/xxx/${ANDROID_ABI}/libcore.so)
include_directories(${PROJECT_SOURCE_DIR}/xxx/include)

 1. 第三方库路径错误,检查一下是否是库的路径配置错误,只用配置到包括cpu架构的上一层即可

 2. 在每个架构下都应该有对应的so库,而你有可能忘记导入了。

  • 问题3

在打包apk时候发现无论是模块还是app中引入的第三库not found,原因好像是第三方库被当成私有库,不被打入apk中,导致apk构建失败。


1. 手动在app的目录下建立jniLibs进行引入,此时如果是找不到,那么需要在gradle中进行setSources.main{jnLibs.srcDirs = so的路径 jn.srcDirs = []},

 2. 情况又是会发现你又重复的so库,那么这种情况发生的原因是你的android studio版本默认将jniLibs目录引入了构建,而你又在gradle中手动添加了setSources.main{jniLibs.srcDir = "" jni.srcDir=[]},那么将其删掉/注释掉即可。具体版本也不清楚,但是确实遇到过

  • 问题4

接入sdk时发现so加载不到,System.loadLibrary(xxx.so)加载失败
错误:
java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol “__sfp_handle_exceptions” referenced by “/data/app/com.wemomo.cosmos.photonim-TDCuHhP-6v8VjNcRsFrxhw==/lib/arm64/libmmfile.so”…

1. 针对这种情况,可能是NDK版本太小了,尤其是针对arm64-v8a架构,需要提升NDK版本(出现过一次NDK16b生成arm64架构无法加载so的情况)

2. 可能是和别的依赖冲突,可以逐步添加依赖,手动添加so进行排查,看下是否有问题。 

3. 网上解决方案,so文件的摆放问题,比如项目下有armeabi、armeabi-v7a、arm64-v8a三个文件夹,这三个文件夹中的so文件必须一致,意思是armeabi中有的so文件,armeabi-v7a和arm64-v8a文件夹中都必须有,而且是不同abi编译的so文件,若有不一样,则会出现crash现象。这是因为只要有arm64-v8a文件夹,系统会直接去此文件夹中寻找对应的so文件,而如果有的so文件没有64bit的话,就会出现异常抛出。 
 


  • 问题5

错误: Caused by: java.lang.ClassNotFoundException: Didn’t find class “xxxxx” on path: DexPathList[[zip file “/data/app/xxx-ehMvc8LtE73qc83SRA_LkA==/base.apk”],nativeLibraryDirectories=[/data/app/xxx-ehMvc8LtE73qc83SRA_LkA==/lib/arm64, /data/app/xxx-ehMvc8LtE73qc83SRA_LkA==/base.apk!/lib/arm64-v8a, /system/lib64, /product/lib64]]

1.  这种情况,先检查xxx是不是本地maven依赖,如果是本地maven依赖,那么需要关注是否手动将依赖添加,因为本地依赖和jcenter上的依赖是不一样的,需要手动进行倒入依赖。

2. 其次如果都手动倒入了还出现这样的错误,那么可能有别的依赖也依赖的这个xxx而且对应的版本不一致,那么此时默认打包的时候可能用成了另一个xxx,一般不会出现只是会吧不同版本别的依赖搞挂。


  • 问题6

针对pb版本lite版本,javalite版本,java版本(太大),javalite和lite版本的pb互相不兼容,且Gradle配置也不相同,其次是javalite 3.9.1版本有一个致命的bug就是在混淆代码之后pb fileld not found问题,其实是pb自身问题。

需要手动在混淆中添加,这个filed 就可以找到了,建议直接使用3.10.0版本之后
 -keepclassmembers class * extends com.google.protobuf.GeneratedMessageLite {
  <fields>;
}

javalite版本Gradle配置
protobuf {
    protoc {
        artifact = 'com.google.protobuf:protoc:3.11.0'
    }
    generateProtoTasks {
        all().each { task ->
            task.builtins {
                java{
                    option "lite"
                }
            }

        }
    }
}

lite版本Gradle配置
protobuf {
    protoc {
        // Download from repositories
        artifact = 'com.google.protobuf:protoc:3.2.0'
    }
    plugins {
        javalite {
            // The codegen for lite comes as a separate artifact
            artifact = 'com.google.protobuf:protoc-gen-javalite:3.0.0'
        }
    }
    generateProtoTasks {
        all().each { task ->
            task.builtins {
                // In most cases you don't need the full Java output
                // if you use the lite output.
                remove java

            }
            task.plugins {
                javalite {}
            }
        }
    }
}

  • 问题7

有时后突然Android Studio无法sync,出现下面情况
在这里插入图片描述
在这里插入图片描述

解决:1. 首先手机打开wifi,共享热点,让电脑连接热点,然后Android Studio 进行sync就可以解决了

  • 问题8

Android 5.0之前,安卓系统采用的是Dalvik虚拟机,采用的是JIT技术(Just-in-time compilation,即时编译,运行时编译DEX字节码文件,这也是以前为什么安卓手机用户总是诟病Android系统比iOS系统运行卡顿的原因),限制每个APK文件只能包含一个DEX文件(即classes.dex)。为了绕开这个限制,Google给我们提供了multidex support library兼容包,帮助我们实现应用程序加载多个DEX文件,并且这个兼容包作为程序的主DEX文件,管理者其他DEX文件的访问。
Android 5.0之后,安卓系统改用了ART虚拟机(Android RunTime),采用的是OAT技术(Ahead-of-time,预编译,在应用安装的时候扫描应用中的所有DEX文件,并编译成一个.oat格式的文件供安卓设备执行,所以相比Dalvik虚拟机下的应用,安装时间较长)。因此可以理解为,使用ART虚拟机下的安卓系统自动支持APK文件中多个DEX的加载。所以我用乐视手机(Android 6.0)上apk正常运行,而在三星(Android4.4.2)却无法运行,报找不到类;

这是Android API < 21可能会出现的问题,即分包导致一些类找不到的情况(当然如果是native项目的话也有可能是对应的so没有load上导致的),如下图

分包控制只需要在Android节点下添加下述代码即可
multiDexEnabled = true

在这里插入图片描述

此时可以先添加下面代码,在Application重写attachBaseContext方法。

@Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(base);
    }

上述基本可以解决,但是也有可能解决不了,还是提示找不到某个class,那么需要配置分包策略。
在App的build下添加如下,其中multidex-config.pro和build同级目录,config.pro的规则和混淆规则一致,用于不进行分包。multiDexKeepProguard file(‘multidex-config.pro’)意思是不进行分包,将此类放到main-dex中。

  buildTypes {
        debug {
            multiDexKeepProguard file('multidex-config.pro')
        }
        release {
            multiDexKeepProguard file('multidex-config.pro')
        }
    }

但是如果keep的太多则会出现下面情况,那么需要少keep一些类,或者分的更细即可。

在这里插入图片描述
如果上述都不行,那么可以关闭分包试一下,也许就可以了😂


  • 问题9

More than one file was found with OS independent path ‘lib/arm64-v8a/xxx.so’
这种情况是因为项目中引入相同so的问题,在编译期是没有问题的,因为编译连接都是可以找到so的,不管找到的是那个,在生成apk的时候出错了,因为gradle会发想相同架构下有相同的so,此时pickFirst就可以了.

app下,build.gradle中android节点下
packagingOptions{
		pickFirst 'lib/${ANDROID_ABI}/xxxf.so'
}

上述其实还有另一种方式来实现,直接在SDK中exclude

  • 问题10

Android studio编辑底层C++代码时总是无法编译通过,或者总是感觉C++代码分支不对,此时应该是时混存造成,可以吧.externalNativeBuild文件删除,让其重新build即可。

  • 问题11
    ‘/Users/momo/work/photon-im-android/photon-im-android/imcore/build/extracted-include-protos/main’ specified for property ‘$3’ does not exist。多半谁gradle版本从低变成高的不兼容了。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值