CrackMe.apk
Download file
package com.facebook.react.bridge;
import com.facebook.common.logging.FLog;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Stack;
public final class FallbackJSBundleLoader extends JSBundleLoader {
static final String RECOVERABLE = "facebook::react::Recoverable";
static final String TAG = "FallbackJSBundleLoader";
private Stack<JSBundleLoader> mLoaders = new Stack<>();
private final ArrayList<Exception> mRecoveredErrors = new ArrayList<>();
public FallbackJSBundleLoader(List<JSBundleLoader> list) {
ListIterator<JSBundleLoader> listIterator = list.listIterator(list.size());
while (listIterator.hasPrevious()) {
this.mLoaders.push(listIterator.previous());
}
}
public String loadScript(JSBundleLoaderDelegate jSBundleLoaderDelegate) {
while (true) {
try {
return getDelegateLoader().loadScript(jSBundleLoaderDelegate);
} catch (Exception e) {
if (e.getMessage() == null || !e.getMessage().startsWith(RECOVERABLE)) {
throw e;
}
this.mLoaders.pop();
this.mRecoveredErrors.add(e);
FLog.wtf(TAG, "Falling back from recoverable error", (Throwable) e);
}
}
throw e;
}
private JSBundleLoader getDelegateLoader() {
if (!this.mLoaders.empty()) {
return this.mLoaders.peek();
}
Throwable runtimeException = new RuntimeException("No fallback options available");
Iterator<Exception> it = this.mRecoveredErrors.iterator();
Throwable th = runtimeException;
while (it.hasNext()) {
th.initCause(it.next());
while (th.getCause() != null) {
th = th.getCause();
}
}
throw runtimeException;
}
}
Download file