Android WireApp logs UnsatisfiedLink error: "wcall_set_video_send_state" when attempting video calls
Android WireApp logs UnsatisfiedLink error: "wcall_set_video_send_state" when attempting video calls
我从以下存储库构建了 wire 应用程序:
https://github.com/wireapp/wire-android
使用以下构建方向:
How to build locally Check out the wire-android repository. Switch to
latest relase branch release From the checkout folder, run ./gradlew
assembleProdRelease. This will pull in all the necessary dependencies
from Maven.
我试过版本 b运行ch:
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: did not receive expected
priority boost
Android 8:
08-24 23:10:02.190 406-4592/? E/AudioALSAPlaybackHandlerBase:
-getHardwareBufferInfo(), pcm_get_htimestamp fail, ret = -1, pcm_get_error =
Android 9 模拟器:
08-25 19:56:58.425 1583-3268/? W/audio_hw_generic: Not supplying
enough data to HAL, expected position 4108693 , only wrote 4108320
更新:
我考虑过尝试构建我自己的 AVS 库版本:遵循 https://github.com/wireapp/wire-audio-video-signaling
下面的命令需要运行:
make dist_android
C:\work\wire-audio-video-signaling>make dist-android mk/target.mk:167:
*** Unknown host system. Stop.
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:
尝试了以下方法:
- 从上面的link下载了最新版本的.aar文件
- 重命名为 avs.aar
- 安装在 app/libs
- 取消注释行:"implementation (name:'avs', ext:'aar')"
但是我得到了错误:
Program type already present: com.waz.avs.VideoCapturer
Message{kind=ERROR, text=Program type already present:
com.waz.avs.VideoCapturer, sources=[Unknown source file], tool
name=Optional.of(D8)}
下面还有一个对 AVS 库的引用,如果您将其注释掉,错误就会消失。
但是,其中 none 个步骤解决了问题。
现在我将尝试构建旧版本的发行版 b运行ch...
更新 4:版本 B运行ch:2.41.359
[最新的非测试版标记版本]
- 不再在 Android studio 中编译,因为布局目录中的某些 XML 文件格式不正确。这些必须修复并签入 Git,因为构建过程会从 Git.
签出所有文件
- 该应用程序最初 运行 运行正常并允许登录,但在编辑设备屏幕后总是崩溃。每次您尝试打开该应用程序时,该应用程序都会崩溃。
08-25 14:51:02.142 29066-29109/? E/AndroidRuntime: FATAL EXCEPTION:
Thread-4
Process: com.wire, PID: 29066
java.lang.NullPointerException: Attempt to invoke interface method 'int com.waz.call.RequestHandler.requestd4ff469()' on a null object
reference
at com.waz.call.FlowManager.request(FlowManager.java:365)
注意:似乎编辑设备屏幕不是问题的原因,因为我删除了网络应用程序中的所有设备,但随后 2.41.359 在 phone 上崩溃,没有显示编辑设备屏幕。
以下主题中提到了此问题:
- https://github.com/wireapp/wire-android/issues/1271
- https://github.com/wireapp/wire-android/issues/1288
建议似乎是使用生产版本中的 avslib.so 文件,因为提供的文件不适合 运行 项目。
所以我从他们的网站上下载了 APK:
https://wire.com/en/download/
它是版本:3.15.634 [比应用商店中的版本更旧:3.16.638,但希望这无关紧要]。
对于不了解的人,APK 只是一个 ZIP 文件,因此我将其重命名为 from .apk to .zip 以获取 libavs.so:
根目录:
库目录:
手臂目录:
提取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 不再崩溃。但是,我仍然无法发起任何音频或视频通话。在release b运行ch:
的最新版本中发现了同样的错误
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 也适用于音频和视频...]
有什么想法吗?
经过几天的尝试,我找到了一种构建项目的方法,它可以发起音频和视频通话:
程序:
- git克隆https://github.com/wireapp/wire-android.git--分支发布
- cd线-android
- git 结帐 2.40.357
- 将项目加载到 Android Studio
- 编辑文件res/layout/collection_file_asset.xml
- 将
<?xml version="1.0" encoding="utf-8"?>
移到版权注释上方,因为文件必须以 XML 标记开头
- git 添加 .
- git commit -m "fixed syntax error"
- gradlew assembleProdRelease
- java -jar \uber-apk-signer-0.8.4.jar --apks wire-prod-release-2.40.99999.apk -debug
- adb 安装 wire-prod-release-2.40.99999-aligned-debugSigned.apk
其他注意事项:
- 由于 Scala 错误,Master 当前未构建...
- 当前版本分支生成稳定的应用程序,但在点击视频图标时会导致以下错误:“E/AudioALSAPlaybackHandlerBase: -getHardwareBufferInfo(), pcm_get_htimestamp 失败, ret = -1, pcm_get_error ="
- 最新的稳定版本 2.41.359 不起作用,因为它在每次启动应用程序时崩溃:“Android运行时:致命异常:Thread-4 进程:com.wire, PID: 29066 java.lang.NullPointerException: 尝试在 com.waz.call.FlowManager.request(FlowManager.java:365)"[=41] 的空对象引用上调用接口方法 'int com.waz.call.RequestHandler.requestd4ff469()' =]
- 虽然building 2.40.357开启了音视频功能,但不稳定,接打电话经常闪退。我与使用此代码库的其他开发人员交谈过,他们遇到了类似的问题...
想法:
我不太确定这个项目发生了什么。有开发者在 Git 上请求帮助解决音频/视频问题,但几乎没有回应。我想我对将此代码用于商业项目感到有点不安,除非有更多的稳定性和支持......
我放弃了从源代码编译工作应用程序。除了教育原因,我从源代码编译的动机是一个特定的代码更改(取消 android 应用程序中同时帐户的限制,因为我有超过 2 个)
做那个改变本身是微不足道的,它只是一个定义在
app/src/main/scala/com/waz/zclient/pages/main/profile/preferences/pages/ProfileBottomSheetDialog.scala:
val MaxAccountsCount = 2
但是,由于无法从提供的源构建任何可用的应用程序 - 即使付出相当大的努力 - 我改为使用 smali/backsmali 来自
的工具
https://github.com/JesusFreke/smali
在从源代码构建的修改和未修改(非功能性)二进制应用程序之间创建此特定代码更改的 patch/diff - 反映字节码中的相应更改。 (虽然 apktool 也可以用来做同样的事情)
此字节码补丁也可以应用于预编译且功能齐全的生产应用程序,也可以使用 smali/backsmali(或 apktool)
我从以下存储库构建了 wire 应用程序: https://github.com/wireapp/wire-android
使用以下构建方向:
How to build locally Check out the wire-android repository. Switch to latest relase branch release From the checkout folder, run ./gradlew assembleProdRelease. This will pull in all the necessary dependencies from Maven.
我试过版本 b运行ch:
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: did not receive expected priority boost
Android 8:
08-24 23:10:02.190 406-4592/? E/AudioALSAPlaybackHandlerBase: -getHardwareBufferInfo(), pcm_get_htimestamp fail, ret = -1, pcm_get_error =
Android 9 模拟器:
08-25 19:56:58.425 1583-3268/? W/audio_hw_generic: Not supplying enough data to HAL, expected position 4108693 , only wrote 4108320
更新:
我考虑过尝试构建我自己的 AVS 库版本:遵循 https://github.com/wireapp/wire-audio-video-signaling
下面的命令需要运行:
make dist_android
C:\work\wire-audio-video-signaling>make dist-android mk/target.mk:167: *** Unknown host system. Stop.
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:
尝试了以下方法:
- 从上面的link下载了最新版本的.aar文件
- 重命名为 avs.aar
- 安装在 app/libs
- 取消注释行:"implementation (name:'avs', ext:'aar')"
但是我得到了错误:
Program type already present: com.waz.avs.VideoCapturer Message{kind=ERROR, text=Program type already present: com.waz.avs.VideoCapturer, sources=[Unknown source file], tool name=Optional.of(D8)}
下面还有一个对 AVS 库的引用,如果您将其注释掉,错误就会消失。
但是,其中 none 个步骤解决了问题。
现在我将尝试构建旧版本的发行版 b运行ch...
更新 4:版本 B运行ch:2.41.359 [最新的非测试版标记版本]
- 不再在 Android studio 中编译,因为布局目录中的某些 XML 文件格式不正确。这些必须修复并签入 Git,因为构建过程会从 Git. 签出所有文件
- 该应用程序最初 运行 运行正常并允许登录,但在编辑设备屏幕后总是崩溃。每次您尝试打开该应用程序时,该应用程序都会崩溃。
08-25 14:51:02.142 29066-29109/? E/AndroidRuntime: FATAL EXCEPTION: Thread-4 Process: com.wire, PID: 29066 java.lang.NullPointerException: Attempt to invoke interface method 'int com.waz.call.RequestHandler.requestd4ff469()' on a null object reference at com.waz.call.FlowManager.request(FlowManager.java:365)
注意:似乎编辑设备屏幕不是问题的原因,因为我删除了网络应用程序中的所有设备,但随后 2.41.359 在 phone 上崩溃,没有显示编辑设备屏幕。
以下主题中提到了此问题:
- https://github.com/wireapp/wire-android/issues/1271
- https://github.com/wireapp/wire-android/issues/1288
建议似乎是使用生产版本中的 avslib.so 文件,因为提供的文件不适合 运行 项目。
所以我从他们的网站上下载了 APK: https://wire.com/en/download/
它是版本:3.15.634 [比应用商店中的版本更旧:3.16.638,但希望这无关紧要]。
对于不了解的人,APK 只是一个 ZIP 文件,因此我将其重命名为 from .apk to .zip 以获取 libavs.so:
根目录:
库目录:
手臂目录:
提取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 不再崩溃。但是,我仍然无法发起任何音频或视频通话。在release b运行ch:
的最新版本中发现了同样的错误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 也适用于音频和视频...]
有什么想法吗?
经过几天的尝试,我找到了一种构建项目的方法,它可以发起音频和视频通话:
程序:
- git克隆https://github.com/wireapp/wire-android.git--分支发布
- cd线-android
- git 结帐 2.40.357
- 将项目加载到 Android Studio
- 编辑文件res/layout/collection_file_asset.xml
- 将
<?xml version="1.0" encoding="utf-8"?>
移到版权注释上方,因为文件必须以 XML 标记开头 - git 添加 .
- git commit -m "fixed syntax error"
- gradlew assembleProdRelease
- java -jar \uber-apk-signer-0.8.4.jar --apks wire-prod-release-2.40.99999.apk -debug
- adb 安装 wire-prod-release-2.40.99999-aligned-debugSigned.apk
其他注意事项:
- 由于 Scala 错误,Master 当前未构建...
- 当前版本分支生成稳定的应用程序,但在点击视频图标时会导致以下错误:“E/AudioALSAPlaybackHandlerBase: -getHardwareBufferInfo(), pcm_get_htimestamp 失败, ret = -1, pcm_get_error ="
- 最新的稳定版本 2.41.359 不起作用,因为它在每次启动应用程序时崩溃:“Android运行时:致命异常:Thread-4 进程:com.wire, PID: 29066 java.lang.NullPointerException: 尝试在 com.waz.call.FlowManager.request(FlowManager.java:365)"[=41] 的空对象引用上调用接口方法 'int com.waz.call.RequestHandler.requestd4ff469()' =]
- 虽然building 2.40.357开启了音视频功能,但不稳定,接打电话经常闪退。我与使用此代码库的其他开发人员交谈过,他们遇到了类似的问题...
想法:
我不太确定这个项目发生了什么。有开发者在 Git 上请求帮助解决音频/视频问题,但几乎没有回应。我想我对将此代码用于商业项目感到有点不安,除非有更多的稳定性和支持......
我放弃了从源代码编译工作应用程序。除了教育原因,我从源代码编译的动机是一个特定的代码更改(取消 android 应用程序中同时帐户的限制,因为我有超过 2 个)
做那个改变本身是微不足道的,它只是一个定义在 app/src/main/scala/com/waz/zclient/pages/main/profile/preferences/pages/ProfileBottomSheetDialog.scala:
val MaxAccountsCount = 2
但是,由于无法从提供的源构建任何可用的应用程序 - 即使付出相当大的努力 - 我改为使用 smali/backsmali 来自
的工具
https://github.com/JesusFreke/smali
在从源代码构建的修改和未修改(非功能性)二进制应用程序之间创建此特定代码更改的 patch/diff - 反映字节码中的相应更改。 (虽然 apktool 也可以用来做同样的事情)
此字节码补丁也可以应用于预编译且功能齐全的生产应用程序,也可以使用 smali/backsmali(或 apktool)