再说NativeProcess
在以前一篇文章中初步的使用了下NativeProcess。能够用来执行一些命令,但后来发现用以前的方式只能执行一些Windows自带的一些命令,如ipconfig/ping 之类的。而有时候我们需要执行的不仅仅是这些,如执行jar包的一些命令,以及执行一些exe中的命令。也就是说是第三方工具中我们需要用到的。如果用之前的方法是不行的。
比如我们需要执行zipalign.exe 这个是用来优化apk包的。那么一般情况下 我们会进入到zipalign.exe所在的目录然后调出cmd窗口最后输入相应的命令执行。或者直接从cmd里面进入到所在目录也一样。
而我们现在用NativeProcess 来实现他。
由于zipalign.exe可以单独提取出来并能成功执行,不会依赖其他文件,所以我们在fb项目里面新建一个work的文件夹,然后将其放入。
private var mNative:NativeProcess; private var mNativeInfo:NativeProcessStartupInfo; public function Test() { var _file:File = new File("c:/windows/system32/cmd.exe"); mNativeInfo = new NativeProcessStartupInfo(); var _args:Vector.<String> = new Vector.<String>( ); mNativeInfo.executable = _file; mNativeInfo.arguments = _args; mNative = new NativeProcess( ); mNativeInfo.workingDirectory = new File(File.applicationDirectory.resolvePath("work").nativePath); mNative.addEventListener(ProgressEvent.STANDARD_ERROR_DATA,onErrDataHandler ); mNative.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA,onOutDataHandler ); mNative.addEventListener(Event.STANDARD_OUTPUT_CLOSE,onCloseHandler ); _args.push("/c"); _args.push("zipalign -f -v 4 C:/Users/Administrator/Desktop/a.apk C:/Users/Administrator/Desktop/ab.apk"); mNative.start( mNativeInfo ); } protected function onCloseHandler(event:Event):void { trace("done................................"); } protected function onOutDataHandler(event:ProgressEvent):void { var _out:IDataInput = mNative.standardOutput; var _content:String = _out.readMultiByte( _out.bytesAvailable,"gbk" ); trace( _content ); } protected function onErrDataHandler(event:ProgressEvent):void { var _out:IDataInput = mNative.standardError; var _content:String = _out.readMultiByte( _out.bytesAvailable,"gbk" ); trace( _content ); }
如上面代码所示,这次依然是先打开cmd窗口,但是我们用到了一个workingDirectory属性,这个官方的解释是
引用新本机进程的初始工作目录。怎么理解呢?简单的说就是存放我们需要执行的所有命令包的一个文件夹,所以我们把work这个目录作为工作目录,并把zipalign.exe放进去。然后就可以像平常一样写入参数并执行命令了。
onCloseHandler:当整个流程执行完之后会调用,即我们的apk优化完成
onOutDataHandler:这个里面会实事的返回一些执行过程中的数据
onErrDataHandler:当执行过程中出现警告或错误的时候会调度
同样我们可以放一些其他可以独立执行的包,比如apktool的三个文件、adt.jar 都是可以的。
同时工作目录也是可以更改的,一个项目可以有多个这个工作目录,换句话说一个NavtieProcess就拥有一个自己的工作目录,如果我们想要执行jdk中的所有命令,那么我们可以把工作目录设置为jdk下的bin文件夹。
当然在执行jar的一些命令之前还需检测是否安装了java
比如执行apktool.jar进行反编译apk 先将apktool.jar、apktool.bat、aapt.exe三个文件拷贝到work目录下 然后替换上面的参数为 “/c java -jar apktool.jar d -f xxx.apk”; 即可
下载Demo