如何在Android BroadcastReceiver中使用Jsoup时解决“UnsatisfiedLinkError”?

时间:2018-01-24 12:26:06

标签: java android broadcastreceiver jsoup

我在做什么:

我的应用(带有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并得到相同的错误,但现在由于URLConnection而不是 Jsoup
  5. 使用Thread类而不是AsyncTask,但仍然遇到同样的错误。
  6. 我的尝试提示该错误与 Jsoup 并不真正相关,它与在应用未运行时从接收器连接到互联网有关!

    我猜这个HttpTracker$Connection.nextId()存在一个导入问题,当我的应用没有运行时会发生这种情况。

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

1 个答案:

答案 0 :(得分:3)

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