Android盒子 自启动 分包 XPose解决方案

426 阅读1分钟

前段时间公司的某个项目,需要使用Android盒子安装程序,实现开机自启动,由于成本问题,购买了电视盒子,由于厂商系统定制的限制,无法实现开机自启动。查看了相关的博客,使用了该方案 blog.csdn.net/u011562187/…。此处仅作出一些新问题补充一下,以下操作均在Mac中进行,命令无效的话自行百度:

  1. 使用adb命令找到
    launcher
    包名
    adb shell dumpsys activity | grep "mFocusedActivity"
$ adb shell dumpsys activity | grep "mFocusedActivity"
  mFocusedActivity: ActivityRecord{41e1e6f0 u0 (包名) t2}
  1. 项目使用了分包,通过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);
                }
            });
        }
    });
}
  1. 必须确保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
    ......(拷贝的内容)