- 问题1
Android Studio 三个错误,归结为一个错误(目录迁移)
-
弹出窗口,错误如下
Application Installation Failed…INSTALL_FAILED_INVALID_APK…
WARNING: Uninstalling will remove the applation data:
Do you want to uninstall the existing applation? -
Event Log,错误如下
Session ‘app’: Error Installing APKs -
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版本从低变成高的不兼容了。