需求: 有个定制rom的安卓设备,在24小时不关机的情况下,不知道是客户交换机或者路由设置的原因,长期运行一段儿时间后(数周或者数月),以太网失效,开关机也无法连上网络,经测试,操作设置里面的以太网开关重启以太网可以修复,准备代码检测到以太网失效之后代码关开一次以太网,奈何不是公司自己编译的安卓rom,也没拿到rom源码,只能反编译查看
2. 操作步骤
1. 将对应的设置app从系统拉取出来 、system/priv-app/Settings.apk(仅示意 不同rom不同)
2. 反编译得到对应的jar包
3. jdjui查看 代码(由adb shell am start com.android.settings/com.android.settings.Settings打开设置的命令得知 对应的界面的 java文件名称)
4. 查找最终的开关方法
3. 由于改方法只对系统开放 因此暂时用反射方式调用
demo的界面
页面代码:
<Button
android:id="@+id/button_open"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="开" />
<Button
android:id="@+id/button_close"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="关" />
对应的安卓代码 打开部分
findViewById(R.id.button_open).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.e(" cjq ", "button_open");
try {
Class<?> ethernetManagerCls = Class.forName("android.net.ethernet.EthernetManager");
//获取EthernetManager实例
Object ethManager = Main2Activity.this.getSystemService("ethernet");
Method setDataEnabled = ethManager.getClass().getDeclaredMethod("setEthEnabled",boolean.class);
Log.e("cjq ", " " + setDataEnabled);
if (null != setDataEnabled) {
setDataEnabled.invoke(ethManager,true);
}
}catch (Exception e){
e.printStackTrace();
}
}
});
对应的关的部分
findViewById(R.id.button_close).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.e(" cjq ", "button_close");
try {
Class<?> ethernetManagerCls = Class.forName("android.net.ethernet.EthernetManager");
//获取EthernetManager实例
Object ethManager = Main2Activity.this.getSystemService("ethernet");
Method setDataEnabled = ethManager.getClass().getDeclaredMethod("setEthEnabled",boolean.class);
if (null != setDataEnabled) {
setDataEnabled.invoke(ethManager, false);
}
}catch (Exception e){
e.printStackTrace();
}
}
});
由于网上没找到这部分解决方案,记录下自己的解决过程。