我有一个java服务器,它通过命令行编译android APK,并将输出写入文件,这是源代码:
Process p = Runtime.getRuntime().exec("gradlew assembleRelease", null , new File(this.workDir));
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = null;
while ((line = input.readLine()) != null) {
standardOutput.writeln(line);
}
input.close();
它与所有的android项目都很完美,但是如果android项目在assets文件夹中有一个目录或者包含罕见字符(á,ñ...)的文件,那么,就会陷入line = input.readLine()
我打开了jconsole以查看卡在哪里,我得到了这个:
Name: Thread-3
State: RUNNABLE
Total blocked: 0 Total waited: 6
Stack trace:
java.io.FileInputStream.readBytes(Native Method)
java.io.FileInputStream.read(FileInputStream.java:255)
java.io.BufferedInputStream.read1(BufferedInputStream.java:284)
java.io.BufferedInputStream.read(BufferedInputStream.java:345)
- locked java.io.BufferedInputStream@e70e4f8
sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
- locked java.io.InputStreamReader@4426351b
java.io.InputStreamReader.read(InputStreamReader.java:184)
java.io.BufferedReader.fill(BufferedReader.java:161)
java.io.BufferedReader.readLine(BufferedReader.java:324)
- locked java.io.InputStreamReader@4426351b
java.io.BufferedReader.readLine(BufferedReader.java:389)
com.mobinGen.jobs.AndroidJob.releaseCompile(AndroidJob.java:329)
com.mobinGen.jobs.AndroidJob.jobProcess(AndroidJob.java:122)
com.mobinGen.jobs.BaseJob.process(BaseJob.java:138)
com.mobinGen.generationAPI.GeneratorAndroid$AndroidJobsAsker.run(GeneratorAndroid.java:230)
正如您所看到的,它在第329行被屏蔽,即while ((line = input.readLine()) != null)
我该如何处理?这是一个很大的问题,因为服务器正在等待,而不会编译下一个即将发布的android项目。
由于
答案 0 :(得分:1)
首先,您确定要阅读p.getInputStream()
吗? Gradle流程将写入p.getOutputStream()
或p.getErrorStream()
其次,我认为您应该使用tooling api来调用gradle,而不是使用Runtime
(请参阅GradleConnector)
答案 1 :(得分:0)
也许您想在InputStreamReader中使用显式字符集。