// java 示例
new Thread(new Runnable() {
@Override
public void run() {
try {
// 将 assets 文件移动到内部存储
boolean isMoved = moveAssetsFileToInternalStorage(context, "checksum");
if (!isMoved) {
Log.e(TAG, "Failed to move checksum file.");
return;
}
// ⚠️注意:SDK 工作目录必须和 checksum 文件在同一个目录
int errCode = Safetunnel.newInstance(context.getFilesDir().getAbsolutePath());
if (errCode != 1) {
Log.e(TAG, "Safetunnel.newInstance failed with code: " + errCode);
return;
}
// 启动 Safetunnel
int startCode = Safetunnel.start();
if (startCode != 1) {
Log.e(TAG, "Safetunnel.start failed with code: " + startCode);
return;
}
// 获取代理端口,应用层流量转发到这个端口即可使用流量加速功能
int port = Safetunnel.getPort();
Log.d(TAG, "Proxy port: " + port);
} catch (Exception e) {
Log.e(TAG, "Exception occurred: " + e.getMessage());
}
}
}).start();
// Android复制assets文件到内部存储,java示例
public static boolean moveAssetsFileToInternalStorage(Context context, String fileName) {
InputStream inputStream = null;
try {
inputStream = context.getAssets().open(fileName);
// 注意:SDK工作目录必须和checksum文件在同一个目录
File outFile = new File(context.getFilesDir(), fileName);
File parentDir = outFile.getParentFile();
if (parentDir != null && !parentDir.exists()) {
parentDir.mkdirs();
}
if (!outFile.exists()) {
// 将文件内容从输入流复制到输出流
try (FileOutputStream outputStream = new FileOutputStream(outFile)) {
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, length);
}
}
Log.d(TAG, "File " + fileName + " moved to internal storage: " + outFile.getAbsolutePath());
}
return true;
} catch (Exception e) {
Log.e(TAG, "Failed to move file " + fileName + " to internal storage: " + e.getMessage());
return false;
} finally {
// 关闭输入流
if (inputStream != null) {
try {
inputStream.close();
} catch (Exception e) {
Log.e(TAG, "Failed to close input stream: " + e.getMessage());
}
}
}
}