以前一篇文章中初步的使用了下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

NativeProcessTest.rar

 

 

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Free Web Hosting