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

android-根据java文件一键生成dex文件脚本

安装7z命令
7-Zip官方下载网址

生成dex脚本文件

@echo off
setlocal enabledelayedexpansion

:: 获取当前日期和时间
for /f "tokens=2 delims==" %%i in ('"wmic os get localdatetime /value | findstr LocalDateTime"') do set datetime=%%i

:: 提取年、月、日、时、分、秒
set year=%datetime:~0,4%
set month=%datetime:~4,2%
set day=%datetime:~6,2%
set hour=%datetime:~8,2%
set minute=%datetime:~10,2%
set second=%datetime:~12,2%
:: 计算时间戳(秒级)
set /a timestamp=(%year%-1970)*31536000 + (%month%-1)*2678400 + %day%*86400 + %hour%*3600 + %minute%*60 + %second%


rem 访问java文件所在目录
cd C:\Users\admin\Desktop\plugin

rem 删除旧文件
del *.dex

rem 编译java文件
javac -encoding UTF-8 *.java

rem 构建文件
D:\SOFTWARE\android-sdk-windows\build-tools\30.0.3\d8 --output=./plugin.zip ./*.class &&^
del *.class &&^
D:\SOFTWARE\7-Zip\7z.exe x plugin.zip &&^
del *.zip &&^
ren classes.dex classes_%timestamp%.dex

命令描述

在这里插入代码片

> D:\SOFTWARE\android-sdk-windows\build-tools\30.0.3\d8 --output=./plugin.zip ./*.class &&^
del *.class &&^
D:\SOFTWARE\7-Zip\7z x plugin.zip &&^
del *.zip &&^
ren classes.dex classes_%timestamp%.dex

  1. 根据class文件生成dex文件压缩包
D:\SOFTWARE\android-sdk-windows\build-tools\30.0.3\d8 --output=./plugin.zip ./*.class

在这里插入图片描述
2.删除中间文件,class文件

del *.class

3.使用7z将dex文件从zip文件中解压出来

D:\SOFTWARE\7-Zip\7z.exe x plugin.zip

4.删除中间文件,zip文件

del *.zip

5.修改dex文件名

ren classes.dex classes_%timestamp%.dex

运行效果

前:
在这里插入图片描述
后:
在这里插入图片描述

生成dex文件

MyPlugin

package com.example.plugin;
public class MyPlugin {
    private static final SubPlugin SUB_PLUGIN = new SubPlugin();

    public void show(){
        SUB_PLUGIN.show();
    }
}

SubPlugin

package com.example.plugin;
public class SubPlugin {

    public void show(){
        System.out.println("*******************************");
        System.out.println("**********print data(dex)***************");
        System.out.println("*******************************");
    }
}

运行todex.bat生成dex文件
在这里插入图片描述

运行dex

1.将dex上传到手机或者模拟器上
在这里插入图片描述
代码:

package com.example.plugin;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Environment;
import android.widget.Toast;
import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import dalvik.system.DexClassLoader;

public class MainActivity extends AppCompatActivity {
    private static final int REQUEST_CODE_PERMISSIONS = 100;

    private static String[] PERMISSIONS_STORAGE = {
            "android.permission.READ_EXTERNAL_STORAGE",
            "android.permission.WRITE_EXTERNAL_STORAGE",
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, REQUEST_CODE_PERMISSIONS);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == REQUEST_CODE_PERMISSIONS) {
            if (allPermissionsGranted()) {
                execute();
            } else {
                Toast.makeText(this, "Permissions not granted by the user.", Toast.LENGTH_SHORT).show();
                finish(); // 如果用户拒绝了权限请求,可以选择退出应用或其他操作
            }
        }
    }

    private boolean allPermissionsGranted() {
        for (String permission : PERMISSIONS_STORAGE) {
            if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
        return true;
    }

    private void execute(){
        try {
            File file = new File(Environment.getExternalStorageDirectory(), "classes.dex");
            File odex = this.getDir("cache_plugin", Context.MODE_PRIVATE);
            System.out.println(odex.getAbsoluteFile());
            DexClassLoader dexClassLoader = new DexClassLoader(file.getAbsolutePath(), odex.getAbsolutePath(),null , getClassLoader());
            Class<?> aClass = dexClassLoader.loadClass("com.example.plugin.MyPlugin");
            Method show = aClass.getMethod("show");
            show.setAccessible(true);
            show.invoke(aClass.newInstance());
        } catch (Throwable e) {
            e.printStackTrace();

        }
    }
}

执行效果:
在这里插入图片描述

相关文章:

  • js | 网页上的 json 数据怎么保存到本地表格中?
  • NAS-相关软件推荐——非相册和备份的
  • 影刀RPA证书题库包含初级、中级、高级和AP初级
  • Trinity三位一体开源程序是可解释的 AI 分析工具和 3D 可视化
  • try...catch、async/await和Promise区别与联系
  • Openlayers:实现聚合
  • [LeetCode 55] 跳跃游戏
  • 【今日三题】经此一役小红所向无敌(模拟) / 连续子数组最大和(动态规划) / 非对称之美(贪心)
  • 在Ubuntu下进行单片机开发是否需要关闭Secure Boot
  • 扩展欧几里得算法:求解乘法逆元
  • 【MySQL数据库】InnoDB存储引擎:逻辑存储结构、内存架构、磁盘架构
  • 门极驱动器DRV8353M设计(三)
  • OpenCV中的轮廓检测方法详解
  • OpenCV day2
  • 无人船 | 图解基于视线引导(LOS)的无人艇制导算法
  • OpenAI为抢跑AI,安全底线成牺牲品?
  • CA证书的申请及使用流程
  • 记录:安装 Docker Desktop 时直接设置安装路径及容器存储路径
  • 思维与算法共舞:AIGC语言模型的艺术与科学
  • 人力不足导致项目延期,如何补救
  • 北大学者:过度依赖技术工具可能会削弱人类主动思考的能力
  • 新任乒协副主席马龙:感谢刘国梁,愿把经验传给年轻运动员
  • 特朗普特使将赴俄见普京,俄方:美俄间谈判艰难且耗时
  • 世界地球日丨上海交响乐团牵手上海植物园,为“树”写交响曲
  • 上海银行换帅:顾建忠出任党委书记,金煜辞任董事长
  • 上海开展数据产品知识产权登记存证试点,243个产品许可收益超20亿元