尝试进行视频通话时,Android WireApp记录UnsatisfiedLink错误:“ wcall_set_video_send_state”

时间:2018-08-21 18:12:42

标签: java android chat

我已经从以下存储库构建了Wire应用程序: https://github.com/wireapp/wire-android

使用以下构建说明:

  

如何在本地构建检出wire-android存储库。切换到   最新的relase分支发行版从checkout文件夹中,运行./gradlew   assembleProdRelease。这将获取所有必要的依赖项   来自Maven。

我尝试了发布分支:

git clone https://github.com/wireapp/wire-android.git --branch release

和主人:

git clone https://github.com/wireapp/wire-android.git

最初两个版本都给出了错误:

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
        at java.lang.Thread.run(Thread.java:764)
     Caused by: java.lang.UnsatisfiedLinkError: Error looking up function 'wcall_set_video_send_state': undefined symbol: wcall_set_video_send_state
        at com.sun.jna.Function.<init>(Function.java:245)
        at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:566)

但是,可以通过在Android Studio中打开项目之前运行以下命令来解决此错误:

  

gradlew assembleProdRelease

此命令还会在build / output / apks中创建apk。但是,该构建没有使用发布或调试密钥进行签名。我使用以下工具对apk进行签名: https://github.com/patrickfav/uber-apk-signer/releases

APK稳定且可以正常运行,但仍无法发起视频通话。它给出了以下错误:

Android 5:

  

08-24 22:53:29.877 296-881 /? E / FastThread:未收到预期   优先提升

Android 8:

  

08-24 23:10:02.190 406-4592 /? E / AudioALSAPlaybackHandlerBase:   -getHardwareBufferInfo(),pcm_get_htimestamp失败,ret = -1,pcm_get_error =

Android 9模拟器:

  

08-25 19:56:58.425 1583-3268 /? W / audio_hw_generic:不提供   足够的数据发送给HAL,预期位置4108693,仅写入4108320

更新:

我考虑过尝试构建自己的AVS库版本:遵循https://github.com/wireapp/wire-audio-video-signaling

需要运行以下命令:

make dist_android
  

C:\ work \ wire-audio-video-signaling>制作dist-android mk / target.mk:167:   ***未知的主机系统。停止。

mk / target.mk看起来像:

# Start by auto-determining host system and arch.
ifeq ($(HOST_OS),)
HOST_UNAME := $(shell uname)
ifeq ($(HOST_UNAME),Darwin)
HOST_OS := osx
else
ifeq ($(HOST_UNAME),Linux)
HOST_OS := linux
else
$(error Unknown host system)
endif
endif
endif

Makefile似乎没有设置为支持Windows,因此我将尝试从Linux机器上构建它,看看是否有帮助。

更新2:

它在Ubuntu上确实可以更好地构建,但最终因抱怨编译器参数而死。 [抱歉我没有错误]

但是我设法在这里找到为Android / ARM构建的库的二进制副本: http://dl.bintray.com/wire-android/releases/com/wire/avs/

但是,这些库似乎也无法解决问题。

更新3:

尝试了以下内容:

  1. 从上面的链接下载了最新版本的.aar文件
  2. 将其重命名为avs.aar
  3. 安装在应用程序/库中
  4. 取消注释该行:“实现(名称:'avs',ext:'aar')”

但是我得到了错误:

  

程序类型已存在:com.waz.avs.VideoCapturer $ 4   消息{种类=错误,文本=程序类型已存在:   com.waz.avs.VideoCapturer $ 4,来源= [未知源文件],工具   name = Optional.of(D8)}

如果您指出该错误将消失,则下面还会引用AVS库。

但是,这些步骤都不能解决问题。

现在,我将尝试构建发行分支的旧版本...

更新4:发行分支:2.41.359 [最新的非beta标签发行版]

  • 不再在Android Studio中编译,因为布局DIR中的某些XML文件格式不正确。这些文件必须修复并检入Git,因为构建过程会将所有文件从Git中检出。
  • 该应用最初可正常运行并允许登录,但始终在编辑设备屏幕后崩溃。每次您尝试打开该应用时,该应用都会崩溃。
  

08-25 14:51:02.142 29066-29109 /? E / AndroidRuntime:致命异常:   线程4       工艺:电线,PID:29066       java.lang.NullPointerException:尝试在空对象上调用接口方法'int com.waz.call.RequestHandler.request $ 1d4ff469()'   参考           在com.waz.call.FlowManager.request(FlowManager.java:365)

注意:似乎编辑设备屏幕不是问题的原因,因为我删除了Web应用程序中的所有设备,但是2.41.359在手机上崩溃而未显示编辑设备屏幕。

以下线程中提到了此问题:

由于提供的文件不足以运行项目,因此建议使用生产版本中的avslib.so文件。

因此,我已经从他们的网站上下载了APK: https://wire.com/en/download/

它的版本:3.15.634 [比应用商店中的版本还早:3.16.638,尽管希望没关系]。

对于任何不知道的人,APK只是一个ZIP文件,因此为了获得libavs.so,我将其从.apk重命名为.zip:

根目录
APK Root Dir

库目录:
APK Libs Dir

手臂目录:
APK armeabi-v7a Dir

解压libavs.so后,我将构建工具生成的未签名版本的wire-prod-release-2.41.99999重命名为wire-prod-release-2.41.99999-avs-mod.zip并删除了旧的libavs .so并将其替换为我刚刚从该应用的正式版中获取的那个。我将其重命名为.pkg,然后运行以下命令对其进行签名:

java -jar \uber-apk-signer-0.8.4.jar --apks wire-prod-release-2.41.99999-avs-mod.apk -debug

相当不错的结果,2.41.359不再崩溃。但是,我仍然无法发起任何音频或视频通话。在最新版本的发行分支中发现相同的错误:

08-25 16:01:51.748 406-4592/? E/AudioALSAPlaybackHandlerBase: -getHardwareBufferInfo(), pcm_get_htimestamp fail, ret = -1, pcm_get_error = 

作为一个健全性检查,我安装了生产版本:3.15.634(用于额外的libavs.so),它能够进行音频和视频通话。 [GooglePlay上的版本:3.16.638也可以很好地用于音频和视频...]

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

经过几天的尝试,我找到了一种构建项目的方式,可以启动音频和视频通话:

程序:

  • git clone https://github.com/wireapp/wire-android.git-分支发布
  • cd wire-android
  • git checkout 2.40.357
  • 将项目加载到Android Studio中
  • 编辑文件res / layout / collection_file_asset.xml
  • <?xml version="1.0" encoding="utf-8"?>移至版权注释上方,因为该文件必须以XML标记开头
  • git add。
  • git commit -m“固定语法错误”
  • gradlew assembleProdRelease
  • java -jar \ uber-apk-signer-0.8.4.jar --apks wire-prod-release-2.40.99999.apk -debug
  • adb install wire-prod-release-2.40.99999-aligned-debugSigned.apk

其他说明:

  • 由于Scala错误,母版当前无法构建...
  • 当前发行版分支会生成稳定的应用,但在点击视频图标时会导致以下错误:“ E / AudioALSAPlaybackHandlerBase:-getHardwareBufferInfo(),pcm_get_htimestamp失败,ret = -1,pcm_get_error =
  • 最新的稳定版本2.41.359无法正常工作,因为它会在每次启动以下应用程序时崩溃:“ AndroidRuntime:致命例外:Thread-4进程:com.wire,PID:29066 java.lang.NullPointerException:尝试在com.waz.call.FlowManager.request(FlowManager.java:365)上的空对象引用上调用接口方法'int com.waz.call.RequestHandler.request $ 1d4ff469()'
  • 尽管建筑物2.40.357启用了音频和视频,但它不稳定并且在接听和拨打电话时会崩溃很多。我已经与使用此代码库的其他开发人员交谈过,他们也遇到了类似的问题...

想法:

我不太确定这个项目正在发生什么。有开发人员恳求在Git上解决音频/视频问题时反应不佳。我认为,除非有更多的稳定性和支持,否则我对于将这个代码用于商业项目会感到有些不安。

答案 1 :(得分:0)

我放弃了从源代码编译可运行的应用程序。除了教育上的原因外,我从源代码进行编译的动机是特定的代码更改(因为我拥有超过2个,因此取消了android应用程序中同时帐户的限制)

进行更改本身是微不足道的,它只是在 app / src / main / scala / com / waz / zclient / pages / main / profile / preferences / pages / ProfileBottomSheetDialog.scala:

val MaxAccountsCount = 2

但是,由于无法从提供的源中构建可用的应用程序-即使付出了很大的努力-我改为使用
的smali / backsmali工具 https://github.com/JesusFreke/smali 在源代码构建的已修改和未修改(非功能性)二进制应用程序之间创建此特定代码更改的补丁/差异-反映字节码中的相应更改。 (尽管可以使用apktool来做同样的事情)

此字节码补丁程序​​也可以使用smali / backsmali(或apktool)应用到预编译且功能齐全的生产应用程序中