Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
½âÎö Totoro ÎÞÇÖÈ롢ȫ³¡¾°½ØÍ¼¼°Í¼Ïñ¼¼ÊõÌåϵ
 
×÷ÕߣºÉÕ¼îJusef
  2978  次浏览      27
 2020-3-18
 
±à¼­ÍƼö:
±¾ÎÄÖ÷Òª·ÖÏí Totoro ¿ò¼ÜÔÚÒÆ¶¯¶Ë½ØÍ¼¼°Í¼Ïñ´¦Àí¼°ÔÚÈ«Á´Â·ÌåϵÉϵļ¼Êõ·½°¸ºÍÒµÎñÖ§³ÖÄÜÁ¦£¬Ï£Íû¶ÔÄúµÄѧϰÓÐËù°ïÖú¡£
±¾ÎÄÀ´×ÔÓÚÔÆÆÜÉçÇø £¬ÓÉ»ðÁú¹ûÈí¼þAlice±à¼­¡¢ÍƼö¡£

ΪÌá¸ßÒµÎñÑз¢µÄ¿ª·¢Ð§ÂÊ£¬½â¾öÒµÎñ»ù´¡¹¤¾ß¼¼ÊõÍ´µã£¬ÈÃÑз¢Ö÷Òª¾«Á¦»Ø¹éÒµÎñºËÐÄÎÊÌâ½â¾öÉÏ£¬ÎÒÃÇÔÚ²»Í¬µÄά¶È×öÁË´óÁ¿Ìåϵ»¯µÄ¼¼Êõ¹¹½¨£¬Îª²»Í¬µÄ×Ô¶¯»¯³¡¾°ÌṩÎȶ¨¡¢Ò×ÓõÄ×Ô¶¯»¯µ×ÅÌ¡£

»ù´¡½ØÍ¼¼¼Êõ·½°¸

һ̨ÊÖ»úÉÏ»ñÈ¡ÆÁÄ»½ØÍ¼¼òµ¥£¬µ«ÊÇÏëÒª¼æÈݼ¯Èº»·¾³ÔÆÕæ»úƽ̨ÉϵĴóÁ¿Òƶ¯É豸£¬Í»ÆÆÏµÍ³¸÷ÖÖ°²È«ÏÞÖÆ¡¢°²È«Ò³Ã棨ÃÜÂ롢תÕ˵ÈÒ³Ãæ£©·´½ØÍ¼°²È«ÏÞÖÆ¡¢¼° ROM ²îÒìÐԵȲ»Í¬Î¬¶ÈµÄ¼æÈÝÐÔÎÊÌ⣬ÇÒÊÇ·ÇÇÖÈ뷽ʽ£¬Ôò»áÓÐÒ»µã¼¼ÊõСÌôÕ½¡£

ÕâÀï´Ó»ù´¡½ØÍ¼·½°¸ºÍÍ»ÆÆÏµÍ³ÏÞÖÆ´ïµ½½ØÍ¼ÄÜÁ¦È«³¡¾°¸²¸ÇÁ½·½Ãæ·ÖÏí Totoro µÄһЩʵ¼ù¡£

1. Ò»°ã³£¼û½ØÍ¼·½°¸Ñ¡Ðͼ°¸ÄÔì

ÔÚÒÆ¶¯¶Ë×Ô¶¯»¯(²âÊÔ)³¡¾°, ×¼ûµÄ½ØÍ¼·½·¨¾ÍÊÇʹÓÃadb shell screencap»òuiautomator½ØÍ¼½Ó¿Ú¡£È»¶ø adb shell screencap ·½Ê½Ê¹Óúܲ»·½±ã£¬ÐèÒª½«½ØÍ¼Ïȱ£´æµ½ÊÖ»ú´ÅÅÌÉÏ£¬È»ºóÔÙpullµ½ PC É豸ÉÏ¡£

Totoro ¿ò¼ÜÖвÉÓÃÁËÒ»´ÎÐԵĻñÈ¡·½Ê½ÈçÏ£º

adb -s sn exec-out screencap -p > name

µ«ÊǼ´Ê¹²ÉÓÃadb exec-out·½Ê½Ò²´æÔÚͼƬÎÞ·¨Ñ¹Ëõµ¼ÖµĽØÍ¼ºÄʱ½Ï³¤µÄÎÊÌ⣬²¢ÇÒ Java ÏîÄ¿ÖÐÿ´Î¶¼Òª Process ´´½¨½ø³Ì£¬Óöµ½Æµ·±½ØÍ¼Çé¿ö£¬ºÄ·Ñϵͳ×ÊÔ´£¬Ó°ÏìÎȶ¨ÐÔ¡£ËùÒÔÔÚ Totoro ¿ò¼ÜÖÐÌṩµÄ SDK ĬÈÏ API µ×²ã²ÉÓõĵÄÊÇ Uiautomator ÌṩµÄ½Ó¿Ú·½·¨¡£

UI Automator ²âÊÔ¿ò¼ÜÌṩÁËÒ»×é API£¬ÓÃÓÚ¹¹½¨ÔÚÓû§Ó¦ÓúÍϵͳӦÓÃÉÏÖ´Ðн»»¥µÄ½çÃæ²âÊÔ¡£Í¨¹ý UI Automator API£¬Äú¿ÉÒÔÖ´ÐÐÔÚ²âÊÔÉ豸Öдò¿ª¡°ÉèÖᱲ˵¥»òÓ¦ÓÃÆô¶¯Æ÷µÈ²Ù×÷¡£

ͬÑù·¢ÏÖ£¬UIAutomator ÌṩĬÈϽØÍ¼·½·¨ Éú³ÉͼƬÎļþÒ²ÊǷdz£´ó£¬Ñ¹ËõËã·¨²¢Ã»ÉúЧ¡£µ¼Ö½ØÍ¼Á´Â·ÉÏÕûÌåºÄʱ»áÔì³Éÿ´Î½ØÍ¼ÔÚÆ½¾ù 2-5s ×óÓÒ£¬Ó°Ïìµ½ÁË×Ô¶¯»¯ÕûÌåʱ¼ä¡£ ¿¼Âǵ½µ¥¶ÀÒý½øÒ»Ì×ѹËõËã·¨½ÏÖØ£¬ÇÒ¿ÉÄܺóÐøÎÞ×ÊԴά»¤£¬ËùÒÔ¾ö¶¨Ñо¿°²×¿Ô´Â룬ÊÔͼ´Ó¸ù±¾½â¾öѹËõÎÞЧµÄÎÊÌâ¡£

/**
* Write a compressed version of the bitmap to the specified outputstream.
* If this returns true, the bitmap can be reconstructed by passing a
* corresponding inputstream to BitmapFactory.decodeStream(). Note: not
* all Formats support all bitmap configs directly, so it is possible that
* the returned bitmap from BitmapFactory could be in a different bitdepth,
* and/or may have lost per-pixel alpha (e.g. JPEG only supports opaque
* pixels).
*
* @param format The format of the compressed image
* @param quality Hint to the compressor, 0-100. 0 meaning compress for
* small size, 100 meaning compress for max quality. Some
* formats, like PNG which is lossless, will ignore the
* quality setting
* @param stream The outputstream to write the compressed data.
* @return true if successfully compressed to the specified stream.
*/
public boolean compress(CompressFormat format, int quality, OutputStream stream) {
...
}
public boolean takeScreenshot(File storePath, int quality) {
Bitmap screenshot = mUiAutomation.takeScreenshot();
...
BufferedOutputStream bos = null;
try {
bos = new BufferedOutputStream(new FileOutputStream(storePath));
screenshot.compress(Bitmap.CompressFormat.PNG, quality, bos);
}
...
return true;
}

¸ù¾ÝÒÔÉϰ²×¿Ô´Â룬¸ú×Ùµ½ÏµÍ³Ñ¹Ëõ·½·¨¡£¿´×¢ÊÍ£¬Ëƺõ·¢ÏÖÁËÎÊÌâËùÔÚ£¬¿´ takeScreenshot ·½·¨, µ÷ÓÃÁË Bitmap µÄ Compress ѹËõ·½·¨£¬´«µÄ²ÎÊýдËÀÁË Bitmap.CompressFormat.PNG,¸ñʽ£¬¸ù¾Ý×¢ÊÍ˵Ã÷£¬Compress ·½·¨ÓÖ¶Ô png ¸ñʽͼƬµÄѹËõºöÂԵģ¬ËùÒÔµ¼Ö»ñÈ¡µ½µÄͼƬ¶¼ºÜ´ó¡£ÂíÉÏÖØÐ´ÏµÍ³·½·¨£¬Ö±½Óµ÷ÓÃѹËõ·½·¨£¬´«Èë JPEG È¥ÑéÖ¤¿ÉÐÐÐÔ£¬ÂíÉϵóöÁ˽â¾ö·½°¸¡£

ÕÒµ½ÎÊÌâËùÔÚ£¬½â¾ö·½°¸Ò²¾Í³öÀ´ÁË£¬Ö÷Òª¸ÄÔìÂß¼­¿ÉÒÔͨ¹ýÈý¸öºËÐIJ½ÖèÍê³É£º

×ÔÐлñÈ¡ Bitmap Îļþ¡£

µ÷Óà Bitmap ѹËõ·½·¨£¬Ö¸¶¨ jpeg ¸ñʽ£¬²¢´«Èë×Ô¶¨ÒåѹËõÖµ¡£

»ñȡѹËõÁ÷Êý¾Ý£¬Ö±½Ó Base64 ±àÂë´«µÝ¸ø SDK ²ã¡£

ͨ¹ýÒÔÉÏÓÅ»¯£¬¼õÉÙÁËÁ½´ÎÎļþ¶Áд£¬²¢ÇÒÓÐЧѹËõÁËͼƬ´óС£¬ÕûÌåÒ»´Î½ØÍ¼Ê±¼ä¿ØÖÆÔÚÁË 200-800ms£¬¶Ô±ÈÔ­À´ËÙ¶È×îÉÙÌáÉý 2-3 ±¶ÒÔÉÏ¡£

2.Í»ÆÆÏµÍ³°²È«ÏÞÖÆ×öµ½½ØÍ¼È«¸²¸Ç

Totoro µÄ×î´óÒµÎñÐèÇó À´×Ô Ç®°üϵ Ïà¹Ø App µÄ×Ô¶¯»¯ÒµÎñ£¬¶øÖ§¸¶±¦ÊôÓÚ°²È«Òþ˽ҪÇó½Ï¸ß

App£¬¸÷¸ö ROM Õë¶ÔÇ®°ü»òÕßÇ®°ü×ÔÉí¶¼»á×ö´óÁ¿°²È«±£»¤£¬ÀýÈçÔÚÃÜÂëÊäÈëÒ³Ãæ»òתÕËÒ³Ãæ£¬»áµ¼Ö½ØÍ¼»ñȡʧ°Ü£¬²¢ÇÒÎÒÃÇ·¢ÏÖÓÐЩÏÞÖÆ¼¶±ð½Ï¸ßÒ³Ãæ£¬Á¬ÏµÍ³×ÔÉíµÄ½ØÍ¼¹¦ÄÜÒ²ÎÞ·¨Ê¹Óá£

µ«ÊÇÔÚ²âÊÔ³¡¾°Ï£¬Êý¾Ý¼°°²È«¼¶±ðÊǿɿص쬶à¸öÒµÎñÏßÇ¿ÁÒÌá³ö ÄÜ·ñͨ¹ý¼¼ÊõÊÖ¶Î »ñÈ¡µ½ÕâЩ±»ÏÞÖÆµÄÒ³Ãæ½ØÍ¼£¬À´Âú×ãÒµÎñÑéÖ¤Âß¼­µÄÕýÈ·ÐÔ£¬È¥³ýÈ˹¤Ò³Ãæ½ØÍ¼ÉóºËËÀ½Ç£¬À´½øÒ»²½Ìá¸ßÑз¢Ð§ÄÜÖÊÁ¿¡£

ÓÉÓÚ Totoro ¿ò¼ÜÊÇ¶Ô App ÊÇ·ÇÇÖÈëʽµÄ£¬Ò²¸øÎÒÃǵļ¼ÊõʵÏÖÌí¼ÓÀ´²»Ð¡ÌôÕ½¡£µ«ÊÇ£¬±¾×ÅÒµÎñ¼ÛÖµÊ×λ¿¼ÂÇ£¬ÎªÁ˱£ÕÏ¿ª·¢ÕßʹÓÃЧÂÊ£¬ÎÒÃÇ¿ªÊ¼µ÷Ñа²×¿¸÷ÖÖ½ØÍ¼·½°¸£¬¸ú×Ù°²×¿½ØÍ¼Ô´Â룬ÊÔͼ²ÉÓÃHook·½Ê½Èƹý°²È«Ð£Ñé»úÖÆ¡£

Õë¶Ô°²×¿Æ½Ì¨¸÷ÖÖÈ«¾Ö½ØÍ¼·½·¨µÄÉîÈëÑо¿£¬×îºó·¢ÏÖ£¬¸÷ÖÖÈë¿ÚÀàµÄϵͳ½Ó¿Úµ÷Óõ½µ×²ã¶¼»áµ÷ÓÃSurfaceControlÀà»ò¶ÔÓ¦µÄ c ²ã´úÂ룬 SurfaceControl Àà³ÉÁ˹ؼüÑо¿¶ÔÏó¡£È»¶ø£¬´Ó Java ²ãµÄ SurfaceControl ÀàÖи÷ÖÖ Hook ½Ó¿Úµ÷Óó¢ÊÔ·¢ÏÖ£¬Ö»Òª±»°²È«Ò³ÃæÏÞÖÆ£¬¸Ã·½°¸ÏµĽØÍ¼·½°¸¾Í»áʧ°Ü»ò½Øµ½Ò»ÕÅºÚÆÁ¡£ÕâÒâζ×ÅϵͳÕë¶Ô½ØÍ¼µÄ°²È«ÏÞÖÆ¿ÉÒÔ¸²¸Çµ½Ä¿Ç°ÎÒÃÇÁ˽⵽µÄÈκγ¡¾°£¬ÈÃÎÒÃǵĽâ¾ö·½°¸Ò»Ê±ÏÝÈëÀ§¾³£¬Ê§È¥ÁË˼··½Ïò¡£

È»¶øÔÚ×ö SLM ÔÆ²âƽ̨É豸Զ³Ì×âÓùý³ÌÖУ¬·¢ÏÖ¼ÆÁ¹¦ÄÜÔÚÕâЩ½ØÍ¼ÏÞÖÆÒ³ÃæÒÀÈ»ÊÇ¿ÉÒÔÕý³£Ê¹Óã¬Õâ˵Ã÷ϵͳ»ò°²È«ÏÞÖÆÖ»ÊÇÕë¶Ô½ØÍ¼Ïà¹Ø API£¬Õâ¸øÎÒÃǵĽØÍ¼ÌṩÁËеÄ˼·£¬Í¨¹ý¼ÆÁÀ´»ñÈ¡ÆÁÄ»½ØÆÁ¡£ËùÒÔ¿ªÊ¼Ñо¿ÏµÍ³µÄ¼ÆÁ¹¦ÄÜ£¬ÄÜ·ñÔÚ¼ÆÁ¹ý³ÌÖÐÀ­Ò»Ö¡µÄ»­Ã棬×÷Ϊ½ØÍ¼ÐµÄʵÏÖ·½Ê½¡£

A.×ÔÑм¼Êõ·½°¸

ʵÏÖÔ­ÀíºÜ¼òµ¥£¬Í¨¹ýÖ±½Ó½âÂë Surface »ñÈ¡ÆÁÄ»ÊÓÆµÁ÷£¬È»ºó´ÓÊÓÆµÖлñȡһÕÅ¿ÉÓÃÖ¡£¬×ª»»Îª JPEG ¸ñʽ£¬×îºó»Ø´«¸ø PC ÉϵĽӿڡ£¸Ã·½°¸´Ó Java ²ãʵÏÖ£¬¼æÈÝÐÔÇ¿£¬³É±¾µ×£¬ÏÂÃæÊǹؼü´úÂëÂß¼­£º

MediaCodec mcodec = MediaCodec.createEncoderByType("video/avc");//´´½¨½âÂëÆ÷
Surface surface = codec.createInputSurface();//¹¹ÔìÄ¿±êSurface
SurfaceControl.setDisplaySurface(display, surface);//ͨ¹ý·´ÉäSurfaceControl£¬½«¹¹ÔìµÄSurfaceÉèÖõ½ÏµÍ³
int outputBufferId = codec.dequeueOutputBuffer(bufferInfo, -1);//¿ªÊ¼½âÂë
//ÅжÏÓÐЧ֡
...
Bitmap bitmap = mediaMetadataRetriever.getFrameAtTime(index);//»ñÈ¡ÆÁÄ»bitmapÖµ
bitmap.compress(Bitmap.CompressFormat.JPEG, quailty, fos);//±£´æ½ØÍ¼
...
//½ØÍ¼»Ø´«µ½PC½Ó¿Ú²ã

È»ºó¾ÍÊÇ´ò°ü³ÌÐò£¬ÀûÓÃϵͳ app_process ·þÎñ£¬¿ÉÒԱܿª¸÷ÖÖȨÏÞµ¯´°ÎÊÌ⣬ֱ½ÓÔËÐгÌÐò£¬¼´¿É»ñÈ¡µ½ÆÁÄ»½ØÍ¼¡£

Ŀǰ¸Ã·½Ê½ÒÑÈ«ÃæÓ¦Óõ½ Totoro µ×²ã½ØÍ¼·½°¸£¬¿ÉÒÔ¼æÈݰ²×¿ 5.0-10 °æ±¾£¬µ«ÊÇÈÔÈ»ÓиĽøµØ·½£¬ºóÐø»¹¿É´ÓÒÔϼ¸µã½øÒ»²½ÓÅ»¯£º

ÊÓÆµÁ÷ÓÐЧ֡ÅжÏÂß¼­ÓÅ»¯£¬¼õÉÙ½ØÍ¼Ê±¼ä¡£

ĿǰÈÔÈ»ÐèÒªÒ»´ÎÊÖ»ú¶ËµÄÎļþ±£³Ö¶ÁдÂß¼­£¬ºóÐø¿É¿¼ÂǶÁÁ÷·½Ê½£¬Ö±½Ó»ñȡͼƬ Base64 Öµ¡£

¿ÉÖ´ÐÐÎļþ²ÎÊý±ê×¼»¯£¬¿ÉÂú×ã¶à³¡¾°¼¼ÊõÊä³ö¡£

B.±¸Óöµµ×·½°¸

ÒÔÉÏ A ·½·¨Ö÷ÒªÕë¶Ô 5.0+ µÄ°²×¿É豸£¬ÇÒÕë¶Ô¸ö±ð OPPO¡¢VIVO É豸¿ªÆôÁËϵͳ¶ñÒâ¼ÆÁ¹¦ÄÜ£¬¾Í»áÔì³É¼ÆÁ¹¦ÄÜÏÞÖÆ£¬ÒýÆð½ØÍ¼Ê§°Ü¡£Õë¶ÔÕⲿ·ÖµÄÉ豸£¬ÎÒÃÇÉèÏë Android ÄÜ·ñÏñ Linux ϵͳһÑù£¬Èƹý Java ²ãȨÏÞÏÞÖÆ£¬Ö±½Ó´ÓC²ã¶ÁÈ¡²Ù×÷ϵͳ framebuffer£¨Linux É豸/dev/graphics/fb0£©£¬À´»ñÈ¡ÆÁĻͼÏñ¡£

ÆÚ¼äµ÷ÑÐÁË¿ªÔ´µÄ minicap ¼ÆÁ·½°¸£¬·¢ÏÖ Surface ·½°¸ÔÚ¸ö±ðÉ豸²»ÄܼæÈÝÇé¿öÏ£¬ minicap ÒÀÈ»¿ÉÒÔʹÓã¬Æäµ×²ãÔ­Àí¾ÍÊDzÉÓà NDK ¿ª·¢µÄ¹¤¾ß£¬Ö±½Ó¶ÁÈ¡²Ù×÷ϵͳ framebuffer£¬ÎªÁ˲»Öظ´ÔìÂÖ×Ó£¬¾ö¶¨°Ñ minicap ¹¤¾ßÖеÄÊÖ»ú¶ËµÄ·þÎñµ¥¶À°þÀë³öÀ´¼¯³Éµ½ Totoro£¬×÷Ϊ±¸Óöµµ×·½·¨Ìṩ½ØÍ¼ÄÜÁ¦¡£

String cmd = String.format("adb -s %s shell LD_LIBRARY_PATH=/data/local/tmp /data/local/tmp/minicap -P %sx%s@%sx%s/0 -Q 90 -s -t > %s", deviceId, w, h, w, h, localPathFile);

°´ÕÕÉÏÃæÃüÁîµ¥¶Àµ÷Óà minicap ¹¤¾ß½ØÍ¼£¬²¢´ÓÁ÷ÖнâÎöµ½Í¼Æ¬±£³Öµ½Öƶ¨Ä¿Â¼£¬¾­´óÁ¿²âÊÔ£¬¸ÃÃüÁî²¢²»Ò»¶¨Îȶ¨£¬ÓÐʱ»á±¨¸ñʽ´íÎó£¬ÓÐʱ»á±¨Á÷´¦Àí´íÎó£¬ËùÒÔÎÒÃÇÌí¼ÓÁ˽µ¼¶·½°¸£¬ÈçÒÔÏÂÃüÁî¡£

String cmd = String.format("adb -s %s shell \"LD_LIBRARY_PATH=/data/local/tmp /data/local/tmp/minicap -P %sx%s@%sx%s/0 -Q 90 -s -t > /sdcard/.totoro/%s\"", deviceId, w, h, w, h, name);
//È»ºó½«Í¼Æ¬Pullµ½PCÉÏÖÆ¶¨Ä¿Â¼

Á½ÖÖ¼¼Êõ·½°¸Ï໥½µ¼¶´îÅäʹÓã¬ÕâÑùÕýºÃÃÖ²¹ÁË Java ²ã Surface ·½°¸µÄһЩ¿ÉÄÜʧ°Ü³¡¾°£¬×÷Ϊ¶µµ×·½·¨¼¯³Éµ½ÁË Totoro ¿ò¼ÜÖУ¬Ä¿Ç°ÎªÖ¹ÔÝδ·¢ÏÖÁ½ÖÖ·½·¨¶¼Ê§°Ü³¡¾°£¬±£ÕÏÁ˽ØÍ¼ÄÜÁ¦µÄµ×ÅÌÎȶ¨ÐÔ¡£

ÒµÎñ¶à³¡¾°Ö§³Ö

1.»ù´¡½ØÍ¼³¡¾°

ͨ¹ýÒÔÉÏÏà¹Ø¶à²ã¼¼Êõ·½°¸¼æÈÝ£¬Totoro Ŀǰ¿ÉÒÔÌṩÎȶ¨µÄ»ù´¡½ØÍ¼ÄÜÁ¦£¬ÒµÎñ²ãÎÞÐè¹Ø×¢µ×²ãµÄ¾ßÌå¼¼ÊõʵÏÖ·½°¸»ò¶µµ×·½°¸£¬Ö»ÐèÒªµ÷ÓÃÒ»¸ö Totoro ʵÑé SDK ±©Â¶µÄ API ¼´¿É¡£

String path = BizUtils.saveScreen(name);

2.³¤½ØÆÁ¼¼Êõ·½°¸

³¤½ØÍ¼ÄÜÁ¦Ò»Ö±ÊÇÒµÎñ·½Ìá³öµÄÍ´µãÐèÇó£¬Ò»Ö±µ½ 19 ÄêÄ©ÎÒÃDzųé³öʱ¼äÃÖ²¹ÁË Totoro Õâ¿éÄÜÁ¦È±Ê§¡£

ÆðÏÈ£¬Ïȵ÷ÑÐÁËÐÐÒµÄÚÆäËûʵÏÖ·½°¸£¬»ù±¾Ë¼Â·¶¼ÊÇ»¬¶¯½ØÍ¼£¬È»ºóºÏ²¢¶àÕŽØÍ¼£¬×îºóÉú³É³¤½ØÍ¼¡£È»¶ø£¬ÄѵãÔÚ¶àÕŽØÍ¼µÄÍêÃÀºÏ²¢£¬Õë¶ÔÒÆ¶¯¶ËµÄÒ³Ãæ½ØÍ¼£¬´æÔÚҳͷ¡¢Ò³Î²¡¢Ð¡ banner ¸üС¢Ð¡ºìµãµÈ¶àÖØÓ°Ï죬¸ø³¤½ØÍ¼µÄʵÏÖÔö¼ÓÁ˲»ÉÙÄѶȡ£

¿ÉÐз½°¸·ÖÎö£º

Ö±½ÓÀûÓõÚÈý·½Æ´½Ó¹¤¾ß¡£ÐèÒªÌí¼Ó¶îÍâÒÀÀµ£¬ÆäÔÚÒÆ¶¯¶Ë¸ö±ð¼«ÏÞ³¡¾°Æ´½Ó´æÔÚÎÊÌ⣬ά»¤³É±¾¸ß¡£

ÀûÓÃËã·¨²¿ÃÅ×ÊÔ´£¬ÌØÕ÷ÖµÖ±½ÓÆ¥Åä¡£ÐèÒªÌí¼ÓËã·¨¿â£¬ÇÒÒªÍÆ¶¯Ëã·¨²¿ÃŲ»¶Ïµü´ú¸üУ¬ºóÐø¸üпÉÄܲ»¼°Ê±¡£

×Ô¼ºÊµÏÖÒ»Ì×£¬ÄѶȴ󣬳õÆÚ³É±¾¸ß¡£ÐèÒª¼æÈÝÒÆ¶¯¶ËÒ³Ãæ¸÷ÖÖÇé¿ö£¬µ«ÊǺóÐøÎ¬»¤³É±¾µÍ£¬Éý¼¶·½±ãÇÒ¼°Ê±¡£

ȨºâÀû±×ºó£¬×îÖÕÎÒÃDzÉÓÃÁË·½°¸ 3£¬¾ö¶¨×Ô¼ºÊµÏÖÁËÒ»Ì×Õë¶ÔÒÆ¶¯¶Ë½ØÍ¼ÌØÕ÷µÄÆ´½ÓÄÜÁ¦£¬²ÉÓÃÁË×ÔÑÐÏñËØÐлҶÈֵĩβÓÅÏȶԱȼ¼Êõ·½°¸£¬ºËÐÄÂß¼­Ë¼Â·ÊÇĬÈÏÏòÉÏ»¬¶¯Éú³ÉµÄͼƬ×飬Á½Á½´Óµ×²¿ÓÅÏÈ¿ªÊ¼¶Ô±ÈÐÐÏñËØµÄ»Ò¶ÈÖµ£¬ÕÒµ½Æ´½ÓµãºÍ²Ã¼ôµã¡£ÎªÁ˼õÉÙÔëµã¼°¸ö±ðºìµã¡¢ºìÏß¡¢Ð¡ banner¡¢¼°µ×²¿µ¼º½À¸Ó°Ï죬ÔÚ²»Í¬µÄ¶Ô±Èµã¼°ÇøÓòÌí¼ÓÁ˶ÔÓ¦µÄ²ÎÊý¡£ÆäºËÐÄ´úÂë˼·ÈçÏ£º

public static File mergeImg(File imgA, File imgB, String mergedImgPathName) {
int[][] listA = getPX(imgA);//»ñÈ¡ÏñËØÊý×é
int samePartEnd = 0, sameBottom = srcALen;//¶¨Òå²éÕÒÄ¿±êλÖÃ
int samePart = mergeLen >> 2;//¶¨ÒåÏàËÆ¿ÅÁ£
for (int al = Math.max(0, listA.length - mergeLen + (samePart >> 1)), l = listA.length - 1; l >= al; l--) {
for (int x = mergeLen - (listA.length - l), y = Math.max(0, (samePart >> 1)); x >= y; x--) {
if (compareRowPx(listA[l], listB[x])) {// ¶Ô±ÈÐлҶÈÏàËÆ¶È
//ÕÒµ½»ù´¡¶Ô±Èµã
for (int i = 0, partLen = (l == listA.length - 1) ? samePart : samePart >> 1; i < partLen; i++) {
//ѰÕÒÆ´½Óµã
if (compareRowPx(listA[curA], listB[curB])) {
if (i == partLen - 1) {
//ÏàÍ¬ÇøÓò´ïµ½·§Öµ£¬ÕÒµ½Æ´½Óµã
samePartEnd = x;
sameBottom = l - 1;
break;
} else {
//ѰÕҵײ¿ÏàÍ¬ÇøÓò£¬Èçµ×²¿µ¼º½TabÀ¸
break;
}
}
if (matchedBottom || samePartEnd > 0) {
//Æ´½Ó²ÎÊýÕÒµ½£¬ÌáÈ¡½áÊøÑ­»·
break;
}
}
}
}
String fileSuffixA = getFileRealExt(imgA);//¶ÁÈ¡¶þ½øÖÆÁ÷£¬»ñȡԭʼͼÎļþÕæÊµºó׺
String fileSuffixB = getFileRealExt(imgB);
String fileSuffixC = mergedImgPathName.substring(1 + mergedImgPathName.lastIndexOf("."));
if (samePartEnd == mergeLen - 1) {
//ͼƬÏàͬ£¬Ö±½Ó·µ»ØµÚÒ»ÕÅͼƬ
imgA.renameTo(file);
return file;
}
//¿ªÊ¼ºÏ²¢Âß¼­
int newY = srcALen - (srcALen - sameBottom) + (mergeLen - samePartEnd);
...//¶ÁȡԭʼͼƬֵ
if (sameBottom > 0) {
// È¥³ýµ×²¿µ¼º½tabÀ¸
} else {
//ûÓеײ¿²Ù×÷tabÀ¸
newA = reader.read(0);
}
...//ÖØÐÂÆ´½ÓͼƬ
imgNew.setRGB(0, newA.getHeight(), width, newB.getHeight(), imgArrayB, 0, width);
ImageIO.write(imgNew, fileSuffixC, file);
..//ÆäËû×ÊÔ´»ØÊÕ
return file;
}

Ч¹ûͼÈçÏ£º

¸Ã·½°¸Ä¿Ç°ÒÑÈ«Á¿ÉÏÏߣ¬²¢ÇÒÂú×ãÁËĿǰҵÎñ·½ÐèÇó£¬ÔÚÓöµ½³¤½ØÍ¼Æ´½ÓÓÐÖØµþ»òȱÉÙÎÊÌâʱ£¬Ò²¿ÉÒÔͨ¹ýµ÷½Ú¶Ô±È²ÎÊý£¬¿ìËÙÓÅ»¯ºÏ²¢Âß¼­´úÂ룬´ïµ½Á˼ȶ¨Ñз¢Ä¿±ê¡£

3.¾Ö²¿¿Ø¼þ½ØÍ¼

ÔÚ×Ô¶¯»¯¹ý³ÌÖУ¬ÓÐЩҵÎñÐèÒª»ñȡij¸ö¿Ø¼þµÄ½ØÍ¼£¬ iOS ¶Ë¿ÉÒÔͨ¹ý WDA Ïà¹Ø½Ó¿ÚʵÏÖ£¬µ«Êǰ²×¿¶ËÊÇûÓÐÏֳɷ½°¸µÄ¡£Òò´Ë£¬Totoro ²ÉÓÃÁ˰´ÕÕ×ø±ê½ØÍ¼Çиʽ£¬½áºÏ¿Ø¼þ×ø±êÐÅÏ¢£¬¿ÉÒÔÔÚ PC ¶ËʵÏÖÒ»Ì×¾Ö²¿¿Ø¼þ»ñÈ¡·½·¨¡£¸Ã API ¿ÉÒÔͬʱÊÊÓõ½

iOS ºÍ°²×¿Ë«Æ½Ì¨£¬¾Ö²¿¿Ø¼þ½ØÍ¼ºËÐÄʵÏÖ˼·£º

src = BizUtils.saveScreen(name);
WebElement element = driver.findElement(By);
...//¸ù¾Ýelement»ñÈ¡µ½elementµÄ×ø±êÐÅÏ¢
ImageCheckUtils.imageCut( src, dest, x, y, width, height);//¸ù¾Ý×ø±êÐÅÏ¢ÇÐͼ£¬»ñÈ¡µ½¿Ø¼þ½ØÍ¼destÎļþ

4.¶àÆÁÄ»½ØÆÁ

Ŀǰ Totoro ÖÐÖ»¼¯³ÉÁË adb Ô­Éú·½Ê½£¬ÓÃÀ´ÎªÒ»Ð©Ö§¸¶ IoT É豸£¬Ìṩ¶àÆÁÄ»½ØÍ¼ÄÜÁ¦¡£

#¸½ÆÁÄ»½ØÆÁ
adb shell screencap -d /dev/graphics/fb1 fb1.png
#Ö÷ÆÁÄ»½ØÆÁ
adb shell screencap -d /dev/graphics/fb0 fb0.png

ºóÐø¸ù¾ÝÐèÇó·´À¡£¬»áµ÷ÑвÉÓà UIAutomater »ò Surface ·½Ê½ÊµÏÖ¡£

ͼÏñÖÇÄÜËã·¨·ÖÎö

Totoro ½èÖúÐÖµÜÍŶӣ¨¹¤³ÌÊý¾Ý¼¼Êõ×飩µÄËã·¨ÄÜÁ¦£¬Õë¶Ô½ØÍ¼ÊµÏÖÁËÒ³ÃæÖÇÄÜ·ÖÎö¡¢¼ì²âµÈÄÜÁ¦£¬Íê³ÉÁËͼƬÏà¹Ø¼¼ÊõÌåϵС±Õ»·¡£ÖÇÄÜËã·¨ÄÜÁ¦¼¯³É¿ÉÒÔ¹éÀàΪÒÔÏÂÈýÖÖ¡£

1.¿Ø¼þ·ÖÎö

ÈçÉϽØÍ¼Ëùʾ£¬¿ÉÒÔͨ¹ýÒÔÏ API »ñÈ¡Ò³Ãæ¿Ø¼þÐÅÏ¢£¬¿Éʶ±ð¿Ø¼þÀàÐÍÈç button¡¢image¡¢label¡¢progress¡¢switch¡¢more¡¢editView¡¢popUp¡¢checkBox¡¢return¡¢close µÈ¡£

2.Ò³ÃæÒì³£¼ì²â

Òì³£¼ì²âÄÜÁ¦¿É³éÏó·ÖΪͨÓÃÒì³£ºÍÒµÎñÒì³££¬¾ßÌå˵Ã÷ÈçÏ£º

ͨÓÃÒì³£·ÖÎö£¬È磺ºÚ°×ÆÁ¡¢¼ÓÔØÊ§°Ü¡¢Í¼Æ¬»òÎÄ×ֽضϣ¬¿Ø¼þÅÅÁÐÖØµþµÈ³£¼ûÒ³Ãæ UI ÎÊÌ⣻

ÒµÎñÒì³£·ÖÎö£¬È磺ҵÎñµ¯´°¡¢ÊÚȨµ¯´°×è¶ÏµÈ£¬ÇÒ¸ü¼Ó²»Í¬µÄÒµÎñÒì³£³¡¾°ÐèÇ󣬿ɶ¨ÖÆ»¯·þÎñ¡£

Totoro ÖпÉͨ¹ýÒ»¸ö½Ó¿Ú»ñÈ¡Ò³ÃæÒì³£ÐÅÏ¢£¬ÒµÎñÖÐͨ¹ý×Ô¶¯»¯µÄ¼ì²â£¬Íê³ÉÁË֮ǰºÜ¶àÎÞ·¨ÊµÏÖµÄ×Ô¶¯»¯³¡¾°¡£

3.ÒµÎñ³¡¾°Ê¶±ð

ΪʵÏÖ¸ü¼ÓÖÇÄܵÄÒ³Ãæ·ÖÎö£¬ÎªºóÐø×Ô¶¯»¯²âÊÔ³¡¾°ÖÐ×Ô±éÀú»ò×ÔÌî³äÌṩ»ù´¡ÄÜÁ¦Ö§³Å£¬ÒÀÀµËã·¨ÄÜÁ¦¿ÉÒÔÖÇÄÜ·ÖÎöµ±Ç°Ò³Ã泡¾°£¬ÀýÈç¿ÉÒÔͨ¹ýËã·¨Ïà¹Ø½Ó¿ÚÀ´×Ô¶¯Åжϵ±Ç°Ò³ÃæÊôÓÚÄĸöÒµÎñÁ÷³Ì£¬±ÈÈçµÇ¼Á÷³Ì³¡¾°¡¢ÊäÈ볡¾°µÈ¡£

ĿǰÄÚ²¿Ö»¿ª·ÅÁ˵Ǽ³¡¾°µÄʶ±ð£¬ÒÑÉÏÏß²¢Ó¦Óõ½Ð¡³ÌÐò×Ô¶¯»¯×¢È뼰Ѳ¼ì³¡¾°£¬¿ÉÒÔ´úÌæÐ¡³ÌÐòµÇ¼·±Ôӽű¾¹¤×÷Á¿£¬´ó´ó¼õÉÙÓÃÀý½Å±¾Î¬»¤³É±¾¡£

4.ͼƬÏàËÆ¶È·ÖÎö

ÈçÉÏÁ½ÕŽØÍ¼£¬ÓÉÓÚ´æÔÚ´óÃæ»ý Banner ±ä»¯ºÍ±³¾°½¥±äÑÕÉ«²îÒ죬Èç¹ûµ¥´¿Í¨¹ýÏñËØ¶Ô±È£¬ºÜÄÑ·ÖÎö³öÊÇÒ»¸öÒ³ÃæÉϵĽØÍ¼£¬ÕâÀïÖ÷Òª½èÖúËã·¨ÄÜÁ¦£¬Í¨¹ýÌáÈ¡Ò³ÃæÌØÕ÷Öµ¡¢Í¼ÏñÖ¸ÎÆ¡¢ÑÕɫͨµÀµÈ¶àά¶ÈÀ´¾«È·¼ÆËã³öÁ½¸ö½ØÍ¼µÄÏàËÆ¶È¡£

ÈçÒÔÉϽØÍ¼Ëùʾ£¬¿ÉÒÔͨ¹ý Totoro ·â×°µÄ API µÃ³öÁ½ÕÅͼÏàËÆ¶ÈΪ 54£¬ÒµÎñ²ã´úÂë¿Éͨ¹ýÏàËÆ¶ÈÓ¦Óõ½×Ô¼ºµÄʵ¼ÊÒµÎñ³¡¾°¡££¨Ö»ÒªÏàËÆ¶È >=50 Ôò¿ÉÈÏΪÁ½¸ö½ØÍ¼ÊÇÒ»¸öÏàËÆÒµÎñ³¡¾°£©

ºóÐø¼Æ»®

Õë¶ÔºÜСµÄÒ»¸öͼƬҵÎñÄÜÁ¦£¬¶¼ÐèҪͶÈëÁ¿¾Þ´óµÄŬÁ¦ À´±£ÕÏ Totoro µÄ×Ô¶¯»¯µ×ÅÌÒ×ÓÃÐÔºÍÎȶ¨ÐÔ£¬ÒµÎñ²»¶ÏÀ©ÕŹý³ÌÖУ¬Í¼Æ¬Ïà¹ØÄÜÁ¦Ìåϵ»¹ÊÇÓжà¸öϸ½ÚÈÔÐèÒª²»¶Ïµ÷ÓÅ£¬ÆäÖÐÃ÷È·ÐèҪͶÈëÑо¿ºÍºóÆÚ¿ª·¢¼Æ»®ÓÐÒÔϼ¸µã£º

1.½ØÍ¼¼¼Êõ·½·¨Ä£¿é»¯³éÀ룬½øÒ»²½ÓÅ»¯µ÷ÓÃÁ´Â·£¬¼Ó¿ìÕûÌå½ØÍ¼»ñÈ¡ËÙ¶È¡£

2.³¤½ØÍ¼¼¼Êõ·½°¸ÓÅ»¯£¬·º»¯Æ´½Ó·½Ïò£¬×é¼þ»¯°ü×°£¬¿Éµ¥¶ÀÁé»î¶ÔÍâÊä³ö¼¼ÊõÄÜÁ¦¡£

3.¶àÆÁ½ØÍ¼³¡¾°ÓÅ»¯£¬µ÷Ñиü¼Ó±ã½ÝÎȶ¨µÄ¶àÆÁ½ØÍ¼·½°¸£¬Âú×ãÔ½À´Ô½¶àµÄ IoT ³¡¾°¡£

4.½øÒ»²½Íƶ¯Ëã·¨ÄÜÁ¦É£¬Í¨¹ýÂñµãÉϱ¨£¬¼Ó´óËã·¨Êý¾Ý±Õ»·Ö§³Ö¡£

 
   
2978 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

΢·þÎñ²âÊÔÖ®µ¥Ôª²âÊÔ
һƪͼÎÄ´øÄãÁ˽â°×ºÐ²âÊÔÓÃÀýÉè¼Æ·½·¨
È«ÃæµÄÖÊÁ¿±£ÕÏÌåϵ֮»Ø¹é²âÊÔ²ßÂÔ
È˹¤ÖÇÄÜ×Ô¶¯»¯²âÊÔ̽Ë÷
Ïà¹ØÎĵµ

×Ô¶¯»¯½Ó¿Ú²âÊÔʵ¼ù֮·
jenkins³ÖÐø¼¯³É²âÊÔ
ÐÔÄܲâÊÔÕï¶Ï·ÖÎöÓëÓÅ»¯
ÐÔÄܲâÊÔʵÀý
Ïà¹Ø¿Î³Ì

³ÖÐø¼¯³É²âÊÔ×î¼Ñʵ¼ù
×Ô¶¯»¯²âÊÔÌåϵ½¨ÉèÓë×î¼Ñʵ¼ù
²âÊԼܹ¹µÄ¹¹½¨ÓëÓ¦ÓÃʵ¼ù
DevOpsʱ´úµÄ²âÊÔ¼¼ÊõÓë×î¼Ñʵ¼ù