尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

在Android中动态加载类

在Android中动态加载类
📅 发布时间:2026/6/19 5:06:17
在Android中动态加载类

在Android中动态加载类

较为复杂

编写Hello类

package main;
public class Hello {public static void main(String[] args) {System.out.println("Hello World");}public String welcome(){return "zsh";}
}

运行

java Hello.java

编译运行

javac Hello.java
# 将Hello.class 放入main目录
java main.Hello

or

javac -d . Hello.java
java main.Hello

使用R8

D:\SoftWare\Android\Sdk\build-tools\36.0.0> ./d8 C:\Users\29051\Desktop\main\Hello.class --output C:\Users\29051\Desktop\main.zip

push到cache目录

/data/data/io.github.okhttplearn/cache/classes.dex

命令非常短少

Usage: d8 [options] [@<argfile>] <input-files>where <input-files> are any combination of dex, class, zip, jar, or apk filesand each <argfile> is a file containing additional arguments (one per line)and options are:--debug                 # Compile with debugging information (default).--release               # Compile without debugging information.--output <file>         # Output result in <file>.# <file> must be an existing directory or a zip file.--globals <file>        # Global synthetics <file> from a previous intermediate compilation.# The <file> may be either a zip-archive of global synthetics or the# global-synthetic files directly.--globals-output <file> # Output global synthetics in <file>.# <file> must be an existing directory or a non-existent zip archive.--lib <file|jdk-home>   # Add <file|jdk-home> as a library resource.--classpath <file>      # Add <file> as a classpath resource.--min-api <number>      # Minimum Android API level compatibility (default: 1).--pg-map <file>         # Use <file> as a mapping file for distribution.--intermediate          # Compile an intermediate result intended for later# merging.--file-per-class        # Produce a separate dex file per class.# Synthetic classes are in their own file.--file-per-class-file   # Produce a separate dex file per input .class file.# Synthetic classes are with their originating class.--no-desugaring         # Force disable desugaring.--desugared-lib <file>  # Specify desugared library configuration.# <file> is a desugared library configuration (json).--desugared-lib-pg-conf-output <file># Output the Proguard configuration for L8 to <file>.--main-dex-rules <file> # Proguard keep rules for classes to place in the# primary dex file.--main-dex-list <file>  # List of classes to place in the primary dex file.--main-dex-list-output <file># Output resulting main dex list in <file>.--force-enable-assertions[:[<class name>|<package name>...]]--force-ea[:[<class name>|<package name>...]]# Forcefully enable javac generated assertion code.--force-disable-assertions[:[<class name>|<package name>...]]--force-da[:[<class name>|<package name>...]]# Forcefully disable javac generated assertion code.# This is the default handling of javac assertion code# when generating DEX file format.--force-passthrough-assertions[:[<class name>|<package name>...]]--force-pa[:[<class name>|<package name>...]]# Don't change javac generated assertion code. This# is the default handling of javac assertion code when# generating class file format.--force-assertions-handler:<handler method>[:[<class name>|<package name>...]]--force-ah:<handler method>[:[<class name>|<package name>...]]# Change javac and kotlinc generated assertion code# to invoke the method <handler method> with each# assertion error instead of throwing it.# The <handler method> is specified as a class name# followed by a dot and the method name.# The handler method must take a single argument of# type java.lang.Throwable and have return type void.--thread-count <number> # Use <number> of threads for compilation.# If not specified the number will be based on# heuristics taking the number of cores into account.--map-diagnostics[:<type>] <from-level> <to-level># Map diagnostics of <type> (default any) reported as# <from-level> to <to-level> where <from-level> and# <to-level> are one of 'info', 'warning', or 'error'# and the optional <type> is either the simple or# fully qualified Java type name of a diagnostic.# If <type> is unspecified, all diagnostics at# <from-level> will be mapped.# Note that fatal compiler errors cannot be mapped.--android-platform-build# Compile as a platform build where the runtime/bootclasspath# is assumed to be the version specified by --min-api.--art-profile <input> <output># Rewrite human readable ART profile read from <input> and write to <output>.--startup-profile <file># Startup profile <file> to use for dex layout.--version               # Print the version of d8.--help                  # Print this message.

方法调用

val dexFile = File(context.cacheDir, "classes.dex")
val dexClassLoader = DexClassLoader(dexFile.absolutePath, null, null, context.classLoader)
val loadedClass: Class<*> = dexClassLoader.loadClass("main.Hello")
val instance: Any = loadedClass.getDeclaredConstructor().newInstance()
val welcomeMethod: Method = loadedClass.getMethod("welcome")
val result: String? = welcomeMethod.invoke(instance) as? String
Log.i(TAG, "WorldScreen -> result: $result, codeCacheDir: ${context.codeCacheDir}")
val mainMethod: Method = loadedClass.getMethod("main", Array<String>::class.java)
val result1 = mainMethod.invoke(instance, arrayOf<String>("zsh1", "zsh2"))
Log.i(TAG, "WorldScreen -> result1: $result1")

你会惊奇的发现,niubility!
你会发现zygote64做了什么奇怪的动作.

  • MD5校验
  • 输出The ClassLoaderContext is a special shared library.
  • Increasing code cache capacity to 1024KB

而且生成了一个奇怪的目录oat.
image
这些文件有什么作用呢?
想要解密这些,还是相当复杂的需要了解art虚拟机的知识.

路漫漫其修远兮,吾将上下而求索!

相关新闻

  • 《安全测试指南》——会话管理测试【学习笔记】
  • 20251207
  • 高级语言程序设计第八次个人作业

最新新闻

  • STM8L15x开发板实测DS18B20温度采集工程(IAR环境,含完整驱动与调试脚本)
  • kafka源码-@KafkaListener消费端的poll调用逻辑
  • 3分钟学会:Windows上最轻量的安卓APK安装工具完全指南
  • OA与CMS系统漏洞挖掘:从权限边界突破到实战提权
  • TC820双斜积分ADC:从原理到3位半数字电压表设计实战
  • 豆包智能感从何而来:五层能力涌现机制解析

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号