【问题标题】:How to solve "UnsatisfiedLinkError" while using Jsoup in an Android BroadcastReceiver?在 Android BroadcastReceiver 中使用 Jsoup 时如何解决“UnsatisfiedLinkError”?
【发布时间】:2018-07-03 11:55:59
【问题描述】:

我在做什么:

我的应用程序(带有minSdkVersion 15 的Android)中,我有一个BroadcastReceiver 来监听Intent.ACTION_PACKAGE_ADDED(设备上已经安装了一个新的应用程序包)。每当发生这种情况时,接收方都会尝试使用 Jsoup 从互联网获取一些数据。


问题:

只要当我安装另一个应用程序(例如来自 Play 商店)时,我的应用程序在后台运行,我的代码就可以正常工作。但是,如果我杀死 我的应用 然后安装另一个应用,我的应用 崩溃并显示“我的应用已停止”对话框(因为我的接收器崩溃)以及此错误:

No implementation found for long com.android.tools.profiler.support.network.HttpTracker$Connection.nextId() (tried Java_com_android_tools_profiler_support_network_HttpTracker_00024Connection_nextId and Java_com_android_tools_profiler_support_network_HttpTracker_00024Connection_nextId__)
FATAL EXCEPTION: AsyncTask #1
Process: com.myorg.myapp, PID: 11796
java.lang.RuntimeException: An error occurred while executing doInBackground()
    at android.os.AsyncTask$3.done(AsyncTask.java:325)
    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
    at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
    at java.util.concurrent.FutureTask.run(FutureTask.java:242)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
    at java.lang.Thread.run(Thread.java:761)
Caused by: java.lang.UnsatisfiedLinkError: No implementation found for long com.android.tools.profiler.support.network.HttpTracker$Connection.nextId() (tried Java_com_android_tools_profiler_support_network_HttpTracker_00024Connection_nextId and Java_com_android_tools_profiler_support_network_HttpTracker_00024Connection_nextId__)
    at com.android.tools.profiler.support.network.HttpTracker$Connection.nextId(Native Method)
    at com.android.tools.profiler.support.network.HttpTracker$Connection.<init>(HttpTracker.java:191)
    at com.android.tools.profiler.support.network.HttpTracker$Connection.<init>(HttpTracker.java:186)
    at com.android.tools.profiler.support.network.HttpTracker.trackConnection(HttpTracker.java:280)
    at com.android.tools.profiler.support.network.httpurl.TrackedHttpURLConnection.<init>(TrackedHttpURLConnection.java:49)
    at com.android.tools.profiler.support.network.httpurl.HttpsURLConnection$.<init>(HttpsURLConnection$.java:50)
    at com.android.tools.profiler.support.network.httpurl.HttpURLWrapper.wrapURLConnectionHelper(HttpURLWrapper.java:40)
    at com.android.tools.profiler.support.network.httpurl.HttpURLWrapper.wrapURLConnection(HttpURLWrapper.java:55)
    at org.jsoup.helper.HttpConnection$Response.createConnection(HttpConnection.java:889)
    at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:727)
    at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:706)
    at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:299)
    at org.jsoup.helper.HttpConnection.get(HttpConnection.java:288)
    at com.myorg.myapp.InstallReceiver$PlayStoreFetcher.doInBackground(InstallReceiver.java:76)
    at com.myorg.myapp.InstallReceiver$PlayStoreFetcher.doInBackground(InstallReceiver.java:70)
    at android.os.AsyncTask$2.call(AsyncTask.java:305)
    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
    at java.lang.Thread.run(Thread.java:761)

我的代码:

InstallReceiver.java:

public class InstallReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED)) {
            String data = new FetchData().execute("URL").get();

            // The rest of my code...
        }
    }

    private static class FetchData extends AsyncTask<String, Integer, String> {    
        @Override
        protected String doInBackground(String... strings) {
            try {
                // This is the cause of the problem
                return Jsoup.connect(strings[0]).get().text();
            } catch (Exception e) {
                return null;
            }
        }
    }
}

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.myorg.myapp">

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name=".Activities.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".Activities.PlayStoreActivity"/>
        <activity android:name=".Activities.InstalledAppsActivity"/>
        <activity android:name=".Activities.PredefinedFiltersActivity"/>

        // This is linking my InstallReceiver.java
        <receiver android:name=".InstallReceiver">
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_ADDED" />
                <data android:scheme="package" />
            </intent-filter>
        </receiver>
    </application>
</manifest>

build.gradle:

dependencies {
    compile 'org.jsoup:jsoup:1.11.2'

    // The rest of my dependencies...
}

我的尝试:

  1. 我用一般的catch (Exception e) 语句包围了 Jsoup 调用,但仍然抛出错误。
  2. 我查看了这个错误并找到了一些答案,例如 this onethis one,但似乎都没有解决我的问题。
  3. 我将 Jsoup 调用移至 IntentService 并从我的 InstallReceiver 启动该服务,但仍然抛出相同的错误(来自该服务)。
  4. 尝试使用 (new URL(url)).openConnection() 获取 HTML 并得到相同的错误,但现在不是 Jsoup 而是因为 URLConnection 而显示。
  5. 使用了Thread 类而不是AsyncTask,但仍然出现同样的错误。

我的尝试暗示该错误与 Jsoup 并没有真正的关系,它与应用程序未运行时从接收器连接到互联网有关!

我猜这个HttpTracker$Connection.nextId() 存在导入问题,当我的应用程序 没有运行时。

知道如何解决这个问题吗?

【问题讨论】:

  • 尝试调试时设备已连接?如果是这样,您的堆栈跟踪显示您的 android studio 网络分析器可能有问题您应该向source.android.com/setup/report-bugs 报告并升级您的工作室,如果这无助于尝试使用将日志写入文件进行调试
  • @crazyPixel 即使设备未连接到 Android Studio,我也会遇到同样的错误。我使用logcat应用检查了错误,它是一样的。
  • 您支持的最低 SDK 级别是多少?
  • @crazyPixel minSdkVersion 15
  • 你能尝试另一种方式来完成任务吗?尝试使用 HttpClient 获取 HTML 内容并使用 Jsoup.parse(html).text() (stackoverflow.com/questions/6503574/…) 解析 HTML

标签: java android broadcastreceiver jsoup


【解决方案1】:

这通常发生在您尝试读取不存在的 dll/so 文件时。
由于您所做的事情非常标准,因此问题可能出在 android studio 而不是您的代码上。
要解决它 - 只需将最小 sdk 提高到 20(或更多)。 (高级网络分析器崩溃,这是因为版本 20 不支持它)。

【讨论】:

  • 你是对的。即使设备未连接到 Android Studio 时出现错误,但它似乎与 Android Studio 编译到应用程序本身的某些内容有关。
  • 我第一次将minSdkVersion 提高到 21 并没有帮助。但是,当我删除我的项目并清除 Android Studio 的所有痕迹,然后克隆我的项目代码并在将 minSdkVersion 设置为 21 后构建应用程序时......然后它工作了!谢谢:)
  • 但你不应该将你的 min SDK 设置为 21,现在它最多应该是 16,我认为问题出在你的 gradle 文件中。您可以将项目级别和模块级别的 build.gradle 文件都添加到您的 Q 中吗?
  • @OmarEinea C++ 编译器在链接动态库代码失败时会抛出此错误,因为 android studio 最终只是一个应用程序,它也有一些错误,下一次;)
猜你喜欢
  • 1970-01-01
  • 2019-07-11
  • 1970-01-01
  • 2021-01-09
  • 2014-11-07
  • 1970-01-01
  • 1970-01-01
  • 2013-03-26
  • 1970-01-01
相关资源
最近更新 更多