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
- 根据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();
}
}
}
执行效果: