前段时间公司的某个项目,需要使用Android盒子安装程序,实现开机自启动,由于成本问题,购买了电视盒子,由于厂商系统定制的限制,无法实现开机自启动。查看了相关的博客,使用了该方案 blog.csdn.net/u011562187/…。此处仅作出一些新问题补充一下,以下操作均在Mac中进行,命令无效的话自行百度:
- 使用adb命令找到launcher包名
adb shell dumpsys activity | grep "mFocusedActivity"
$ adb shell dumpsys activity | grep "mFocusedActivity"
mFocusedActivity: ActivityRecord{41e1e6f0 u0 (包名) t2}- 项目使用了分包,通过xpose的日志发现遇到 java.lang.ClassNotFoundException 错误,参考该方案解决 blog.csdn.net/jyy208/arti…
本人项目解决代码:
//找到launcher的包名,hook Application的onCreate方法
if (loadPackageParam.packageName.equals("xxx.xxx.xxx")) {
XposedHelpers.findAndHookMethod(Application.class, "attach", Context.class, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
ClassLoader cl = ((Context) param.args[0]).getClassLoader();
Class<?> hookclass = null;
try {
hookclass = cl.loadClass("xxx.xxx.xxx.xxx.xxx");
} catch (Exception e) {
XposedBridge.log("Loaded app: " + loadPackageParam.packageName);
XposedBridge.log("寻找\"xxx.xxx.xxx.xxx.xxx\"报错");
return;
}
XposedBridge.log("寻找\"xxx.xxx.xxx.xxx.xxx\"成功");
XposedHelpers.findAndHookMethod(hookclass.getName(), cl,"onCreate",Bundle.class, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
XposedBridge.log("Loaded app: " + loadPackageParam.packageName);
Object activityThread = callStaticMethod(findClass("android.app.ActivityThread", null), "currentActivityThread");
Context mContext = (Context) callMethod(activityThread, "getSystemContext");
//自己应用的隐式启动action
Intent intent = new Intent("xxx.xxx.xxx");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent);
}
});
}
});
}- 必须确保XposeInit在主dex,multiDexKeepFile的规则问题,需要到项目下 app/build/intermediates/legacy_multidex_main_dex_list/debug/mainDexList.text 里面的内容拷贝到新建的maindexlist.text中,然后在顶部添加XposedInit路径,由于我两次使用了匿名内部类,因此代码如下
com/xxx/xxx/xpose/XposedInit.class
com/xxx/xxx/xpose/XposedInit$1.class
com/xxx/xxx/xpose/XposedInit$1$1.class
......(拷贝的内容)