目前遇到一个问题,基于8155芯片开发的Android 9系统进入开发者权限,要输入pin码,进行了表面加锁。
进入开发者权限要这个Pin码,这个PIN码具体像是 Android 9 系统在开发者选项中启用的 OEM锁,尝试过电脑公对公连接Android 9没有反应。和安装其他软件也被锁黑名单 。目前只有U盘有反应。U盘只能安装酷狗,其他任何软件都被锁了。
没有任何实体按键,所以没有办法进行硬重置设备。也进入不了 recovery 模式,或者通过 volume 键与 power 键的组合键进入 recovery 界面
车机没有串口吗?
可以试试这个
1. 输入adb shell
2. 返回的结果是device not found,在连接机器的情况下,输入lsusb,
3. 将机器与pc端断开,继续输入lsusb,返回结果
4. 对比2和3返回结果,可以看出所连机器的VID和PID分别为9bb5和0c01:
5. 编辑文件/etc/udev/rules.d/目录下的文件,我的文件为70-persistent-net.rules,将该机器的VID和PID按如下格式输入
ATTRS{idVendor}==“your VID", ATTRS{idProduct}=="your PID",
6. 添加完成后,如果输入adb shell后返回结果依然是device not found,可以编辑~/.android/adb_usb.ini文件,将VID添加进去,如图
7.添加完成后,输入adb shell查看连接情况,如果返回结果为
试试以下方法
重置设备:虽然您说目前没有任何实体按键,但有些设备会在设备背面或指定位置提供重置按钮或孔。可以查看设备的用户手册或官方网站以了解更有关该设备的重置方式。
联系设备制造商:如果您不能找到设备的重置按钮并且不能进入 recovery 模式,则建议直接联系设备制造商。他们可以提供更详细的故障排除和设备维修建议。
尝试使用 Android Debug Bridge(ADB):如果设备支持 adb 访问,您可以尝试使用该工具启用和关闭 OEM 锁。可以在命令行中键入以下内容:
adb reboot bootloader
此命令将使设备进入 fastboot 模式。进入后,可以键入以下命令以启用OEM锁:
fastboot oem lock
然后可以重新启动设备并尝试使用解锁 PIN 码的方法来解决问题。
import android.util.Log;
import android.content.pm.PackageManager;
import android.content.pm.ApplicationInfo;
import android.net.LocalServerSocket;
import java.io.File;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.DataOutputStream;
public class DebugServer {
public static final String TAG = "XD_GDB"; // string used for Log.x (the colon helps cut out false positives)
private static Process m_debuggerProcess = null; // debugger process
private static void debugLog(String msg) {
Log.i(TAG, msg);
}
//do not use this or IDE will fail to connect to debug server
public static String flushLog() {
try {
String command = "logcat -d";
Process process = Runtime.getRuntime().exec(command);
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
StringBuilder log=new StringBuilder();
String line = "";
while ((line = bufferedReader.readLine()) != null) {
log.append(line + System.lineSeparator());
}
//process.waitFor();
bufferedReader.close();
return log.toString();
} catch (IOException e) {
// Handle Exception
}
return "";
}
private static class DebugWaitRunnable implements Runnable {
public DebugWaitRunnable(String pingPongSocket) throws IOException {
socket = new LocalServerSocket(pingPongSocket);
}
public boolean wasFailure;
private LocalServerSocket socket;
public void run() {
final int napTime = 200; // milliseconds between file accesses
final int timeOut = 5000; // ms until we give up on ping and pong
final int maxAttempts = timeOut / napTime;
try {
android.net.LocalSocket connectionFromClient = socket.accept();
debugLog("Debug socket accepted");
BufferedReader inFromClient =
new BufferedReader(new InputStreamReader(connectionFromClient.getInputStream()));
DataOutputStream outToClient = new DataOutputStream(connectionFromClient.getOutputStream());
outToClient.writeBytes("" + android.os.Process.myPid());
for (int i = 0; i < maxAttempts; i++) {
String clientData = inFromClient.readLine();
debugLog("Incoming socket " + clientData);
if (!clientData.isEmpty())
break;
if (connectionFromClient.isClosed()) {
wasFailure = true;
break;
}
Thread.sleep(napTime);
}
} catch (IOException ioEx) {
ioEx.printStackTrace();
wasFailure = true;
Log.e(TAG,"Can't start debugger" + ioEx.getMessage());
} catch (InterruptedException interruptEx) {
wasFailure = true;
Log.e(TAG,"Can't start debugger" + interruptEx.getMessage());
}
}
public void shutdown() throws IOException
{
wasFailure = true;
try {
socket.close();
} catch (IOException ignored) { }
}
};
//beaware: before call to "start" Gdb Server:
// Ensure all native libraries you want debug break in are loaded
// just add to class that calls "xd.DebugServer.start();" static initalizer sample:
// static { System.loadLibrary("tun2http"); } //this may load "libs/armeabi-v7a/libtun2http.so"
// Ensure both sides (this App and IDE) are NOT blocked by any firewall
public static boolean start(android.app.Activity activity) {
try {
//System.loadLibrary("gnustl_shared");
final int napTime = 200; // milliseconds between file accesses
final int timeOut = 30000; // ms until we give up on ping and pong
final int maxAttempts = timeOut / napTime;
PackageManager pm = activity.getPackageManager();
ApplicationInfo appInfo = pm.getApplicationInfo(
activity.getPackageName(), android.content.pm.PackageManager.GET_CONFIGURATIONS
);
final String packagePath = appInfo.dataDir + "/";
//using constant '"/data/data/"' instate of 'appInfo.dataDir+"/"' since that does not work old code was "extras.getString("gdbserver_socket");"
final String gdbserverSocket = "/data/data/" + appInfo.packageName + "/debug-socket";
final String gdbserverCommand = packagePath + "lib/libgdbserver.so --multi +" + gdbserverSocket;
debugLog("removing gdb socket " + gdbserverSocket);
new File(gdbserverSocket).delete();
debugLog("starting " + gdbserverCommand);
m_debuggerProcess = Runtime.getRuntime().exec(gdbserverCommand);
debugLog("gdbserver started");
int i;
for (i = 0; i < maxAttempts; ++i) {
debugLog("waiting for socket at " + gdbserverSocket + ", attempt " + i);
File file = new File(gdbserverSocket);
if (file.exists()) {
file.setReadable(true, false);
file.setWritable(true, false);
file.setExecutable(true, false);
break;
}
Thread.sleep(napTime);
}
if (i == maxAttempts) {
debugLog("time out when waiting for debug socket");
return false;
}
debugLog("socket ok");
final String pingSocket = appInfo.packageName + ".ping_pong_socket";
debugLog("pingSocket: " + pingSocket);
DebugWaitRunnable runnable = new DebugWaitRunnable(pingSocket);
Thread waitThread = new Thread(runnable);
waitThread.start();
debugLog("Waiting for debug socket connect");
for (i = 0; i < maxAttempts && waitThread.isAlive(); ++i) {
if(i % 10 == 0)
debugLog("Waiting attempt: " + i);
Thread.sleep(napTime);
}
if (i == maxAttempts) {
debugLog("time out when waiting for ping socket");
runnable.shutdown();
return false;
}
if (runnable.wasFailure) {
debugLog("Could not connect to debug client");
return false;
} else {
debugLog("Got pid acknowledgment");
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public static void stop(android.app.Activity activity) {
if (m_debuggerProcess != null)
m_debuggerProcess.destroy();
System.exit(0);// FIXME remove it or find a better way
}
} //class GdbServer
该回答引用GPT与博主@晓码自在合作编写:
从您的描述,这似乎是 Android 9 系统在开发者选项中启用的 OEM 锁定引起的。在这个状态下,除了受信任的应用外,其他大多数应用与调试手段都会被禁用或受限。要解决这个问题,有以下思路可以尝试:
解锁 Android 系统一直是比较棘手的技术活动,容易引起设备损坏或“死机”等问题,所以一定要慎重操作,并且充分了解可能的风险。
你看下这2个方法是否可以帮到你:
1、尝试使用设备制造商提供的解锁工具来解锁设备。
2、下面是一个成功实例,通过创建备用PIN码来解锁设备:
a、按下并保持电源按钮,同时按下音量上和音量下按钮,直到出现Android徽标。
b、当Android徽标出现时,松开电源按钮,但继续按住音量上和音量下按钮。
c、在出现的菜单中,选择“恢复模式”。
d、在恢复模式下,选择“高级重启”。
e、在高级重启菜单中,选择“备用PIN码”。
f、按照屏幕上的指示创建一个新的备用PIN码。
g、使用新的备用PIN码来解锁设备
该回答参考ChatGPT:
这种情况可能是设备厂商在出厂时加入的一种保护机制,以防止用户通过不当的方式进行系统更新或刷机。这种锁定是基于设备的内部ROM,因此即使在开发者模式下也无法绕过。
如果您需要解锁设备,可能需要联系设备制造商或运营商获取帮助。在此之前,您可以尝试以下一些方法:
通过USB OTG(On-The-Go)线连接到另一台设备(如电脑),并使用其他应用程序安装您需要的软件。
将设备连接到计算机,并尝试使用adb命令(在设备上输入adb命令)进行操作。
在设备上启用USB调试功能,并通过adb命令将您的电话号码输入设备。这将允许您通过Wi-Fi或USB连接对设备进行远程操作。
如果您的设备已经解锁,则可以尝试刷入一个新的ROM,这可能会解决您的问题。请注意,这样做可能会导致您的设备变成未知状态,因此请备份您的数据并谨慎操作。
请注意,如果您尝试解锁设备时遇到任何问题,请在互联网上查找相关的文档或支持论坛,以获取更多帮助。
据我了解,您的设备可能启用了OEM锁,这是一种安全功能,可以防止未经授权的访问。如果您忘记了PIN码,您可以尝试使用Google账户进行解锁。如果您的设备已经与Google账户同步,您可以在输入错误的PIN码几次后选择“忘记密码”,然后按照提示进行操作。
如果您无法使用Google账户进行解锁,则可能需要重置设备。由于您的设备没有实体按键,因此您需要尝试其他方法。您可以尝试使用Android Debug Bridge(ADB)来重置设备。请注意,这将删除所有数据并将设备恢复到出厂设置。
刷机 不行么 ?
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
在这种情况下,无法进入开发者选项或者 recovery 模式进行解决。可能的方法如下:
尝试通过 U 盘安装一个能够绕过 OEM 锁的 ROM,如 LineageOS 。
可能可以通过调试模式连接到设备,然后使用 adb 命令绕过 OEM 锁。连接到调试模式之前,设备需要启动,并且USB调试模式必须开启。尝试输入以下命令:
adb shell input text YOURPINCODE
adb shell input keyevent 66 # 模拟点击回车键
如果成功输入了 PIN 码,屏幕上应该会出现一个确认 PIN 码对话框,您可以模拟点击 OK 来继续。
如果设备上安装了 TWRP,请使用 TWRP 进行格式化。请注意,这将情况完全擦除系统和数据,并将设备恢复到出厂状态,包括所有应用程序、文档和文件。请确保您备份了所有重要的数据,然后键入以下命令:
adb reboot recovery
然后,您就可以使用 TWRP 进行格式化并安装新的 ROM 了。
请注意,在实践中这些方法可能不起作用,或者可能使问题更加严重。所以,一定要慎重处理并确保已经备份了所有重要的数据。
如果我的回答解决了您的问题,请采纳!
但是,您可以尝试一些以下方法来解决问题:
尝试使用默认PIN码。有些设备的PIN码默认为0000或者1234,您可以尝试使用这些默认PIN码来解锁设备。
尝试使用设备管理工具。有些设备管理工具可以帮助用户解锁设备,例如Android Device Manager。您可以使用该工具登录您的Google账户,然后选择解锁设备选项,如果设备已经连接到互联网,这个方法可能会起作用。
尝试使用Android Debug Bridge(ADB)工具。ADB是一种用于与Android设备通信的命令行工具,可以通过ADB工具来重置PIN码。您需要连接设备到电脑上,并开启USB调试模式,然后使用ADB命令来进行PIN码重置。具体步骤可以参考ADB官方文档。
4.尝试使用工程模式。有些设备有工程模式,可以通过特定的组合键进入,然后通过工程模式来解锁设备。您可以在互联网上搜索您设备型号的工程模式进入方法,然后尝试使用工程模式来解锁设备。
请注意,上述方法可能会有一定的风险,如果不正确使用可能会导致设备损坏或数据丢失。因此,在尝试以上方法之前,请确保备份设备的数据,并谨慎操作。同时,如果您无法解决问题,建议您联系设备厂商或售后服务中心进行咨询和维修。