IllegalAccessError only on Android 9 inside AsyncTask
IllegalAccessError only on Android 9 inside AsyncTask
IllegalAccessError 仅在 Android 9 发生在 AsyncTask 函数期间
Android9 有什么事要做吗?其他版本都可以。
生产应用程序上出现错误。
我已经尝试制作所有东西 public,并且在同一个包中。此错误在版本 9 上仍然存在。
new TestTask(this, "test", true).execute(value);
public class TestTask extends AsyncTask<String, Void, String> {
private String param1;
private boolean param2;
private String number;
private WeakReference<Context> appReference;
TestTask(Context context, String param1, boolean param2) {
this.appReference = new WeakReference<>(context);
this.param1 = param1;
this.param2 = param2;
}
@Override
public String doInBackground(String... values) {
try {
number = values[0];
if(param2)
performVib();
ResponseEvent response = new TestSnmp(param1).set(number);
if( appReference.get()!=null && m_debugMode) {
Toast.makeText(appReference.get(), "Response: " + response, Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
public void onPostExecute(String result) {
super.onPostExecute(result);
try {
if( appReference.get()!=null ) {
Toast.makeText(appReference.get(), "Some text", Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
这是堆栈:
java.lang.RuntimeException:
at android.os.AsyncTask.done (AsyncTask.java:354)
at java.util.concurrent.FutureTask.finishCompletion (FutureTask.java:383)
at java.util.concurrent.FutureTask.setException (FutureTask.java:252)
at java.util.concurrent.FutureTask.run (FutureTask.java:271)
at android.os.AsyncTask$SerialExecutor.run (AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:641)
at java.lang.Thread.run (Thread.java:764)
Caused by: java.lang.IllegalAccessError:
at xxx.TestTask.doInBackground (TestTask.java)
at xxx.TestTask.doInBackground (TestTask.java)
at android.os.AsyncTask.call (AsyncTask.java:333)
at java.util.concurrent.FutureTask.run (FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor.run (AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:641)
at java.lang.Thread.run (Thread.java:764)
我将构造函数从 Bbox Send 更改为 TestTask,运行 Android 9 上的代码。它正在运行。
我发现问题来自 Proguard。
我在 proguard-rules.pro 中添加了这一行:
-保持 class org.snmp4j.** {*;}
它现在似乎可以工作了!
IllegalAccessError 仅在 Android 9 发生在 AsyncTask 函数期间
Android9 有什么事要做吗?其他版本都可以。
生产应用程序上出现错误。
我已经尝试制作所有东西 public,并且在同一个包中。此错误在版本 9 上仍然存在。
new TestTask(this, "test", true).execute(value);
public class TestTask extends AsyncTask<String, Void, String> {
private String param1;
private boolean param2;
private String number;
private WeakReference<Context> appReference;
TestTask(Context context, String param1, boolean param2) {
this.appReference = new WeakReference<>(context);
this.param1 = param1;
this.param2 = param2;
}
@Override
public String doInBackground(String... values) {
try {
number = values[0];
if(param2)
performVib();
ResponseEvent response = new TestSnmp(param1).set(number);
if( appReference.get()!=null && m_debugMode) {
Toast.makeText(appReference.get(), "Response: " + response, Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
public void onPostExecute(String result) {
super.onPostExecute(result);
try {
if( appReference.get()!=null ) {
Toast.makeText(appReference.get(), "Some text", Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
这是堆栈:
java.lang.RuntimeException:
at android.os.AsyncTask.done (AsyncTask.java:354)
at java.util.concurrent.FutureTask.finishCompletion (FutureTask.java:383)
at java.util.concurrent.FutureTask.setException (FutureTask.java:252)
at java.util.concurrent.FutureTask.run (FutureTask.java:271)
at android.os.AsyncTask$SerialExecutor.run (AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:641)
at java.lang.Thread.run (Thread.java:764)
Caused by: java.lang.IllegalAccessError:
at xxx.TestTask.doInBackground (TestTask.java)
at xxx.TestTask.doInBackground (TestTask.java)
at android.os.AsyncTask.call (AsyncTask.java:333)
at java.util.concurrent.FutureTask.run (FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor.run (AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:641)
at java.lang.Thread.run (Thread.java:764)
我将构造函数从 Bbox Send 更改为 TestTask,运行 Android 9 上的代码。它正在运行。
我发现问题来自 Proguard。
我在 proguard-rules.pro 中添加了这一行: -保持 class org.snmp4j.** {*;} 它现在似乎可以工作了!