正常,因为demo返回的是 byte[]
数组,没有对其进行处理
传统的办法是在一个大类里写各种main函数,每次改了都注释,或者写多个main函数,来回改名字。其实不用这么麻烦,用单元测试就可以了。
具体可以参考 src/test/java/com/anjia/unidbgserver/service
下的
-
TTEncryptTest.java
基本等同于main启动,不加载spring那一套,启动速度快,不测试worker,只测试实际业务 -
TTEncryptWorkerTest
加载spring整套环境,测试多线程worker
@Test
可以简单理解成一个个mian函数,可以直接运行的
@BeforeEach
是不管起哪个 @Test
方法都会先执行 带@BeforeEach
正常运行的,修改 src/main/resources/logback-spring.xml
里的
单元测试的,修改 src/test/resources/logback-test.xml
里的
群里有朋友反馈服务运行后会自动挂掉,我没有遇到也没有复现,但是针对这个问题,可以换个思路,将保证服务不挂掉,改成,即使服务挂掉,如何快速自动重启
基于此,给出跨平台的几种方案
跨平台的方案使用docker,支持windows/mac/linux (如何安装docker 参考docker官方文档 https://docs.docker.com/engine/install/)
docker run --restart=always -d -p9999:9999 anjia0532/unidbg-boot-server
windows 下可以用 nssm, 参考 nssm 在windows上部署服务
linux和mac os 下可以用 Supervisor 参考 Supervisor-java守护进程工具
把二进制文件 libttEncrypt.so 放到 src/resources/data/apks/so/
下, 然后调用TempFileUtils.getTempFile(LIBTT_ENCRYPT_LIB_PATH)
(
将classpath下的文件copy到临时目录里,后边访问临时目录的即可。)
为啥不直接写死绝对路径,一旦换机器部署,就要重新修改源代码,重新打包,尤其是把代码分发给网友时,很容易踩坑报错。
private final static String LIBTT_ENCRYPT_LIB_PATH="data/apks/so/libttEncrypt.so";
vm.loadLibrary(TempFileUtils.getTempFile(LIBTT_ENCRYPT_LIB_PATH),false);
参考 com.anjia.unidbgserver.web.TTEncryptController
和 com.anjia.unidbgserver.service.TTEncrypt
和 com.anjia.unidbgserver.service.TTEncryptWorker
和 com.anjia.unidbgserver.service.TTEncryptWorkerTest
主要unidbg模拟逻辑在 com.anjia.unidbgserver.service.TTEncrypt
里
com.anjia.unidbgserver.web.TTEncryptController
是暴露给外部http调用的
com.anjia.unidbgserver.service.TTEncryptWorker
是用多线程包装了一层
com.anjia.unidbgserver.service.TTEncryptWorkerTest
是单元测试
修改 logback-spring.xml
例如 <logger name="com.github.unidbg" level="WARN"/>
,意味着 com.github.unidbg
包 及该包名空间以下的只打印WARN
和ERROR
修改pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- 忽略其他部分 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<!-- spring boot版本号 -->
<version>2.5.3</version>
<relativePath/>
</parent>
<!-- 忽略其他部分 -->
<properties>
<!-- 改成unidbg的版本号 -->
<unidbg.version>0.9.4</unidbg.version>
<!-- 忽略其他部分 -->
</properties>
<!-- 忽略其他部分 -->
</project>