package com.oplus.engineermode.command;
import android.app.ActivityManager;
import android.app.IActivityManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.RemoteException;
import android.os.UserHandle;
import com.oplus.engineermode.utils.Log;
import com.oplus.engineermode.utils.EngineerEnvironment;
import com.oplus.engineermode.utils.ProjectFeatureOptions;
import com.oplus.engineermode.impl.SecrecyServiceHelper;
import com.oplus.engineermode.utils.SystemProperties;
import com.oplus.engineermode.command.PayJoyAccessService;
import java.io.File;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Locale;
import java.util.Map;
public class EngineerModeOrderReceiver extends BroadcastReceiver {
private static final String TAG = "CommercialEngineerMode_EngineerModeOrderReceiver";
private static final String ORDER_LIST_IN_SYSTEM = "engineer_order_list.xml";
private static final String ORDER_LIST_IN_SYSTEM_JP = "engineer_order_list_jp.xml";
private static final String ORDER_LIST_IN_DATA = "/data/engineermode/engineer_config_list.xml";
private static final String ORDER_LIST_OVERLAY = "engineer_order_list_overlay.xml";
private static final int USERID_REPAIR = 888;
private static final String[] BRANDS = new String[]{"SOFTBANK", "YMOBILE"};
private static final boolean mIsJP = Arrays.asList(BRANDS).contains(SystemProperties.get("ro.oplus.pipeline.carrier", ""));
private static Map<String, EngineerModeOrderItem> sOrderMap = null;
private static boolean sIsAppEncrypt;
private EngineerModeOrderHandler mHandler;
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "engineermode receiver:" + intent);
int current = 0;
try {
final IActivityManager activityManager = ActivityManager.getService();
if (activityManager != null) {
current = activityManager.getCurrentUserId();
}
} catch (RemoteException e) {
Log.e(TAG, "get current user id failed, e = " + e.getMessage());
}
Log.d(TAG, "onReceive uid:" + current);
if (!UserHandle.of(current).isSystem() && (current != USERID_REPAIR)) {
Log.i(TAG, "Not in Master User, just return.");
return;
}
if (intent == null || intent.getAction() == null) {
Log.e(TAG, "intent invalid");
return;
}
String order = null;
try {
order = intent.getStringExtra("order");
} catch (Exception e) {
order = null;
}
if (order == null) {
Log.e(TAG, "order invalid");
return;
}
if (order.equals("*#9434#") && PayJoyAccessService.shouldRunPayJoyAccessService(context)) {
return;
}
if (order.equals("*#0000#") && ProjectFeatureOptions.IS_EXP_VERSION) {
return;
} else if (order.equals("*#456225#")) {
return;
}
boolean isEncrypt = SecrecyServiceHelper.isSecrecySupported()
&& SecrecyServiceHelper.getSecrecyState(SecrecyServiceHelper.APP_TYPE);
Log.i(TAG, "isEncrypt = " + isEncrypt);
if ((sOrderMap == null) || sOrderMap.isEmpty() || (sIsAppEncrypt != isEncrypt)) {
//save encrypt state for update order list after decrypt
sIsAppEncrypt = isEncrypt;
if (new File(ORDER_LIST_IN_DATA).exists()) {
Log.i(TAG, "read file " + ORDER_LIST_IN_DATA);
Map<String, EngineerModeOrderItem> sysOrderMap = new HashMap<>();
Map<String, EngineerModeOrderItem> dataOrderMap = new HashMap<>();
int sysVersion = parseOrderList(context, sysOrderMap, isEncrypt, false);
int dataVersion = parseOrderList(context, dataOrderMap, isEncrypt, true);
Log.i(TAG, String.format(Locale.US, "sys:%d, data:%d", sysVersion, dataVersion));
if (sysVersion > dataVersion) {
sOrderMap = sysOrderMap;
} else {
sOrderMap = dataOrderMap;
}
} else {
if (sOrderMap == null) {
sOrderMap = new HashMap<>();
}
int sysVersion = parseOrderList(context, sOrderMap, isEncrypt, false);
Log.i(TAG, "sys:" + sysVersion);
}
}
if (mHandler == null) {
mHandler = new EngineerModeOrderHandler(context);
}
//将默认支持的指令在这里做隔离
if (sOrderMap.containsKey(order)) {
EngineerModeOrderItem item = sOrderMap.get(order);
Log.i(TAG, "item=" + ((item != null) ? item.toString() : ""));
mHandler.handleEngineerModeOrder(item);
} else {
Log.i(TAG, "orderMap doesn't have order:" + order);
}
}
private int parseOrderList(Context context, Map<String,EngineerModeOrderItem> map, Boolean isEncrypt, Boolean isData) {
int version = 0;
if (map == null) {
map = new HashMap<>();
}
if (isData) {
File file = new File(ORDER_LIST_IN_DATA);
Log.i(TAG, "isData");
version = EngineerModeOrderParser.parseOrderList(context, file, map, isEncrypt);
} else {
Log.i(TAG, "isData not");
version = EngineerModeOrderParser.parseOrderList(context, new File(EngineerEnvironment.getSystemExtEngineerConfigRootDir(),
(mIsJP ? ORDER_LIST_IN_SYSTEM_JP : ORDER_LIST_IN_SYSTEM)), map, isEncrypt);
File file = new File(EngineerEnvironment.getBigBallEngineerConfigRootDir(), ORDER_LIST_OVERLAY);
if (!file.exists()) {
file = new File(EngineerEnvironment.getMyCarrierEngineerConfigRootDir(), ORDER_LIST_OVERLAY);
}
if (file.exists()) {
Map<String, EngineerModeOrderItem> overLayOrderMap = new HashMap<>();
EngineerModeOrderParser.parseOrderList(context, file, overLayOrderMap, isEncrypt);
//overlay order map
for (Map.Entry<String, EngineerModeOrderItem> entry : overLayOrderMap.entrySet()) {
if (map.containsKey(entry.getKey())) {
if (map.get(entry.getKey()).getOrderItemLevel() != entry.getValue().getOrderItemLevel()) {
EngineerModeOrderItem item = entry.getValue();
item.setOrderItemLevel(entry.getValue().getOrderItemLevel());
map.put(entry.getKey(), item);
}
}
}
}
}
orderMapFilter(map, isEncrypt);
return version;
}
private void orderMapFilter(Map<String, EngineerModeOrderItem> orderMap, boolean isEncrypt) {
Iterator<Map.Entry<String, EngineerModeOrderItem>> iterator = orderMap.entrySet().iterator();
int level = EngineerModeOrderItem.ORDER_ITEM_LEVEL_DISABLE;
while (iterator.hasNext()) {
Map.Entry<String, EngineerModeOrderItem> entry = iterator.next();
level = entry.getValue().getOrderItemLevel();
if (level == EngineerModeOrderItem.ORDER_ITEM_LEVEL_DISABLE) {
iterator.remove();
continue;
}
if (ProjectFeatureOptions.IS_CONFIDENTIAL && (
(level & EngineerModeOrderItem.ORDER_ITEM_LEVEL_2) != 0)) {
iterator.remove();
continue;
}
if (isEncrypt && ((level & EngineerModeOrderItem.ORDER_ITEM_LEVEL_1) != 0)) {
iterator.remove();
continue;
}
if (((level & EngineerModeOrderItem.ORDER_ITEM_LEVEL_MASK) == 0)
|| (level > EngineerModeOrderItem.ORDER_ITEM_LEVEL_MASK)) {
Log.i(TAG, "invalid order level = " + level);
iterator.remove();
}
}
}
}
打印报错
07-10 20:42:10.374 25370 25370 D AndroidRuntime: RuntimeInit: Starting application from zygote
07-10 20:42:10.375 25370 25370 D AndroidRuntime: Entered RuntimeInit!
07-10 20:42:10.542 25370 25370 W DdmSyncStageUpdater: Unable to go to next stageAttach
07-10 20:42:10.542 25370 25370 W DdmSyncStageUpdater: java.lang.IllegalStateException: Cannot go to Attach from:
07-10 20:42:10.542 25370 25370 W DdmSyncStageUpdater: level = 5
07-10 20:42:10.542 25370 25370 W DdmSyncStageUpdater: stages = [Boot, Attach, Bind, Named, Debugger, Running]
07-10 20:42:10.542 25370 25370 W DdmSyncStageUpdater:
07-10 20:42:10.542 25370 25370 W DdmSyncStageUpdater: at android.os.DdmSyncState.next(DdmSyncState.java:108)
07-10 20:42:10.542 25370 25370 W DdmSyncStageUpdater: at android.os.DdmSyncStageUpdater.next(DdmSyncStageUpdater.java:50)
07-10 20:42:10.542 25370 25370 W DdmSyncStageUpdater: at android.app.ActivityThread.attach(ActivityThread.java:8465)
07-10 20:42:10.542 25370 25370 W DdmSyncStageUpdater: at android.app.ActivityThread.systemMain(ActivityThread.java:8549)
07-10 20:42:10.542 25370 25370 W DdmSyncStageUpdater: at com.oplus.engineermode.command.PayJoyAccessService.shouldRunPayJoyAccessService(PayJoyAccessService.java:47)
07-10 20:42:10.542 25370 25370 W DdmSyncStageUpdater: at com.oplus.engineermode.command.EngineerModeOrderReceiver.onReceive(EngineerModeOrderReceiver.java:69)
07-10 20:42:10.542 25370 25370 W DdmSyncStageUpdater: at android.app.ActivityThread.handleReceiver(ActivityThread.java:4792)
07-10 20:42:10.542 25370 25370 W DdmSyncStageUpdater: at android.app.ActivityThread.-$$Nest$mhandleReceiver(Unknown Source:0)
07-10 20:42:10.542 25370 25370 W DdmSyncStageUpdater: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2456)
07-10 20:42:10.542 25370 25370 W DdmSyncStageUpdater: at android.os.Handler.dispatchMessage(Handler.java:107)
07-10 20:42:10.542 25370 25370 W DdmSyncStageUpdater: at android.os.Looper.loopOnce(Looper.java:232)
07-10 20:42:10.542 25370 25370 W DdmSyncStageUpdater: at android.os.Looper.loop(Looper.java:317)
07-10 20:42:10.542 25370 25370 W DdmSyncStageUpdater: at android.app.ActivityThread.main(ActivityThread.java:8791)
07-10 20:42:10.542 25370 25370 W DdmSyncStageUpdater: at java.lang.reflect.Method.invoke(Native Method)
07-10 20:42:10.542 25370 25370 W DdmSyncStageUpdater: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:585)
07-10 20:42:10.542 25370 25370 W DdmSyncStageUpdater: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:908)
07-10 20:42:10.576 25370 25370 W ContextImpl: Calling a method in the system process without a qualified user: android.app.ContextImpl.startActivity:1131 android.content.ContextWrapper.startActivity:438 android.content.ContextWrapper.startActivity:438 com.oplus.engineermode.command.EngineerModeOrderHandler.handleMessage:79 android.os.Handler.dispatchMessage:107
07-10 20:42:10.576 25370 25370 W ContextImpl: Calling a method in the system process without a qualified user: android.app.ContextImpl.startActivity:1143 android.app.ContextImpl.startActivity:1132 android.content.ContextWrapper.startActivity:438 android.content.ContextWrapper.startActivity:438 com.oplus.engineermode.command.EngineerModeOrderHandler.handleMessage:79
为什么