当前位置: 首页 > news >正文

成都搭建网站太原网站建设培训

成都搭建网站,太原网站建设培训,小制作大全简单又漂亮,企业推广策划公司文章目录 一、问题背景二、代码实现三、代码详解 一、问题背景 在 Android 中#xff0c;可以使用 Android Studio 编写 Java 应用程序#xff0c;通过编译打包成 apk 文件#xff0c;然后将文件推送至 /data/local/tmp 等可执行的目录或安装打包出来的应用#xff0c;随后… 文章目录 一、问题背景二、代码实现三、代码详解 一、问题背景 在 Android 中可以使用 Android Studio 编写 Java 应用程序通过编译打包成 apk 文件然后将文件推送至 /data/local/tmp 等可执行的目录或安装打包出来的应用随后使用 app_process 命令即可运行此 Java 程序命令格式如下 app_process -Djava.class.path${apk路径} /system/bin 主类的全限定名例如如下 在 Android Studio 中编写一个 Hello World 程序 package com.teleostnaclobject HelloWorld {JvmStaticfun main(args: ArrayString) {println(Hello World!!!)} }编译完成之后推送至 /data/local/tmp随后使用命令执行 app_process -Djava.class.path/data/local/tmp/HelloWorld.apk /system/bin com.teleostnacl.HelloWorld 可以看到其可以正常执行 Java 代码并输出 Hello World!!! 这个方式启动的 Java 程序将集成 shell 的 用户组 和 用户可以执行高权限的命令实现应用的提权流行于各种工具箱中。但是由于这样启动的 Java 程序是没有Application Activity 和其它四大组件的无法直接拿到 Context而对于很多 Android API 来说都需要用到 Context 的。那么有没有办法去拿到一个 Context 呢本文将介绍一种可以在通过 app_process 命令启动的 Java 程序中获取到 Context 的方式。 二、代码实现 先直接上代码看如何在代码中构造一个 Context val context: Context? by lazy {try {Looper.prepareMainLooper()// ActivityThread activityThread new ActivityThread();val activityThreadCls Class.forName(android.app.ActivityThread)val activityThreadConstructor: Constructor* activityThreadCls.getDeclaredConstructor()activityThreadConstructor.isAccessible trueval activityThread activityThreadConstructor.newInstance()val getSystemContextMethod activityThreadCls.getDeclaredMethod(getSystemContext)getSystemContextMethod.invoke(activityThread) as Context} catch (e: Exception) {e.printStackTrace()null} }参考scrcpy 的 Workarounds.java 此方法的原理是通过 ActivityThread.getSystemContext() 来构造获取 Context但是由于 ActivityThread 的构造方法和 getSystemContext() 方法都是被打上了 UnsupportedAppUsage 注解的外部无非直接调用因此需要通过反射来构造。 三、代码详解 我们可以通过分析 Android App 的启动流程来了解到 Context 被构造出来的过程。 我们知道 Android App 是基于 Java 编写的一种特殊的程序其跟 Java 程序一样需要通过 main 方法来作为应用程序的唯一入口。在 APP 启动时会先通过 AMS 请求启动应用通过 Zygote 使用 fork() 方法复制自身创建新的应用进程此时会加载 Android Runtime (ART) 进行加载 Java 虚拟机和核心库再调用 ActivityThread 的 main() 方法这就是应用进程的入口点。 我们来看一下 ActivityThread 的 main() 实际的实现 public static void main(String[] args) {Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, ActivityThreadMain);// Install selective syscall interceptionAndroidOs.install();// CloseGuard defaults to true and can be quite spammy. We// disable it here, but selectively enable it later (via// StrictMode) on debug builds, but using DropBox, not logs.CloseGuard.setEnabled(false);Environment.initForCurrentUser();// Make sure TrustedCertificateStore looks in the right place for CA certificatesfinal File configDir Environment.getUserConfigDirectory(UserHandle.myUserId());TrustedCertificateStore.setDefaultUserDirectory(configDir);// Call per-process mainline module initialization.initializeMainlineModules();Process.setArgV0(pre-initialized);Looper.prepareMainLooper();// Find the value for {link #PROC_START_SEQ_IDENT} if provided on the command line.// It will be in the format seq114long startSeq 0;if (args ! null) {for (int i args.length - 1; i 0; --i) {if (args[i] ! null args[i].startsWith(PROC_START_SEQ_IDENT)) {startSeq Long.parseLong(args[i].substring(PROC_START_SEQ_IDENT.length()));}}}ActivityThread thread new ActivityThread();thread.attach(false, startSeq);if (sMainThreadHandler null) {sMainThreadHandler thread.getHandler();}if (false) {Looper.myLooper().setMessageLogging(newLogPrinter(Log.DEBUG, ActivityThread));}// End of event ActivityThreadMain.Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);Looper.loop();throw new RuntimeException(Main thread loop unexpectedly exited); }在这段代码中前几行都是为了初始化相关的模块以便后续在 Android 应用中可以正常使用相关的功能随后 调用 Looper.prepareMainLooper(); 将主线程的 Looper 给准备好随后 ActivityThread thread new ActivityThread();thread.attach(false, startSeq);构建了一个 ActivityThread并调用 attach 方法将其绑定。最后调用 Looper.loop(); 开始循环处理主线程的消息。 我们再来看 attach 方法 这个方法中的逻辑较多核心的就是给 sCurrentActivityThread 和 mSystemThread 进行赋值并将ApplicationThread attach 到 AMS 中向 AMS 注册应用进程。最后添加与 View 有关的配置修改的回调。 我们再看与 Context 有关的逻辑 UnsupportedAppUsage ActivityThread() {mResourcesManager ResourcesManager.getInstance(); }Override UnsupportedAppUsage public ContextImpl getSystemContext() {synchronized (this) {if (mSystemContext null) {mSystemContext ContextImpl.createSystemContext(this);}return mSystemContext;} }可以看到 getSystemContext() 就是一个获取 Context 的关键方法而在其内部调用 ContextImpl.createSystemContext(); 方法并传递了一个 ActivityThread 的实例。 ActivityThread 的构造方法和 getSystemContext() 方法都是被打上了 UnsupportedAppUsage 注解的且构造方法是使用 default 的限定符外部无法直接实例化。而 ActivityThread 的类被打上了hide标记整个类对于外部来说都无法使用。 因此在构造 Context 的时候需要通过 val activityThreadCls Class.forName(android.app.ActivityThread) 来获取到类对象再改变构造方法的可访问性来实例化 ActivityThread 对象 val activityThreadConstructor: Constructor* activityThreadCls.getDeclaredConstructor() activityThreadConstructor.isAccessible true val activityThread activityThreadConstructor.newInstance()再然后反射调用 getSystemContext() 方法 val getSystemContextMethod activityThreadCls.getDeclaredMethod(getSystemContext) getSystemContextMethod.invoke(activityThread) as Context直接这样构造出来之后在使用上可能会因为缺少相关的初始化而不能使用可以参考 scrcpy 的 Workarounds.java 将 ActivityThread.sCurrentActivityThread 和 activityThread.mSystemThread 都赋值 // ActivityThread.sCurrentActivityThread activityThread; val sCurrentActivityThreadField activityThreadCls.getDeclaredField(sCurrentActivityThread) sCurrentActivityThreadField.isAccessible true sCurrentActivityThreadField.set(null, activityThread)// activityThread.mSystemThread true; val mSystemThreadField activityThreadCls.getDeclaredField(mSystemThread) mSystemThreadField.isAccessible true mSystemThreadField.setBoolean(activityThread, true)
http://www.pierceye.com/news/953740/

相关文章:

  • 网站建设模块化实现企业网站建设范文
  • 网站培训班有哪些课程中国工程建设标准化协会官方网站
  • 医院网站建设 费用做商业网站
  • 网站设计考虑因素wordpress录入表单写数据库
  • 个人博客网站设计网站优化方式有哪些
  • 网站建设文化教程网站开发建设成本
  • 洛阳做网站公司汉狮价格wordpress移动端悬浮导航
  • 免费网站的代码wordpress给分类添加自定义栏目
  • 网站建设额怎么自己做网站app
  • 长沙市网站推广电话兰州的互联网公司有哪些
  • 湖南网站设计亮点昆山高端网站设计公司
  • 自己做网站教程客户管理系统免费版
  • 购买域名后怎么使用山东seo
  • 单位写材料素材网站孝感建设局网站
  • 做win精简系统的网站免费找客户网站
  • 腾和企业网站 优帮云网站建设岗位说明
  • 城市建设网站淮安哪有专业做网站的公司
  • 作风建设提升年活动网站毕节公司做网站
  • access数据库网站广州建网站哪儿济南兴田德润简介
  • 上海网站建设seo抖音短剧推广怎么做
  • 京东网站建设策划书网站建设常用编程语言
  • 济南教育论坛网站建设page n wordpress
  • 网站域名在山东备案却在苏州产教融合信息门户网站建设方案
  • 南京网站网站建设传奇网页
  • 网站后台更新怎么做详情页怎么设计
  • 网站怎么做导航wordpress付费破解
  • 宁津网站建设国内免费设计素材网站
  • 泰安有口碑的企业建站公司二手汽车手机网站模板
  • 网站百度快照怎么做网站调用谷歌地图
  • 扫描二维码进入公司网站怎样做代做关键词收录排名