public static void deleteFile(@NonNull File file) { final boolean deleted = file.delete(); if (!deleted) { ACRA.log.w(LOG_TAG, "Could not delete file: " + file); } }
@Override public <T extends Plugin> List<T> load(@NonNull Class<T> clazz) { List<T> list = new ArrayList<>(); if (ACRA.DEV_LOGGING) ACRA.log.d(LOG_TAG, "SimplePluginLoader loading services from plugin classes : " + plugins); for (Class<? extends Plugin> plugin : plugins) { if (clazz.isAssignableFrom(plugin)) { try { //noinspection unchecked list.add((T) plugin.newInstance()); if (ACRA.DEV_LOGGING) ACRA.log.d(LOG_TAG, "Loaded plugin from class : " + plugin); } catch (Exception e) { if (ACRA.DEV_LOGGING) ACRA.log.w(LOG_TAG, "Could not load plugin from class : " + plugin, e); } } } return list; }
private <T extends Plugin> List<T> loadInternal(@NonNull Class<T> clazz, Predicate<T> shouldLoadPredicate) { List<T> plugins = new ArrayList<>(); //noinspection ForLoopReplaceableByForEach final ServiceLoader<T> serviceLoader = ServiceLoader.load(clazz, getClass().getClassLoader()); if (ACRA.DEV_LOGGING) ACRA.log.d(LOG_TAG, "ServicePluginLoader loading services from ServiceLoader : " + serviceLoader); for (final Iterator<T> iterator = serviceLoader.iterator(); iterator.hasNext(); ) { try { final T plugin = iterator.next(); if (shouldLoadPredicate.apply(plugin)) { if (ACRA.DEV_LOGGING) ACRA.log.d(ACRA.LOG_TAG, "Loaded " + clazz.getSimpleName() + " of type " + plugin.getClass().getName()); plugins.add(plugin); } else { if (ACRA.DEV_LOGGING) ACRA.log.d(LOG_TAG, "Ignoring disabled " + clazz.getSimpleName() + " of type " + plugin.getClass().getSimpleName()); } } catch (ServiceConfigurationError e) { ACRA.log.e(ACRA.LOG_TAG, "Unable to load " + clazz.getSimpleName(), e); } } if (ACRA.DEV_LOGGING) ACRA.log.d(LOG_TAG, "Found services (" + plugins + ") for class : " + clazz); return plugins; } }
@SuppressWarnings("WeakerAccess") protected void handleResponse(int responseCode, String responseMessage) throws IOException { if (ACRA.DEV_LOGGING) ACRA.log.d(LOG_TAG, "Request response : " + responseCode + " : " + responseMessage); if (responseCode >= HttpURLConnection.HTTP_OK && responseCode < HttpURLConnection.HTTP_MULT_CHOICE) { // All is good ACRA.log.i(LOG_TAG, "Request received by server"); } else if (responseCode == HttpURLConnection.HTTP_CLIENT_TIMEOUT || responseCode >= HttpURLConnection.HTTP_INTERNAL_ERROR) { //timeout or server error. Repeat the request later. ACRA.log.w(LOG_TAG, "Could not send ACRA Post responseCode=" + responseCode + " message=" + responseMessage); throw new IOException("Host returned error code " + responseCode); } else if (responseCode >= HttpURLConnection.HTTP_BAD_REQUEST) { // Client error. The request must not be repeated. Discard it. ACRA.log.w(LOG_TAG, responseCode + ": Client error - request will be discarded"); } else { ACRA.log.w(LOG_TAG, "Could not send ACRA Post - request will be discarded. responseCode=" + responseCode + " message=" + responseMessage); } } }
/** * pass-through to default handler * * @param t the crashed thread * @param e the uncaught exception */ public void handReportToDefaultExceptionHandler(@Nullable Thread t, @NonNull Throwable e) { if (defaultExceptionHandler != null) { ACRA.log.i(LOG_TAG, "ACRA is disabled for " + context.getPackageName() + " - forwarding uncaught Exception on to default ExceptionHandler"); defaultExceptionHandler.uncaughtException(t, e); } else { ACRA.log.e(LOG_TAG, "ACRA is disabled for " + context.getPackageName() + " - no default ExceptionHandler"); ACRA.log.e(LOG_TAG, "ACRA caught a " + e.getClass().getSimpleName() + " for " + context.getPackageName(), e); } }
@Override public void onActivityDestroyed(@NonNull Activity activity) { if (ACRA.DEV_LOGGING) ACRA.log.d(LOG_TAG, "onActivityDestroyed " + activity.getClass()); } });
if(ACRA.DEV_LOGGING)ACRA.log.d(LOG_TAG, "Calling collector " + collector.getClass().getName()); collector.collect(context, config, builder, crashReportData); if(ACRA.DEV_LOGGING)ACRA.log.d(LOG_TAG, "Collector " + collector.getClass().getName() + " completed"); }catch (CollectorException e){ ACRA.log.w(LOG_TAG, e); }catch (Exception t) { ACRA.log.e(LOG_TAG, "Error in collector " + collector.getClass().getSimpleName(), t);
if (senderServiceProcess) { if (ACRA.DEV_LOGGING) log.d(LOG_TAG, "Not initialising ACRA to listen for uncaught Exceptions as this is the SendWorker process and we only send reports, we don't capture them to avoid infinite loops"); if (!supportedAndroidVersion) { log.w(LOG_TAG, "ACRA 5.1.0+ requires ICS or greater. ACRA is disabled and will NOT catch crashes or send messages."); log.w(LOG_TAG, "ACRA#init called more than once. This might have unexpected side effects. Doing this outside of tests is discouraged."); if(DEV_LOGGING) log.d(LOG_TAG, "Removing old ACRA config..."); ((ErrorReporterImpl) errorReporterSingleton).unregister(); errorReporterSingleton = StubCreator.createErrorReporterStub(); log.e(LOG_TAG, "ACRA#init called but no CoreConfiguration provided"); return; log.i(LOG_TAG, "ACRA is " + (enableAcra ? "enabled" : "disabled") + " for " + app.getPackageName() + ", initializing..."); ErrorReporterImpl reporter = new ErrorReporterImpl(app, config, enableAcra, supportedAndroidVersion, checkReportsOnApplicationStart); errorReporterSingleton = reporter;
ACRA.log.v(LOG_TAG, "ACRA is disabled. Report not sent."); return; ACRA.log.w(LOG_TAG, "ReportingAdministrator " + administrator.getClass().getName() + " threw exception", t); ACRA.log.w(LOG_TAG, "ReportingAdministrator " + administrator.getClass().getName() + " threw exception", t); if (ACRA.DEV_LOGGING) ACRA.log.d(LOG_TAG, "Not collecting crash report because of ReportingAdministrator " + blockingAdministrator.getClass().getName()); ACRA.log.w(LOG_TAG, "ReportingAdministrator " + administrator.getClass().getName() + " threw exception", t); if (ACRA.DEV_LOGGING) ACRA.log.d(LOG_TAG, "Not sending crash report because of ReportingAdministrator " + blockingAdministrator.getClass().getName()); try { blockingAdministrator.notifyReportDropped(context, config); } catch (Exception t) { ACRA.log.w(LOG_TAG, "ReportingAdministrator " + blockingAdministrator.getClass().getName() + " threw exeption", t); if (ACRA.DEV_LOGGING) ACRA.log.d(LOG_TAG, "Wait for Interactions + worker ended. Kill Application ? " + reportBuilder.isEndApplication()); ACRA.log.w(LOG_TAG, "ReportingAdministrator " + administrator.getClass().getName() + " threw exception", t); Looper.loop(); }).start(); ACRA.log.w(LOG_TAG, warning); } else { endApplication(reportBuilder.getUncaughtExceptionThread(), reportBuilder.getException());
/** * {@inheritDoc} */ @Override public void setEnabled(boolean enabled) { if (supportedAndroidVersion) { ACRA.log.i(LOG_TAG, "ACRA is " + (enabled ? "enabled" : "disabled") + " for " + context.getPackageName()); reportExecutor.setEnabled(enabled); } else { ACRA.log.w(LOG_TAG, "ACRA requires ICS or greater. ACRA is disabled and will NOT catch crashes or send messages."); } }
void migrate() { ACRA.log.i(LOG_TAG, "Migrating unsent ACRA reports to new file locations"); final File[] reportFiles = getCrashReportFiles(); for (final File file : reportFiles) { // Move it to unapproved or approved folders. final String fileName = file.getName(); if (fileNameParser.isApproved(fileName)) { if (file.renameTo(new File(reportLocator.getApprovedFolder(), fileName))) { if (ACRA.DEV_LOGGING) ACRA.log.d(LOG_TAG, "Cold not migrate unsent ACRA crash report : " + fileName); } } else { if (file.renameTo(new File(reportLocator.getUnapprovedFolder(), fileName))) { if (ACRA.DEV_LOGGING) ACRA.log.d(LOG_TAG, "Cold not migrate unsent ACRA crash report : " + fileName); } } } ACRA.log.i(LOG_TAG, "Migrated " + reportFiles.length + " unsent reports"); }
@Override public InputStream getInputStream(@NonNull Context context) { try { return new FileInputStream(filePath); } catch (FileNotFoundException e) { ACRA.log.e(LOG_TAG, "Could not find File "+filePath, e); } return null; } }
@Override public void onActivityStarted(@NonNull Activity activity) { if (ACRA.DEV_LOGGING) ACRA.log.d(LOG_TAG, "onActivityStarted " + activity.getClass()); }
final CrashReportPersister persister = new CrashReportPersister(); try { if (ACRA.DEV_LOGGING) ACRA.log.d(LOG_TAG, "Add user comment to " + reportFile); final CrashReportData crashData = persister.load(reportFile); crashData.put(USER_COMMENT, comment.toString()); persister.store(crashData, reportFile); } catch (@NonNull IOException | JSONException e) { ACRA.log.w(LOG_TAG, "User comment not added: ", e); if (ACRA.DEV_LOGGING) ACRA.log.d(ACRA.LOG_TAG, "Discarding reports"); new BulkReportDeleter(context).deleteReports(false, 0); break; ACRA.log.e(LOG_TAG, "Failed to handle notification action", t);
void convert() { ACRA.log.i(LOG_TAG, "Converting unsent ACRA reports to json"); final ReportLocator locator = new ReportLocator(context); final CrashReportPersister persister = new CrashReportPersister(); if (ACRA.DEV_LOGGING) ACRA.log.d(LOG_TAG, "Tried to convert already converted report file " + report.getPath() + ". Ignoring"); } catch (Exception t) { ACRA.log.w(LOG_TAG, "Unable to read report file " + report.getPath() + ". Deleting", e); IOUtils.deleteFile(report); ACRA.log.i(LOG_TAG, "Converted " + converted + " unsent reports");
@Override public InputStream getInputStream(@NonNull Context context) { try { return context.getAssets().open(assetName); } catch (IOException e) { ACRA.log.e(LOG_TAG, "Could not open certificate in asset://"+assetName, e); } return null; } }
ACRA.log.i(LOG_TAG, "Sending report " + reportFile); try { final CrashReportPersister persister = new CrashReportPersister(); return true; } catch (RuntimeException e) { ACRA.log.e(LOG_TAG, "Failed to send crash reports for " + reportFile, e); IOUtils.deleteFile(reportFile); } catch (IOException e) { ACRA.log.e(LOG_TAG, "Failed to load crash report for " + reportFile, e); IOUtils.deleteFile(reportFile); } catch (JSONException e) { ACRA.log.e(LOG_TAG, "Failed to load crash report for " + reportFile, e); IOUtils.deleteFile(reportFile); } catch (ReportSenderException e) { ACRA.log.e(LOG_TAG, "Failed to send crash report for " + reportFile, e);
public synchronized void put(@NonNull String key, double value) { try { content.put(key, value); } catch (JSONException e) { ACRA.log.w(ACRA.LOG_TAG, "Failed to put value into CrashReportData: " + String.valueOf(value)); } }
/** * Returns an array containing the names of pending crash report files. * * @return an array containing the names of pending crash report files. */ @NonNull private File[] getCrashReportFiles() { final File dir = context.getFilesDir(); if (dir == null) { ACRA.log.w(LOG_TAG, "Application files directory does not exist! The application may not be installed correctly. Please try reinstalling."); return new File[0]; } if (ACRA.DEV_LOGGING) ACRA.log.d(LOG_TAG, "Looking for error files in " + dir.getAbsolutePath()); // Filter for ".stacktrace" files final FilenameFilter filter = (dir1, name) -> name.endsWith(ACRAConstants.REPORTFILE_EXTENSION); final File[] result = dir.listFiles(filter); return (result == null) ? new File[0] : result; }