рд╕реНрд░реЛрдд рдФрд░ Android NDK рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Android рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВред рд╣рдо рд╕реНрдХреНрд░реЗрдВрдк рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЛ рдкрдВрдк рдХрд░рддреЗ рд╣реИрдВ

рдореИрдВ рдПрдВрдбреНрд░реЙрдЗрдб рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд╕реНрд╡рдЪрд╛рд▓рди рдореЗрдВ рд╕рдВрд▓рдЧреНрди рд╣реВрдВ рдФрд░ рдЕрдХреНрд╕рд░ рдПрд╕рдбреАрдХреЗ рдпрд╛ рдПрдВрдбреНрд░реЙрдЗрдб рдУрдПрд╕ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рдпрд╛ рдЗрд╕рдХрд╛ рдХрд╛рдо рдзреАрдорд╛ / рдмрд╣реБрдд рдзреАрдорд╛ рд╣реИред

рдореВрд▓ рд╡рд┐рдХрд╛рд╕ рдХрд┐рдЯ (NDK) рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд▓рд┐рдЦ тАЛтАЛрд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЬрд╛рд╡рд╛ рдореЗрдВ рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдЧреАред рдЗрд╕ рдХрд┐рдЯ рдХреЗ рдХрд╛рд░рдг, рд╣рдо рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдореЗрдВ C / C ++ рдореЗрдВ рд▓рд┐рдЦрд╛ рдХреЛрдб рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ Android рдореЛрдмрд╛рдЗрд▓ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдЦреБрдж рдХреА рдмрд╛рдЗрдирд░реА рдлрд╛рдЗрд▓реЗрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ рд╣рдо рдПрдВрдбреНрд░реЙрдЗрдб рдУрдПрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рдВрдХрд▓рди рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рднреА рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЗрд╕ рдУрдПрд╕ рдореЗрдВ рдореМрдЬреВрджрд╛ рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдХреИрд╕реЗ рдкреВрд░рдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВ рдПрдХ "рд╕реНрдХреНрд░реАрди" рдкрдВрдк рдХрд░рддрд╛ рд╣реВрдВ, рдЬреЛ рди рдХреЗрд╡рд▓ рдкреВрд░реА рд╕реНрдХреНрд░реАрди рдХрд╛ рдПрдХ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ "рдХрдЪреНрдЪрд╛ рдбреЗрдЯрд╛" рджреЗ рд╕рдХрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдмрд┐рдВрджреБ рдкрд░ рдкрд┐рдХреНрд╕реЗрд▓ рд░рдВрдЧ рднреА рд▓реМрдЯрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдХреЗрд╡рд▓ рд╡рд╛рдВрдЫрд┐рдд рдХреНрд╖реЗрддреНрд░ рдХреА рдПрдХ рдЫрд╡рд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рддреЛ рдЪрд▓рд┐рдП!

рдПрдирдбреАрдХреЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ


Android NDK рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдЕрдирдкреИрдХ рдХрд░реЗрдВ рдпрд╛ SDK рдкреНрд░рдмрдВрдзрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВред

рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЖрдк рдЕрддрд┐рд░рд┐рдХреНрдд рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЙрдкрдХрд░рдг:

sudo apt-get install android-tools-adb android-tools-fastboot 

рдФрд░ рдЕрдкрдиреЗ рдореЛрдмрд╛рдЗрд▓ рдбрд┐рд╡рд╛рдЗрд╕ рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ "рдкреНрд░реЛрдЬреЗрдХреНрдЯ" рдмрдирд╛рдПрдВ:

  ./android-ndk-r12b/build/tools/make_standalone_toolchain.py --arch <arm or arm64 or other> --install-dir ~/arm 

рдЪреВрдВрдХрд┐ рдореЗрд░реЗ HOMTOM HT16 рдореЗрдВ armeabi-v7a рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рд╣реИ, рдореИрдВ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛:

  ./android-ndk-r12b/build/tools/make_standalone_toolchain.py --arch arm --install-dir ~/arm 

рдФрд░ рд╣рдо рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдлрд╝рд╛рдЗрд▓реЛрдВ (рд▓рдЧрднрдЧ 5 рдорд┐рдирдЯ рддрдХ) рдХрд╛ рдирд┐рд░реНрдорд╛рдг рди рдХрд░ рд▓реЗред

рдкреНрд░рджрд░реНрд╢рди рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ


рд╕рд░рд▓ рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ hello_world.c рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ:

 #include <stdio.h> int main () { puts("hello world"); } 

рдФрд░ рдЗрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:

 ~/arm/bin/clang -pie hello_world.c -o hello_world 

-O рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ, рдФрд░ -рдкрд╛рдЗрдк рд╕реНрд╡рд┐рдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ , рд╣рдо рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдкреАрдЖрдИрдИ рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓ рдФрд░ рдЗрд╕рдХреА рд╕рднреА рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рд╣рд░ рдмрд╛рд░ рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдореЛрд░реА рдореЗрдВ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рд▓реЛрдб рд╣реЛрддреА рд╣реИрдВ, рдЬреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддреА рд╣реИред

рдпрджрд┐ рд╕рдВрдХрд▓рди рд╕рдлрд▓ рд░рд╣рд╛, рддреЛ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдлрд╝реЛрди рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ:

 adb push ./hello_world /data/local/tmp 

рдФрд░ рдмрд╛рдЗрдирд░реА рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ:

 adb shell /data/local/tmp/hello_world 

рдпрджрд┐ рдЖрдкрдиреЗ "рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб" рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рджреЗрдЦрд╛ - рддреЛ рдЖрдкрдиреЗ рд╕рдм рдХреБрдЫ рдареАрдХ рдХрд┐рдпрд╛!

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрднреА рднреА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВ, рддреЛ рд╢рд╛рдпрдж рдЖрдкрдиреЗ рдЧрд▓рдд рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдЪреБрдирд╛ рд╣реИ, рддреЛ рдмрд╕ рдЗрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ рдФрд░ рдЗрд╕реЗ рд╕рд╣реА рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдПрдВред

рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдХрдорд╛рдВрдб рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ

 adb shell cat /proc/cpuinfo 

рд╕реНрд░реЛрдд рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп


рдЪреВрдВрдХрд┐ рд╕рдВрдХрд▓рд┐рдд рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдмрд╣реБрдд рд╕рдордп рд▓реЗрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ, рдФрд░ рдПрдВрдбреНрд░реЙрдЗрдб рдПрдХ рдЦреБрд▓реА рд╡реНрдпрд╡рд╕реНрдерд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдЧреБрдгрд╡рддреНрддрд╛ рдХрд╛ рд▓рд╛рдн рди рд▓реЗрдВ!

рд╣рдо рдпрд╣рд╛рдВ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд╕рд╣реА рд╕рдВрд╕реНрдХрд░рдг рдХреА рддрд▓рд╛рд╢ рдХрд░рддреЗ рд╣реИрдВред рдЦреИрд░, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА - рд╕рдВрдЧреНрд░рд╣ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╡рд╛рдВрдЫрд┐рдд рд╕реНрд░реЛрдд рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ - Google рдФрд░ "рд╕рд╣реА рдЕрдиреБрд░реЛрдзред"

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореБрдЭреЗ рдЬрд┐рд╕ рдлрд╝рд╛рдЗрд▓ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рд╡рд╣ рдЗрд╕ рд▓рд┐рдВрдХ рдкрд░ рд╕реНрдерд┐рдд рд╣реИред

screencap.cpp
 #include <errno.h> #include <unistd.h> #include <stdio.h> #include <fcntl.h> #include <stdlib.h> #include <string.h> #include <linux/fb.h> #include <sys/ioctl.h> #include <sys/mman.h> #include <binder/ProcessState.h> #include <gui/SurfaceComposerClient.h> #include <gui/ISurfaceComposer.h> #include <ui/DisplayInfo.h> #include <ui/PixelFormat.h> // TODO: Fix Skia. #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-parameter" #include <SkImageEncoder.h> #include <SkData.h> #pragma GCC diagnostic pop using namespace android; static uint32_t DEFAULT_DISPLAY_ID = ISurfaceComposer::eDisplayIdMain; static void usage(const char* pname) { fprintf(stderr, "usage: %s [-hp] [-d display-id] [FILENAME]\n" " -h: this message\n" " -p: save the file as a png.\n" " -d: specify the display id to capture, default %d.\n" "If FILENAME ends with .png it will be saved as a png.\n" "If FILENAME is not given, the results will be printed to stdout.\n", pname, DEFAULT_DISPLAY_ID ); } static SkColorType flinger2skia(PixelFormat f) { switch (f) { case PIXEL_FORMAT_RGB_565: return kRGB_565_SkColorType; default: return kN32_SkColorType; } } static status_t vinfoToPixelFormat(const fb_var_screeninfo& vinfo, uint32_t* bytespp, uint32_t* f) { switch (vinfo.bits_per_pixel) { case 16: *f = PIXEL_FORMAT_RGB_565; *bytespp = 2; break; case 24: *f = PIXEL_FORMAT_RGB_888; *bytespp = 3; break; case 32: // TODO: do better decoding of vinfo here *f = PIXEL_FORMAT_RGBX_8888; *bytespp = 4; break; default: return BAD_VALUE; } return NO_ERROR; } static status_t notifyMediaScanner(const char* fileName) { String8 cmd("am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d file://"); String8 fileUrl("\""); fileUrl.append(fileName); fileUrl.append("\""); cmd.append(fileName); cmd.append(" > /dev/null"); int result = system(cmd.string()); if (result < 0) { fprintf(stderr, "Unable to broadcast intent for media scanner.\n"); return UNKNOWN_ERROR; } return NO_ERROR; } int main(int argc, char** argv) { ProcessState::self()->startThreadPool(); const char* pname = argv[0]; bool png = false; int32_t displayId = DEFAULT_DISPLAY_ID; int c; while ((c = getopt(argc, argv, "phd:")) != -1) { switch (c) { case 'p': png = true; break; case 'd': displayId = atoi(optarg); break; case '?': case 'h': usage(pname); return 1; } } argc -= optind; argv += optind; int fd = -1; const char* fn = NULL; if (argc == 0) { fd = dup(STDOUT_FILENO); } else if (argc == 1) { fn = argv[0]; fd = open(fn, O_WRONLY | O_CREAT | O_TRUNC, 0664); if (fd == -1) { fprintf(stderr, "Error opening file: %s (%s)\n", fn, strerror(errno)); return 1; } const int len = strlen(fn); if (len >= 4 && 0 == strcmp(fn+len-4, ".png")) { png = true; } } if (fd == -1) { usage(pname); return 1; } void const* mapbase = MAP_FAILED; ssize_t mapsize = -1; void const* base = NULL; uint32_t w, s, h, f; size_t size = 0; // Maps orientations from DisplayInfo to ISurfaceComposer static const uint32_t ORIENTATION_MAP[] = { ISurfaceComposer::eRotateNone, // 0 == DISPLAY_ORIENTATION_0 ISurfaceComposer::eRotate270, // 1 == DISPLAY_ORIENTATION_90 ISurfaceComposer::eRotate180, // 2 == DISPLAY_ORIENTATION_180 ISurfaceComposer::eRotate90, // 3 == DISPLAY_ORIENTATION_270 }; ScreenshotClient screenshot; sp<IBinder> display = SurfaceComposerClient::getBuiltInDisplay(displayId); if (display == NULL) { fprintf(stderr, "Unable to get handle for display %d\n", displayId); return 1; } Vector<DisplayInfo> configs; SurfaceComposerClient::getDisplayConfigs(display, &configs); int activeConfig = SurfaceComposerClient::getActiveConfig(display); if (static_cast<size_t>(activeConfig) >= configs.size()) { fprintf(stderr, "Active config %d not inside configs (size %zu)\n", activeConfig, configs.size()); return 1; } uint8_t displayOrientation = configs[activeConfig].orientation; uint32_t captureOrientation = ORIENTATION_MAP[displayOrientation]; status_t result = screenshot.update(display, Rect(), 0, 0, 0, -1U, false, captureOrientation); if (result == NO_ERROR) { base = screenshot.getPixels(); w = screenshot.getWidth(); h = screenshot.getHeight(); s = screenshot.getStride(); f = screenshot.getFormat(); size = screenshot.getSize(); } else { const char* fbpath = "/dev/graphics/fb0"; int fb = open(fbpath, O_RDONLY); if (fb >= 0) { struct fb_var_screeninfo vinfo; if (ioctl(fb, FBIOGET_VSCREENINFO, &vinfo) == 0) { uint32_t bytespp; if (vinfoToPixelFormat(vinfo, &bytespp, &f) == NO_ERROR) { size_t offset = (vinfo.xoffset + vinfo.yoffset*vinfo.xres) * bytespp; w = vinfo.xres; h = vinfo.yres; s = vinfo.xres; size = w*h*bytespp; mapsize = offset + size; mapbase = mmap(0, mapsize, PROT_READ, MAP_PRIVATE, fb, 0); if (mapbase != MAP_FAILED) { base = (void const *)((char const *)mapbase + offset); } } } close(fb); } } if (base != NULL) { if (png) { const SkImageInfo info = SkImageInfo::Make(w, h, flinger2skia(f), kPremul_SkAlphaType); SkAutoTUnref<SkData> data(SkImageEncoder::EncodeData(info, base, s*bytesPerPixel(f), SkImageEncoder::kPNG_Type, SkImageEncoder::kDefaultQuality)); if (data.get()) { write(fd, data->data(), data->size()); } if (fn != NULL) { notifyMediaScanner(fn); } } else { write(fd, &w, 4); write(fd, &h, 4); write(fd, &f, 4); size_t Bpp = bytesPerPixel(f); for (size_t y=0 ; y<h ; y++) { write(fd, base, w*Bpp); base = (void *)((char *)base + s*Bpp); } } } close(fd); if (mapbase != MAP_FAILED) { munmap((void *)mapbase, mapsize); } return 0; } 


рд╣рдо рдЗрд╕ рдХреЛрдб рдХрд╛ рдЖрдВрд╢рд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗред

DEFAULT_DISPLAY_ID - рдЙрд╕ рдбрд┐рд╕реНрдкреНрд▓реЗ рдХрд╛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдЬрд┐рд╕рд╕реЗ рдЖрдк рдПрдХ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, 0ред

flinger2skia рдФрд░ vinfoToPixelFormat - рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ рдХрд┐ рдЫрд╡рд┐ рдХрд┐рд╕ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

InformMediaScanner - рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЫрд╡рд┐ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдкреНрд░рд╕рд╛рд░рдг рднреЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдпрджрд┐ рдЖрдк рдЗрд╕ рдкреНрд░рд╕рд╛рд░рдг рдХреЛ рдирд╣реАрдВ рдХрд╣рддреЗ рд╣реИрдВ, рддреЛ рд╕рднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдИ рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдирд╣реАрдВ рджреЗрдЦ рдкрд╛рдПрдВрдЧреЗред
рдореБрдЦреНрдп рдХрд╛рд░реНрдп "рдкрдврд╝рдирд╛" рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдХреЗрд╡рд▓ рдЙрди рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдЫрд╡рд┐ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдзреЗ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВред

/ dev / рдЧреНрд░рд╛рдлрд╝рд┐рдХреНрд╕ / fb0 рддрдерд╛рдХрдерд┐рдд рдлреНрд░реЗрдордмрдлрд╝рд░ рд╣реИред рдлрд╝реНрд░реЗрдордмрдлрд╝рд░ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рд╡реАрдбрд┐рдпреЛ рдлреНрд░реЗрдо рдХреЗ рдЕрд▓реНрдкрдХрд╛рд▓рд┐рдХ рднрдВрдбрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реАрдбрд┐рдпреЛ рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рд╣реИред рдореБрдЦреНрдп рдХреЛрдб рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реНрдХреНрд░реАрди рдЫрд╡рд┐ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдВрдбреНрд░реЙрдЗрдб рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрджрд┐ рдЖрдк "рднрд╛рдЧреНрдпрд╢рд╛рд▓реА" рд╣реИрдВ, рддреЛ vinfo.xoffset рдФрд░ vinfo.yoffset рдХреЛ рдкрд╣рдЪрд╛рдирдирд╛ (рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╡реЗ 0 рд╣реЛрдВрдЧреЗ) рдФрд░ рдХрдВрд╕реЛрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рд░рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 dd if=/dev/graphics/fb0 bs=<bytes per pixel> count=1 skip=<pixel offset> 2>/dev/null | hd 

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рдирд┐рдХрд▓рд╛ рдФрд░ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЫрд╡рд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИред

рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ .update рдЗрдореЗрдЬ рдкрд╛рдиреЗ рдХрд╛ рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ рд╣реИред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХрдИ рдЕрддрд┐рднрд╛рд░рд┐рдд рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВ рдЬреЛ рдпрд╣рд╛рдВ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ ред

рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╡рд┐рд╡рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

 ScreenshotClient::update(const sp<IBinder>& display, Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight, uint32_t minLayerZ, uint32_t maxLayerZ, bool useIdentityTransform, uint32_t rotation) 

рдбрд┐рд╕реНрдкреНрд▓реЗ - рдЖрд╡рд╢реНрдпрдХ рдбрд┐рд╕реНрдкреНрд▓реЗ рдХрд╛ рд▓рд┐рдВрдХред
sourceCrop - рдЪрдпрдирд┐рдд рдЫрд╡рд┐ рдХреНрд╖реЗрддреНрд░ рдХреА рдлрд╕рд▓ред рдЗрд╕рдореЗрдВ рдКрдкрд░реА рдмрд╛рдПрдВ рдмрд┐рдВрджреБ рдФрд░ рдирд┐рдЪрд▓реЗ рджрд╛рдПрдВ (рдХреБрд▓ 4 рдкреИрд░рд╛рдореАрдЯрд░ xLeft, yTop, xRight, yBottom) рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдореВрд▓ рдКрдкрд░реА рдмрд╛рдПрдБ рдХреЛрдиреЗ рд╣реИред
reqWidth - рд▓реМрдЯреА рд╣реБрдИ рдЫрд╡рд┐ рдХреА рдЪреМрдбрд╝рд╛рдИ
reqHeight - рд▓реМрдЯрд╛рдИ рдЧрдИ рдЫрд╡рд┐ рдХреА рдКрдВрдЪрд╛рдИ
minLayerZ рдФрд░ maxLayerZ - рдпреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдирд╣реАрдВ рд╕рдордЭрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореВрд▓реНрдпреЛрдВ рдХреА рдЧрдгрдирд╛ рдиреЗ рдХрднреА-рдХрднреА рдПрдХ рдХрд╛рд▓рд╛ рдирд▓ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд┐рдпрд╛
useIdentityTransform - рдпрджрд┐ рд╕рд╣реА рд╣реИ, рддреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдУрд╡рд░рд▓реЗ рдкрд░рдд рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░ рджреЗрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддред рд╡реЗ рдЧрддрд┐рд╡рд┐рдзрд┐рдпрд╛рдБ рдЬреЛ ACTION_MANAGE_OVERLAY_PERMISSION рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИрдВ
рд░реЛрдЯреЗрд╢рди - рдЫрд╡рд┐ рдХрд╛ рд░реЛрдЯреЗрд╢рдиред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкрд┐рдХреНрд╕реЗрд▓ рд░рдВрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ xLeft рдФрд░ yTop рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ 1 рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛, рдХреНрдпреЛрдВрдХрд┐ рдЙрд▓рдЯреА рдЧрд┐рдирддреА 0 рд╕реЗ рдЬрд╛рдПрдЧреА, рдФрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд┐рд░реНрджреЗрд╢ xRight, yBottom рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдЧреАред ReqWidth рдФрд░ reqHeight рдореЗрдВ рдорд╛рди рдХреЛ 1 рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдмрджрд▓рдХрд░, рд╣рдо рдЙрд╕ рдХреНрд╖реЗрддреНрд░ рдХреА рд╕реАрдорд╛рдУрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рдкреЗрдВрдЪрдХреИрдк рд╕рдВрдХрд▓рди


рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдмрд╕реЗ рдХрдард┐рди рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХрдИ рджрд┐рди рдпрд╛ рдкреВрд░реЗ рд╕рдкреНрддрд╛рд╣ рд▓рдЧ рд╕рдХрддреЗ рд╣реИрдВред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореБрдЭреЗ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рддреНрд╡рд░рд┐рдд рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдорд┐рд▓рд╛, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЦреБрдж рдХреЛ рдХреНрд▓реИрдВрдЧ рдФрд░ рдЗрд╕рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдкреАрдбрд╝рд╛ рджреЗрдирд╛ рдкрдбрд╝рд╛ред

рдпрджрд┐ рдЖрдк рддреБрд░рдВрдд рдЗрд╕ рдХреЛрдб рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рд▓рдЧрд╛рддрд╛рд░ рдпрд╣ рд╢рдкрде рд▓реЗрдЧрд╛ рдХрд┐ рдХреЛрдИ рдлрд╝рд╛рдЗрд▓ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдХрднреА-рдХрднреА рдпрд╣ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдлрд╝рд╛рдЗрд▓ рд╡рд╣рд╛рдБ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдЗрд╕рд▓рд┐рдП, рд╢реБрд░реВ рдореЗрдВ рдореИрдВрдиреЗ рдЙрди рд╕рднреА рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдЬреЛрдбрд╝рд╛, рдЬреЛ рдПрдирдбреАрдХреЗ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдирд╣реАрдВ рдереАрдВред рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдпрд╣ рдЕрдВрджрд╛рдЬрд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдпрд╛ рд╡рд╣ рдлрд╛рдЗрд▓ рдХрд╣рд╛рдВ рд╕реНрдерд┐рдд рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд▓рд╛рдкрддрд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдФрд░ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ sysroot рдХрд╣рд╛рдБ рд╕реНрдерд┐рдд рд╣реИ (рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдЬрд╣рд╛рдБ clang рдХреА рддрд▓рд╛рд╢ рд╣реИ), рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд "рд╕реБрд╡рд┐рдзрд╛" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 echo "#include <bogus.h> int main(){}" > tc; ~/arm/bin/clang -v tc; rm tc 

рддреНрд░реБрдЯрд┐ рдЗрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ рд░рд╛рд╕реНрддрд╛ рджрд┐рдЦрд╛рдПрдЧреАред рдпрджрд┐ рдЖрдкрдХрд╛ рдХреНрд▓реИрдВрдЧ рдХрд╣реАрдВ рдФрд░ рд╕реНрдерд┐рдд рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкрде рдмрджрд▓реЗрдВред

рд▓реЙрдЧ
 Android (4751641 based on r328903) clang version 7.0.2 (https://android.googlesource.com/toolchain/clang 003100370607242ddd5815e4a043907ea9004281) (https://android.googlesource.com/toolchain/llvm 1d739ffb0366421d383e04ff80ec2ee591315116) (based on LLVM 7.0.2svn) Target: armv7a-none-linux-android16 Thread model: posix InstalledDir: /Users/macbookair/arm/bin Found candidate GCC installation: /Users/macbookair/arm/bin/../lib/gcc/arm-linux-androideabi/4.9.x Selected GCC installation: /Users/macbookair/arm/bin/../lib/gcc/arm-linux-androideabi/4.9.x Candidate multilib: thumb;@mthumb Candidate multilib: armv7-a;@march=armv7-a Candidate multilib: armv7-a/thumb;@march=armv7-a@mthumb Candidate multilib: .; Selected multilib: armv7-a;@march=armv7-a "/Users/macbookair/arm/bin/clang70" -cc1 -triple armv7-none-linux-android16 -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -discard-value-names -main-file-name tc -mrelocation-model pic -pic-level 2 -pic-is-pie -mthread-model posix -mdisable-fp-elim -fmath-errno -masm-verbose -mconstructor-aliases -fuse-init-array -target-cpu generic -target-feature +soft-float-abi -target-abi aapcs-linux -mfloat-abi soft -fallow-half-arguments-and-returns -dwarf-column-info -debugger-tuning=gdb -target-linker-version 241.9 -v -resource-dir /Users/macbookair/arm/lib64/clang/7.0.2 -isysroot /Users/macbookair/arm/bin/../sysroot -internal-isystem /Users/macbookair/arm/bin/../sysroot/usr/local/include -internal-isystem /Users/macbookair/arm/lib64/clang/7.0.2/include -internal-externc-isystem /Users/macbookair/arm/bin/../sysroot/include -internal-externc-isystem /Users/macbookair/arm/bin/../sysroot/usr/include -fdebug-compilation-dir /Users/macbookair/Downloads/sji-android-screen-capture-master/src/android/capture -ferror-limit 19 -fmessage-length 80 -fno-signed-char -fobjc-runtime=gcc -fdiagnostics-show-option -fcolor-diagnostics -o /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/t-9f5ef7.o -xc tc clang -cc1 version 7.0.2 based upon LLVM 7.0.2svn default target x86_64-apple-darwin18.0.0 ignoring nonexistent directory "/Users/macbookair/arm/bin/../sysroot/include" #include "..." search starts here: #include <...> search starts here: /Users/macbookair/arm/bin/../sysroot/usr/local/include /Users/macbookair/arm/lib64/clang/7.0.2/include /Users/macbookair/arm/bin/../sysroot/usr/include End of search list. tc:1:10: error: expected "FILENAME" or <FILENAME> #include <bogus.h> int main(){} ^ 1 error generated. https://android.googlesource.com/toolchain/clang 003100370607242ddd5815e4a043907ea9004281) (https://android.googlesource.com/toolchain/llvm 1d739ffb0366421d383e04ff80ec2ee591315116) (LLVM 7.0 рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред Android (4751641 based on r328903) clang version 7.0.2 (https://android.googlesource.com/toolchain/clang 003100370607242ddd5815e4a043907ea9004281) (https://android.googlesource.com/toolchain/llvm 1d739ffb0366421d383e04ff80ec2ee591315116) (based on LLVM 7.0.2svn) Target: armv7a-none-linux-android16 Thread model: posix InstalledDir: /Users/macbookair/arm/bin Found candidate GCC installation: /Users/macbookair/arm/bin/../lib/gcc/arm-linux-androideabi/4.9.x Selected GCC installation: /Users/macbookair/arm/bin/../lib/gcc/arm-linux-androideabi/4.9.x Candidate multilib: thumb;@mthumb Candidate multilib: armv7-a;@march=armv7-a Candidate multilib: armv7-a/thumb;@march=armv7-a@mthumb Candidate multilib: .; Selected multilib: armv7-a;@march=armv7-a "/Users/macbookair/arm/bin/clang70" -cc1 -triple armv7-none-linux-android16 -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -discard-value-names -main-file-name tc -mrelocation-model pic -pic-level 2 -pic-is-pie -mthread-model posix -mdisable-fp-elim -fmath-errno -masm-verbose -mconstructor-aliases -fuse-init-array -target-cpu generic -target-feature +soft-float-abi -target-abi aapcs-linux -mfloat-abi soft -fallow-half-arguments-and-returns -dwarf-column-info -debugger-tuning=gdb -target-linker-version 241.9 -v -resource-dir /Users/macbookair/arm/lib64/clang/7.0.2 -isysroot /Users/macbookair/arm/bin/../sysroot -internal-isystem /Users/macbookair/arm/bin/../sysroot/usr/local/include -internal-isystem /Users/macbookair/arm/lib64/clang/7.0.2/include -internal-externc-isystem /Users/macbookair/arm/bin/../sysroot/include -internal-externc-isystem /Users/macbookair/arm/bin/../sysroot/usr/include -fdebug-compilation-dir /Users/macbookair/Downloads/sji-android-screen-capture-master/src/android/capture -ferror-limit 19 -fmessage-length 80 -fno-signed-char -fobjc-runtime=gcc -fdiagnostics-show-option -fcolor-diagnostics -o /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/t-9f5ef7.o -xc tc clang -cc1 version 7.0.2 based upon LLVM 7.0.2svn default target x86_64-apple-darwin18.0.0 ignoring nonexistent directory "/Users/macbookair/arm/bin/../sysroot/include" #include "..." search starts here: #include <...> search starts here: /Users/macbookair/arm/bin/../sysroot/usr/local/include /Users/macbookair/arm/lib64/clang/7.0.2/include /Users/macbookair/arm/bin/../sysroot/usr/include End of search list. tc:1:10: error: expected "FILENAME" or <FILENAME> #include <bogus.h> int main(){} ^ 1 error generated. 


рд╣рдо Google рдХреА рдУрд░ рд░реБрдЦ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдлрд╛рдЗрд▓реЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░рддреЗ рд╣реИрдВред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореБрдЭреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдФрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдкрдбрд╝рд╛:

рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдПрдБ рдФрд░ рдлрд╝рд╛рдЗрд▓реЗрдВ
 //  ~/arm/sysroot/usr/include/binder ~/arm/sysroot/usr/include/utils ~/arm/sysroot/usr/include/cutils ~/arm/sysroot/usr/include/log ~/arm/sysroot/usr/include/system ~/arm/sysroot/usr/include/gui ~/arm/sysroot/usr/include/ui ~/arm/sysroot/usr/include/hardware ~/arm/sysroot/usr/ports //  ~/arm/sysroot/usr/include/SkAnnotation.h ~/arm/sysroot/usr/include/SkAtomics.h ~/arm/sysroot/usr/include/SkBBHFactory.h ~/arm/sysroot/usr/include/SkBitmap.h ~/arm/sysroot/usr/include/SkBitmapDevice.h ~/arm/sysroot/usr/include/SkBlitRow.h ~/arm/sysroot/usr/include/SkBlurTypes.h ~/arm/sysroot/usr/include/SkCanvas.h ~/arm/sysroot/usr/include/SkChunkAlloc.h ~/arm/sysroot/usr/include/SkClipStack.h ~/arm/sysroot/usr/include/SkColor.h ~/arm/sysroot/usr/include/SkColorFilter.h ~/arm/sysroot/usr/include/SkColorPriv.h ~/arm/sysroot/usr/include/SkColorTable.h ~/arm/sysroot/usr/include/SkComposeShader.h ~/arm/sysroot/usr/include/SkData.h ~/arm/sysroot/usr/include/SkDataTable.h ~/arm/sysroot/usr/include/SkDeque.h ~/arm/sysroot/usr/include/SkDevice.h ~/arm/sysroot/usr/include/SkDither.h ~/arm/sysroot/usr/include/SkDocument.h ~/arm/sysroot/usr/include/SkDraw.h ~/arm/sysroot/usr/include/SkDrawable.h ~/arm/sysroot/usr/include/SkDrawFilter.h ~/arm/sysroot/usr/include/SkDrawLooper.h ~/arm/sysroot/usr/include/SkDrawPictureCallback.h ~/arm/sysroot/usr/include/SkEndian.h ~/arm/sysroot/usr/include/SkError.h ~/arm/sysroot/usr/include/SkFilterQuality.h ~/arm/sysroot/usr/include/SkFixed.h ~/arm/sysroot/usr/include/SkFlattenable.h ~/arm/sysroot/usr/include/SkFlattenableSerialization.h ~/arm/sysroot/usr/include/SkFloatBits.h ~/arm/sysroot/usr/include/SkFloatingPoint.h ~/arm/sysroot/usr/include/SkFont.h ~/arm/sysroot/usr/include/SkFontHost.h ~/arm/sysroot/usr/include/SkFontLCDConfig.h ~/arm/sysroot/usr/include/SkFontStyle.h ~/arm/sysroot/usr/include/SkGraphics.h ~/arm/sysroot/usr/include/SkImage.h ~/arm/sysroot/usr/include/SkImageDecoder.h ~/arm/sysroot/usr/include/SkImageEncoder.h ~/arm/sysroot/usr/include/SkImageFilter.h ~/arm/sysroot/usr/include/SkImageGenerator.h ~/arm/sysroot/usr/include/SkImageInfo.h ~/arm/sysroot/usr/include/SkInstCnt.h ~/arm/sysroot/usr/include/SkLazyPtr.h ~/arm/sysroot/usr/include/SkMallocPixelRef.h ~/arm/sysroot/usr/include/SkMask.h ~/arm/sysroot/usr/include/SkMaskFilter.h ~/arm/sysroot/usr/include/SkMath.h ~/arm/sysroot/usr/include/SkMatrix.h ~/arm/sysroot/usr/include/SkMetaData.h ~/arm/sysroot/usr/include/SkMultiPictureDraw.h ~/arm/sysroot/usr/include/SkMutex.h ~/arm/sysroot/usr/include/SkOnce.h ~/arm/sysroot/usr/include/SkOSFile.h ~/arm/sysroot/usr/include/SkPackBits.h ~/arm/sysroot/usr/include/SkPaint.h ~/arm/sysroot/usr/include/SkPath.h ~/arm/sysroot/usr/include/SkPathEffect.h ~/arm/sysroot/usr/include/SkPathMeasure.h ~/arm/sysroot/usr/include/SkPathRef.h ~/arm/sysroot/usr/include/SkPicture.h ~/arm/sysroot/usr/include/SkPictureRecorder.h ~/arm/sysroot/usr/include/SkPixelRef.h ~/arm/sysroot/usr/include/SkPixelSerializer.h ~/arm/sysroot/usr/include/SkPoint.h ~/arm/sysroot/usr/include/SkPostConfig.h ~/arm/sysroot/usr/include/SkPreConfig.h ~/arm/sysroot/usr/include/SkRasterizer.h ~/arm/sysroot/usr/include/SkRect.h ~/arm/sysroot/usr/include/SkRefCnt.h ~/arm/sysroot/usr/include/SkRegion.h ~/arm/sysroot/usr/include/SkRRect.h ~/arm/sysroot/usr/include/SkScalar.h ~/arm/sysroot/usr/include/SkShader.h ~/arm/sysroot/usr/include/SkSize.h ~/arm/sysroot/usr/include/SkSpinlock.h ~/arm/sysroot/usr/include/SkStream.h ~/arm/sysroot/usr/include/SkString.h ~/arm/sysroot/usr/include/SkStrokeRec.h ~/arm/sysroot/usr/include/SkSurface.h ~/arm/sysroot/usr/include/SkSurfaceProps.h ~/arm/sysroot/usr/include/SkTArray.h ~/arm/sysroot/usr/include/SkTDArray.h ~/arm/sysroot/usr/include/SkTDict.h ~/arm/sysroot/usr/include/SkTDStack.h ~/arm/sysroot/usr/include/SkTemplates.h ~/arm/sysroot/usr/include/SkTextBlob.h ~/arm/sysroot/usr/include/SkThread.h ~/arm/sysroot/usr/include/SkTime.h ~/arm/sysroot/usr/include/SkTInternalLList.h ~/arm/sysroot/usr/include/SkTLazy.h ~/arm/sysroot/usr/include/SkTRegistry.h ~/arm/sysroot/usr/include/SkTSearch.h ~/arm/sysroot/usr/include/SkTypeface.h ~/arm/sysroot/usr/include/SkTypes.h ~/arm/sysroot/usr/include/SkUnPreMultiply.h ~/arm/sysroot/usr/include/SkUserConfig.h ~/arm/sysroot/usr/include/SkUtils.h ~/arm/sysroot/usr/include/SkWeakRefCnt.h ~/arm/sysroot/usr/include/SkWriteBuffer.h ~/arm/sysroot/usr/include/SkWriter32.h ~/arm/sysroot/usr/include/SkXfermode.h //    ~/arm/sysroot/usr/include/android/log.h 


рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рд╡рд╣ рдПрдХ рд╕рдлрд▓рддрд╛ рд╣реИ, рдЬреЛ рд╕рднреА рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рдВрдХрд▓рди

 ~/arm/bin/clang -pie screencap.cpp -o ./screencap 

рдФрд░ рд╣рдореЗрдВ рдПрдХ рднрдпрд╛рдирдХ рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддрд╛ рд╣реИ:

рдирд░реНрд╡рд╕ рдордд рджреЗрдЦреЛ
 /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:function main: error: undefined reference to 'android::ProcessState::self()' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:function main: error: undefined reference to 'android::ProcessState::startThreadPool()' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:function main: error: undefined reference to 'android::ScreenshotClient::ScreenshotClient()' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:function main: error: undefined reference to 'android::SurfaceComposerClient::getBuiltInDisplay(int)' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:function main: error: undefined reference to 'android::SurfaceComposerClient::getDisplayConfigs(android::sp<android::IBinder> const&, android::Vector<android::DisplayInfo>*)' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:function main: error: undefined reference to 'android::SurfaceComposerClient::getActiveConfig(android::sp<android::IBinder> const&)' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:function main: error: undefined reference to 'android::ScreenshotClient::update(android::sp<android::IBinder> const&, android::Rect, unsigned int, unsigned int, unsigned int, unsigned int, bool, unsigned int)' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:function main: error: undefined reference to 'android::ScreenshotClient::getPixels() const' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:function main: error: undefined reference to 'android::ScreenshotClient::getWidth() const' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:function main: error: undefined reference to 'android::ScreenshotClient::getHeight() const' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:function main: error: undefined reference to 'android::ScreenshotClient::getStride() const' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:function main: error: undefined reference to 'android::ScreenshotClient::getFormat() const' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:function main: error: undefined reference to 'android::ScreenshotClient::getSize() const' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:function main: error: undefined reference to 'android::bytesPerPixel(int)' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:function main: error: undefined reference to 'SkImageEncoder::EncodeData(SkImageInfo const&, void const*, unsigned int, SkImageEncoder::Type, int)' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:function main: error: undefined reference to 'android::bytesPerPixel(int)' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:function main: error: undefined reference to 'android::ScreenshotClient::~ScreenshotClient()' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:function main: error: undefined reference to 'android::ScreenshotClient::~ScreenshotClient()' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:function main: error: undefined reference to 'stderr' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:function main: error: undefined reference to 'stderr' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:function main: error: undefined reference to 'stderr' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:function usage(char const*): error: undefined reference to 'stderr' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:function notifyMediaScanner(char const*): error: undefined reference to 'android::String8::String8(char const*)' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:function notifyMediaScanner(char const*): error: undefined reference to 'android::String8::String8(char const*)' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:function notifyMediaScanner(char const*): error: undefined reference to 'android::String8::append(char const*)' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:function notifyMediaScanner(char const*): error: undefined reference to 'android::String8::append(char const*)' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:function notifyMediaScanner(char const*): error: undefined reference to 'android::String8::append(char const*)' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:function notifyMediaScanner(char const*): error: undefined reference to 'android::String8::append(char const*)' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:function notifyMediaScanner(char const*): error: undefined reference to 'android::String8::~String8()' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:function notifyMediaScanner(char const*): error: undefined reference to 'android::String8::~String8()' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:function notifyMediaScanner(char const*): error: undefined reference to 'android::String8::~String8()' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:function notifyMediaScanner(char const*): error: undefined reference to 'android::String8::~String8()' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o(.ARM.extab+0x0): error: undefined reference to '__gxx_personality_v0' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o(.ARM.extab+0x48): error: undefined reference to '__gxx_personality_v0' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:function android::sp<android::ProcessState>::~sp(): error: undefined reference to 'android::RefBase::decStrong(void const*) const' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o(.ARM.extab.text._ZN7android2spINS_12ProcessStateEED2Ev+0x0): error: undefined reference to '__gxx_personality_v0' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:function android::Vector<android::DisplayInfo>::Vector(): error: undefined reference to 'android::VectorImpl::VectorImpl(unsigned int, unsigned int)' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:function android::Vector<android::DisplayInfo>::operator[](unsigned int) const: error: undefined reference to '__android_log_assert' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o(.ARM.extab.text._ZN12SkAutoTUnrefI6SkDataED2Ev+0x0): error: undefined reference to '__gxx_personality_v0' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:function android::Vector<android::DisplayInfo>::~Vector(): error: undefined reference to 'android::VectorImpl::finish_vector()' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:function android::Vector<android::DisplayInfo>::~Vector(): error: undefined reference to 'android::VectorImpl::~VectorImpl()' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:function android::Vector<android::DisplayInfo>::~Vector(): error: undefined reference to 'android::VectorImpl::~VectorImpl()' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:function android::sp<android::IBinder>::~sp(): error: undefined reference to 'android::RefBase::decStrong(void const*) const' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:function __clang_call_terminate: error: undefined reference to '__cxa_begin_catch' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:function __clang_call_terminate: error: undefined reference to 'std::terminate()' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:function android::Vector<android::DisplayInfo>::~Vector(): error: undefined reference to 'operator delete(void*)' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:function SkRefCntBase::unref() const: error: undefined reference to 'SkDebugf(char const*, ...)' /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:typeinfo for android::Vector<android::DisplayInfo>: error: undefined reference to 'vtable for __cxxabiv1::__vmi_class_type_info' /Users/macbookair/Documents/test/bin/../lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld: the vtable symbol may be undefined because the class is missing its key function /var/folders/_4/7d51802j1hz2rnmql8kngx5w0000gn/T/screencap-175810.o:screencap.cpp:typeinfo for android::Vector<android::DisplayInfo>: error: undefined reference to 'typeinfo for android::VectorImpl' clang70: error: linker command failed with exit code 1 (use -v to see invocation) 


рдореЗрд░реЗ рд▓рд┐рдП, рдпрд╣ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдирд░рдХ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдХрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдереАрдВ, рдЬреЛ рдХрд┐ рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕рд╛рдордЧреНрд░реА рдирд╣реАрдВ рдмрджрд▓реАред рдЗрд╕ рд╕реНрддрд░ рдкрд░, рдореИрдВ рдПрдХ рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рдмреИрда рдЧрдпрд╛ рдФрд░ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ Google рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЙрд╕ рдЙрддреНрддрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдорд┐рд▓реАред рдореИрдВрдиреЗ рдЬрд┐рд╕ рдХреНрд▓реИрдЧ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЛ рдпрд╛рдж рд░рдЦрдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рд╕реАрдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдиреЗ рдореБрдЭреЗ рдмрдЪрд╛ рд▓рд┐рдпрд╛!

рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдХреНрд▓реИрдВрдЧ рдореЗрдВ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ (рдпрд╛ рдмрд▓реНрдХрд┐ ld ) рд╣реИ - рдЕрдкреНрд░рдХрд╛рд╢рд┐рдд-рдкреНрд░рддреАрдХ, рдЬреЛ рдЕрдирд╕реБрд▓рдЭреЗ рдкрд╛рддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред , . :

 ~/arm/bin/clang -pie screencap.cpp -o ./screencap -Wl,--unresolved-symbols=ignore-all -s 

- ! , , , . , :

 CANNOT LINK EXECUTABLE: cannot locate symbol "_ZN7android12ProcessState4selfEv" 

, , Android .so . , . screencap, Android- (/system/bin/screencap) .so , . :

 ...libdl.so__libc_initlibc.so__cxa_atexit__register_atfork__gnu_Unwind_Find_exidxLIBC_PRIVATE_ZNK7android6VectorINS_11DisplayInfoEE12do_constructEPvj__snprintf_chk__aeabi_memset__aeabi_memcpy_ZNK7android6VectorINS_11DisplayInfoEE10do_destroyEPvj_ZNK7android6VectorINS_11DisplayInfoEE7do_copyEPvPKvj_ZNK7android6VectorINS_11DisplayInfoEE8do_splatEPvPKvj_ZNK7android6VectorINS_11DisplayInfoEE15do_move_forwardEPvPKvj_ZNK7android6VectorINS_11DisplayInfoEE16do_move_backwardEPvPKvj_ZN7android10VectorImpl13finish_vectorEv_ZN7android10VectorImplD2Ev_ZTVN7android6VectorINS_11DisplayInfoEEE_ZdlPvsignal__android_log_print_ZN7android12ProcessState4selfEv_ZN7android12ProcessState15startThreadPoolEv_ZNK7android7RefBase9decStrongEPKvgetoptatoidupopen__errnostrerrorfprintfstrlenstrcmp_ZN7android16ScreenshotClientC1Ev_ZN7android21SurfaceComposerClient17getBuiltInDisplayEi_ZN7android10VectorImplC2Ejj_ZN7android21SurfaceComposerClient17getDisplayConfigsERKNS_2spINS_7IBinderEEEPNS_6VectorINS_11DisplayInfoEEE_ZN7android21SurfaceComposerClient15getActiveConfigERKNS_2spINS_7IBinderEEE_ZN7android16ScreenshotClient6updateERKNS_2spINS_7IBinderEEENS_4RectEjjjjbj_ZNK7android16ScreenshotClient9getPixelsEv_ZNK7android16ScreenshotClient8getWidthEv_ZNK7android16ScreenshotClient9getHeightEv_ZNK7android16ScreenshotClient9getStrideEv_ZNK7android16ScreenshotClient9getFormatEv_ZNK7android16ScreenshotClient7getSizeEvioctlclose_ZN7android13bytesPerPixelEi_ZN14SkImageEncoder10EncodeDataERK11SkImageInfoPKvjNS_4TypeEiwrite_ZN7android7String8C1EPKc_ZN7android7String86appendEPKcsystemfputs_ZN7android7String8D1Evmunmap_ZN7android16ScreenshotClientD1Evmmapoptargstderroptindabort_edata__bss_start_endlibcutils.solibutils.solibbinder.solibskia.solibui.solibgui.solibc++.solibm.so... 


, . : libgui.so, libui.so, libcutils.so, libutils.so, libbinder.so, libskia.so. ( , ):

 find -name 'libskia.so' 2>/dev/null /system/lib/libskia.so 

sdcard/libs ( libskia.so):

 ./system/lib/libskia.so /sdcard/ 

adb pull . :

 adb pull /sdcard/libs ~/arm 

, *.so, , .so , тАФ .

 ~/arm/bin/clang -pie screencap.cpp *.so -o ./screencap -Wl,--unresolved-symbols=ignore-all -s 

. .


, ┬л ┬╗ .

screencap . , . , .

screencap.cpp
 #include <errno.h> #include <unistd.h> #include <stdio.h> #include <fcntl.h> #include <stdlib.h> #include <string.h> #include <linux/fb.h> #include <sys/ioctl.h> #include <sys/mman.h> #include <binder/ProcessState.h> #include <gui/SurfaceComposerClient.h> #include <gui/ISurfaceComposer.h> #include <ui/DisplayInfo.h> #include <ui/PixelFormat.h> // TODO: Fix Skia. #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-parameter" #include <SkImageEncoder.h> #include <SkData.h> #pragma GCC diagnostic pop using namespace android; static uint32_t DEFAULT_DISPLAY_ID = ISurfaceComposer::eDisplayIdMain; static void usage(const char* pname) { fprintf(stderr, "usage: %s [-hpcr] [-d display-id] [FILENAME] [x1 y1] [x2 y2]\n" " -h: this message\n" " -p: save the file as a png.\n" " -d: specify the display id to capture, default %d.\n" " -c: print pixel color [xy].\n" " -r: get rectangle area [x1 - left y1 - top x2 - right y2 - bottom].\n" "If FILENAME ends with .png it will be saved as a png.\n" "If FILENAME is not given, the results will be printed to stdout.\n", pname, DEFAULT_DISPLAY_ID ); } static SkColorType flinger2skia(PixelFormat f) { switch (f) { case PIXEL_FORMAT_RGB_565: return kRGB_565_SkColorType; default: return kN32_SkColorType; } } static status_t vinfoToPixelFormat(const fb_var_screeninfo& vinfo, uint32_t* bytespp, uint32_t* f) { switch (vinfo.bits_per_pixel) { case 16: *f = PIXEL_FORMAT_RGB_565; *bytespp = 2; break; case 24: *f = PIXEL_FORMAT_RGB_888; *bytespp = 3; break; case 32: // TODO: do better decoding of vinfo here *f = PIXEL_FORMAT_RGBX_8888; *bytespp = 4; break; default: return BAD_VALUE; } return NO_ERROR; } static status_t notifyMediaScanner(const char* fileName) { String8 cmd("am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d file://"); String8 fileUrl("\""); fileUrl.append(fileName); fileUrl.append("\""); cmd.append(fileName); cmd.append(" > /dev/null"); int result = system(cmd.string()); if (result < 0) { fprintf(stderr, "Unable to broadcast intent for media scanner.\n"); return UNKNOWN_ERROR; } return NO_ERROR; } int main(int argc, char** argv) { ProcessState::self()->startThreadPool(); const char* pname = argv[0]; int x1,x2,y1,y2; bool png = false; bool color = false; bool rectangle = false; int32_t displayId = DEFAULT_DISPLAY_ID; int c; while ((c = getopt(argc, argv, "phdcr:")) != -1) { switch (c) { case 'p': png = true; break; case 'd': displayId = atoi(optarg); break; case 'c': color = true; break; case 'r': rectangle = true; break; case '?': case 'h': usage(pname); return 1; } } argc -= optind; if (color) { x1 = atoi(argv[2])-1; y1 = atoi(argv[3])-1; x2 = atoi(argv[2]); y2 = atoi(argv[3]); } else if (rectangle) { x1 = atoi(argv[3]); y1 = atoi(argv[4]); x2 = atoi(argv[5]); y2 = atoi(argv[6]); optind--; } argv += optind; int fd = -1; const char* fn = NULL; if (argc == 0) { fd = dup(STDOUT_FILENO); } else if (argc == 1 || argc == 4) { fn = argv[0]; fd = open(fn, O_WRONLY | O_CREAT | O_TRUNC, 0664); if (fd == -1) { fprintf(stderr, "Error opening file: %s (%s)\n", fn, strerror(errno)); return 1; } const int len = strlen(fn); if (len >= 4 && 0 == strcmp(fn+len-4, ".png")) { png = true; } } if (fd == -1 && !color && !rectangle) { usage(pname); return 1; } void const* mapbase = MAP_FAILED; ssize_t mapsize = -1; void const* base = NULL; uint32_t w, s, h, f; size_t size = 0; // Maps orientations from DisplayInfo to ISurfaceComposer static const uint32_t ORIENTATION_MAP[] = { ISurfaceComposer::eRotateNone, // 0 == DISPLAY_ORIENTATION_0 ISurfaceComposer::eRotate270, // 1 == DISPLAY_ORIENTATION_90 ISurfaceComposer::eRotate180, // 2 == DISPLAY_ORIENTATION_180 ISurfaceComposer::eRotate90, // 3 == DISPLAY_ORIENTATION_270 }; ScreenshotClient screenshot; sp<IBinder> display = SurfaceComposerClient::getBuiltInDisplay(displayId); if (display == NULL) { fprintf(stderr, "Unable to get handle for display %d\n", displayId); return 1; } Vector<DisplayInfo> configs; SurfaceComposerClient::getDisplayConfigs(display, &configs); int activeConfig = SurfaceComposerClient::getActiveConfig(display); if (static_cast<size_t>(activeConfig) >= configs.size()) { fprintf(stderr, "Active config %d not inside configs (size %zu)\n", activeConfig, configs.size()); return 1; } uint8_t displayOrientation = configs[activeConfig].orientation; uint32_t captureOrientation = ORIENTATION_MAP[displayOrientation]; status_t result; if (color || rectangle) { result = screenshot.update(display, Rect(x1,y1,x2,y2), x2-x1, y2-y1, 0, -1U, false, captureOrientation); } else { result = screenshot.update(display, Rect(), 0, 0, 0, -1U, false, captureOrientation); } if (result == NO_ERROR) { base = screenshot.getPixels(); w = screenshot.getWidth(); h = screenshot.getHeight(); s = screenshot.getStride(); f = screenshot.getFormat(); size = screenshot.getSize(); if (color) { size_t Bpp = 4; //bytesPerPixel char* rawImageData; rawImageData = (char *)base; base = (void *)((char *)base + Bpp); for (int i=0; i<sizeof(rawImageData); i++) { printf( "%02X", rawImageData[i]); } return 1; } } else { const char* fbpath = "/dev/graphics/fb0"; int fb = open(fbpath, O_RDONLY); if (fb >= 0) { struct fb_var_screeninfo vinfo; if (ioctl(fb, FBIOGET_VSCREENINFO, &vinfo) == 0) { uint32_t bytespp; if (vinfoToPixelFormat(vinfo, &bytespp, &f) == NO_ERROR) { size_t offset = (vinfo.xoffset + vinfo.yoffset*vinfo.xres) * bytespp; w = vinfo.xres; h = vinfo.yres; s = vinfo.xres; size = w*h*bytespp; mapsize = offset + size; mapbase = mmap(0, mapsize, PROT_READ, MAP_PRIVATE, fb, 0); if (mapbase != MAP_FAILED) { base = (void const *)((char const *)mapbase + offset); } } } close(fb); } } if (base != NULL) { if (png) { const SkImageInfo info = SkImageInfo::Make(w, h, flinger2skia(f), kPremul_SkAlphaType); SkAutoTUnref<SkData> data(SkImageEncoder::EncodeData(info, base, s*bytesPerPixel(f), SkImageEncoder::kPNG_Type, SkImageEncoder::kDefaultQuality)); if (data.get()) { write(fd, data->data(), data->size()); } if (fn != NULL) { notifyMediaScanner(fn); } } else { write(fd, &w, 4); write(fd, &h, 4); write(fd, &f, 4); size_t Bpp = bytesPerPixel(f); for (size_t y=0 ; y<h ; y++) { write(fd, base, w*Bpp); base = (void *)((char *)base + s*Bpp); } } } close(fd); if (mapbase != MAP_FAILED) { munmap((void *)mapbase, mapsize); } return 0; } 


:

 ./screencap -c 100 100 

:

 ./screencap -r /sdcard/test.png 0 0 720 640 

GitHub , тАФ .

PS , тАФ .

Source: https://habr.com/ru/post/hi456264/


All Articles