Loading AconfigFlags.bp +24 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ aconfig_declarations_group { "android.app.appfunctions.flags-aconfig-java", "android.app.contextualsearch.flags-aconfig-java", "android.app.flags-aconfig-java", "android.app.jank.flags-aconfig-java", "android.app.ondeviceintelligence-aconfig-java", "android.app.smartspace.flags-aconfig-java", "android.app.supervision.flags-aconfig-java", Loading Loading @@ -77,6 +78,7 @@ aconfig_declarations_group { "android.view.inputmethod.flags-aconfig-java", "android.webkit.flags-aconfig-java", "android.widget.flags-aconfig-java", "art_exported_aconfig_flags_lib", "backstage_power_flags_lib", "backup_flags_lib", "camera_platform_flags_core_java_lib", Loading Loading @@ -139,6 +141,14 @@ java_defaults { libs: ["fake_device_config"], } // ART java_aconfig_library { name: "art_exported_aconfig_flags_lib", aconfig_declarations: "art-aconfig-flags", mode: "exported", defaults: ["framework-minus-apex-aconfig-java-defaults"], } // Camera java_aconfig_library { name: "camera_platform_flags_core_java_lib", Loading Loading @@ -1606,3 +1616,17 @@ java_aconfig_library { aconfig_declarations: "interaction_jank_monitor_flags", defaults: ["framework-minus-apex-aconfig-java-defaults"], } // App Jank aconfig_declarations { name: "android.app.jank.flags-aconfig", package: "android.app.jank", container: "system", srcs: ["core/java/android/app/jank/flags.aconfig"], } java_aconfig_library { name: "android.app.jank.flags-aconfig-java", aconfig_declarations: "android.app.jank.flags-aconfig", defaults: ["framework-minus-apex-aconfig-java-defaults"], } Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -427,6 +427,7 @@ java_defaults { "modules-utils-expresslog", "perfetto_trace_javastream_protos_jarjar", "libaconfig_java_proto_nano", "aconfig_device_paths_java", ], } Loading cmds/screencap/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ cc_binary { "libutils", "libbinder", "libjnigraphics", "libhwui", "libui", "libgui", ], Loading cmds/screencap/screencap.cpp +100 −31 Original line number Diff line number Diff line Loading @@ -15,36 +15,28 @@ */ #include <android/bitmap.h> #include <android/graphics/bitmap.h> #include <android/gui/DisplayCaptureArgs.h> #include <binder/ProcessState.h> #include <errno.h> #include <unistd.h> #include <stdio.h> #include <fcntl.h> #include <stdlib.h> #include <string.h> #include <getopt.h> #include <linux/fb.h> #include <sys/ioctl.h> #include <sys/mman.h> #include <sys/wait.h> #include <android/bitmap.h> #include <binder/ProcessState.h> #include <ftl/concat.h> #include <ftl/optional.h> #include <getopt.h> #include <gui/ISurfaceComposer.h> #include <gui/SurfaceComposerClient.h> #include <gui/SyncScreenCaptureListener.h> #include <linux/fb.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/ioctl.h> #include <sys/mman.h> #include <sys/wait.h> #include <system/graphics.h> #include <ui/GraphicTypes.h> #include <ui/PixelFormat.h> #include <system/graphics.h> using namespace android; #define COLORSPACE_UNKNOWN 0 Loading Loading @@ -85,10 +77,11 @@ enum { }; } static const struct option LONG_OPTIONS[] = { {"png", no_argument, nullptr, 'p'}, static const struct option LONG_OPTIONS[] = {{"png", no_argument, nullptr, 'p'}, {"jpeg", no_argument, nullptr, 'j'}, {"help", no_argument, nullptr, 'h'}, {"hint-for-seamless", no_argument, nullptr, LongOpts::HintForSeamless}, {"hint-for-seamless", no_argument, nullptr, LongOpts::HintForSeamless}, {0, 0, 0, 0}}; static int32_t flinger2bitmapFormat(PixelFormat f) Loading Loading @@ -170,10 +163,11 @@ status_t capture(const DisplayId displayId, return 0; } status_t saveImage(const char* fn, bool png, const ScreenCaptureResults& captureResults) { status_t saveImage(const char* fn, std::optional<AndroidBitmapCompressFormat> format, const ScreenCaptureResults& captureResults) { void* base = nullptr; ui::Dataspace dataspace = captureResults.capturedDataspace; sp<GraphicBuffer> buffer = captureResults.buffer; const sp<GraphicBuffer>& buffer = captureResults.buffer; status_t result = buffer->lock(GraphicBuffer::USAGE_SW_READ_OFTEN, &base); Loading @@ -188,22 +182,48 @@ status_t saveImage(const char* fn, bool png, const ScreenCaptureResults& capture return 1; } void* gainmapBase = nullptr; sp<GraphicBuffer> gainmap = captureResults.optionalGainMap; if (gainmap) { result = gainmap->lock(GraphicBuffer::USAGE_SW_READ_OFTEN, &gainmapBase); if (gainmapBase == nullptr || result != NO_ERROR) { fprintf(stderr, "Failed to capture gainmap with error code (%d)\n", result); gainmapBase = nullptr; // Fall-through: just don't attempt to write the gainmap } } int fd = -1; if (fn == nullptr) { fd = dup(STDOUT_FILENO); if (fd == -1) { fprintf(stderr, "Error writing to stdout. (%s)\n", strerror(errno)); if (gainmapBase) { gainmap->unlock(); } if (base) { buffer->unlock(); } return 1; } } else { fd = open(fn, O_WRONLY | O_CREAT | O_TRUNC, 0664); if (fd == -1) { fprintf(stderr, "Error opening file: %s (%s)\n", fn, strerror(errno)); if (gainmapBase) { gainmap->unlock(); } if (base) { buffer->unlock(); } return 1; } } if (png) { if (format) { AndroidBitmapInfo info; info.format = flinger2bitmapFormat(buffer->getPixelFormat()); info.flags = ANDROID_BITMAP_FLAGS_ALPHA_PREMUL; Loading @@ -211,16 +231,31 @@ status_t saveImage(const char* fn, bool png, const ScreenCaptureResults& capture info.height = buffer->getHeight(); info.stride = buffer->getStride() * bytesPerPixel(buffer->getPixelFormat()); int result = AndroidBitmap_compress(&info, static_cast<int32_t>(dataspace), base, ANDROID_BITMAP_COMPRESS_FORMAT_PNG, 100, &fd, int result; if (gainmapBase) { result = ABitmap_compressWithGainmap(&info, static_cast<ADataSpace>(dataspace), base, gainmapBase, captureResults.hdrSdrRatio, *format, 100, &fd, [](void* fdPtr, const void* data, size_t size) -> bool { int bytesWritten = write(*static_cast<int*>(fdPtr), data, size); return bytesWritten == size; }); } else { result = AndroidBitmap_compress(&info, static_cast<int32_t>(dataspace), base, *format, 100, &fd, [](void* fdPtr, const void* data, size_t size) -> bool { int bytesWritten = write(*static_cast<int*>(fdPtr), data, size); return bytesWritten == size; }); } if (result != ANDROID_BITMAP_RESULT_SUCCESS) { fprintf(stderr, "Failed to compress PNG (error code: %d)\n", result); fprintf(stderr, "Failed to compress (error code: %d)\n", result); } if (fn != NULL) { Loading @@ -245,6 +280,14 @@ status_t saveImage(const char* fn, bool png, const ScreenCaptureResults& capture } close(fd); if (gainmapBase) { gainmap->unlock(); } if (base) { buffer->unlock(); } return 0; } Loading @@ -262,13 +305,17 @@ int main(int argc, char** argv) gui::CaptureArgs captureArgs; const char* pname = argv[0]; bool png = false; bool jpeg = false; bool all = false; int c; while ((c = getopt_long(argc, argv, "aphd:", LONG_OPTIONS, nullptr)) != -1) { while ((c = getopt_long(argc, argv, "apjhd:", LONG_OPTIONS, nullptr)) != -1) { switch (c) { case 'p': png = true; break; case 'j': jpeg = true; break; case 'd': { errno = 0; char* end = nullptr; Loading Loading @@ -325,6 +372,14 @@ int main(int argc, char** argv) baseName = filename.substr(0, filename.size()-4); suffix = ".png"; png = true; } else if (filename.ends_with(".jpeg")) { baseName = filename.substr(0, filename.size() - 5); suffix = ".jpeg"; jpeg = true; } else if (filename.ends_with(".jpg")) { baseName = filename.substr(0, filename.size() - 4); suffix = ".jpg"; jpeg = true; } else { baseName = filename; } Loading @@ -350,6 +405,20 @@ int main(int argc, char** argv) } } if (png && jpeg) { fprintf(stderr, "Ambiguous file type"); return 1; } std::optional<AndroidBitmapCompressFormat> format = std::nullopt; if (png) { format = ANDROID_BITMAP_COMPRESS_FORMAT_PNG; } else if (jpeg) { format = ANDROID_BITMAP_COMPRESS_FORMAT_JPEG; captureArgs.attachGainmap = true; } // setThreadPoolMaxThreadCount(0) actually tells the kernel it's // not allowed to spawn any additional threads, but we still spawn // a binder thread from userspace when we call startThreadPool(). Loading Loading @@ -385,7 +454,7 @@ int main(int argc, char** argv) if (!filename.empty()) { fn = filename.c_str(); } if (const status_t saveImageStatus = saveImage(fn, png, result) != 0) { if (const status_t saveImageStatus = saveImage(fn, format, result) != 0) { fprintf(stderr, "Saving image failed.\n"); return saveImageStatus; } Loading core/api/current.txt +2 −0 Original line number Diff line number Diff line Loading @@ -6396,6 +6396,7 @@ package android.app { method public android.graphics.drawable.Icon getLargeIcon(); method @Nullable public android.content.LocusId getLocusId(); method public CharSequence getSettingsText(); method @FlaggedApi("android.app.api_rich_ongoing") @Nullable public String getShortCriticalText(); method public String getShortcutId(); method public android.graphics.drawable.Icon getSmallIcon(); method public String getSortKey(); Loading Loading @@ -6719,6 +6720,7 @@ package android.app { method @NonNull public android.app.Notification.Builder setPublicVersion(android.app.Notification); method @NonNull public android.app.Notification.Builder setRemoteInputHistory(CharSequence[]); method @NonNull public android.app.Notification.Builder setSettingsText(CharSequence); method @FlaggedApi("android.app.api_rich_ongoing") @NonNull public android.app.Notification.Builder setShortCriticalText(@Nullable String); method @NonNull public android.app.Notification.Builder setShortcutId(String); method @NonNull public android.app.Notification.Builder setShowWhen(boolean); method @NonNull public android.app.Notification.Builder setSmallIcon(@DrawableRes int); Loading
AconfigFlags.bp +24 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ aconfig_declarations_group { "android.app.appfunctions.flags-aconfig-java", "android.app.contextualsearch.flags-aconfig-java", "android.app.flags-aconfig-java", "android.app.jank.flags-aconfig-java", "android.app.ondeviceintelligence-aconfig-java", "android.app.smartspace.flags-aconfig-java", "android.app.supervision.flags-aconfig-java", Loading Loading @@ -77,6 +78,7 @@ aconfig_declarations_group { "android.view.inputmethod.flags-aconfig-java", "android.webkit.flags-aconfig-java", "android.widget.flags-aconfig-java", "art_exported_aconfig_flags_lib", "backstage_power_flags_lib", "backup_flags_lib", "camera_platform_flags_core_java_lib", Loading Loading @@ -139,6 +141,14 @@ java_defaults { libs: ["fake_device_config"], } // ART java_aconfig_library { name: "art_exported_aconfig_flags_lib", aconfig_declarations: "art-aconfig-flags", mode: "exported", defaults: ["framework-minus-apex-aconfig-java-defaults"], } // Camera java_aconfig_library { name: "camera_platform_flags_core_java_lib", Loading Loading @@ -1606,3 +1616,17 @@ java_aconfig_library { aconfig_declarations: "interaction_jank_monitor_flags", defaults: ["framework-minus-apex-aconfig-java-defaults"], } // App Jank aconfig_declarations { name: "android.app.jank.flags-aconfig", package: "android.app.jank", container: "system", srcs: ["core/java/android/app/jank/flags.aconfig"], } java_aconfig_library { name: "android.app.jank.flags-aconfig-java", aconfig_declarations: "android.app.jank.flags-aconfig", defaults: ["framework-minus-apex-aconfig-java-defaults"], }
Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -427,6 +427,7 @@ java_defaults { "modules-utils-expresslog", "perfetto_trace_javastream_protos_jarjar", "libaconfig_java_proto_nano", "aconfig_device_paths_java", ], } Loading
cmds/screencap/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ cc_binary { "libutils", "libbinder", "libjnigraphics", "libhwui", "libui", "libgui", ], Loading
cmds/screencap/screencap.cpp +100 −31 Original line number Diff line number Diff line Loading @@ -15,36 +15,28 @@ */ #include <android/bitmap.h> #include <android/graphics/bitmap.h> #include <android/gui/DisplayCaptureArgs.h> #include <binder/ProcessState.h> #include <errno.h> #include <unistd.h> #include <stdio.h> #include <fcntl.h> #include <stdlib.h> #include <string.h> #include <getopt.h> #include <linux/fb.h> #include <sys/ioctl.h> #include <sys/mman.h> #include <sys/wait.h> #include <android/bitmap.h> #include <binder/ProcessState.h> #include <ftl/concat.h> #include <ftl/optional.h> #include <getopt.h> #include <gui/ISurfaceComposer.h> #include <gui/SurfaceComposerClient.h> #include <gui/SyncScreenCaptureListener.h> #include <linux/fb.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/ioctl.h> #include <sys/mman.h> #include <sys/wait.h> #include <system/graphics.h> #include <ui/GraphicTypes.h> #include <ui/PixelFormat.h> #include <system/graphics.h> using namespace android; #define COLORSPACE_UNKNOWN 0 Loading Loading @@ -85,10 +77,11 @@ enum { }; } static const struct option LONG_OPTIONS[] = { {"png", no_argument, nullptr, 'p'}, static const struct option LONG_OPTIONS[] = {{"png", no_argument, nullptr, 'p'}, {"jpeg", no_argument, nullptr, 'j'}, {"help", no_argument, nullptr, 'h'}, {"hint-for-seamless", no_argument, nullptr, LongOpts::HintForSeamless}, {"hint-for-seamless", no_argument, nullptr, LongOpts::HintForSeamless}, {0, 0, 0, 0}}; static int32_t flinger2bitmapFormat(PixelFormat f) Loading Loading @@ -170,10 +163,11 @@ status_t capture(const DisplayId displayId, return 0; } status_t saveImage(const char* fn, bool png, const ScreenCaptureResults& captureResults) { status_t saveImage(const char* fn, std::optional<AndroidBitmapCompressFormat> format, const ScreenCaptureResults& captureResults) { void* base = nullptr; ui::Dataspace dataspace = captureResults.capturedDataspace; sp<GraphicBuffer> buffer = captureResults.buffer; const sp<GraphicBuffer>& buffer = captureResults.buffer; status_t result = buffer->lock(GraphicBuffer::USAGE_SW_READ_OFTEN, &base); Loading @@ -188,22 +182,48 @@ status_t saveImage(const char* fn, bool png, const ScreenCaptureResults& capture return 1; } void* gainmapBase = nullptr; sp<GraphicBuffer> gainmap = captureResults.optionalGainMap; if (gainmap) { result = gainmap->lock(GraphicBuffer::USAGE_SW_READ_OFTEN, &gainmapBase); if (gainmapBase == nullptr || result != NO_ERROR) { fprintf(stderr, "Failed to capture gainmap with error code (%d)\n", result); gainmapBase = nullptr; // Fall-through: just don't attempt to write the gainmap } } int fd = -1; if (fn == nullptr) { fd = dup(STDOUT_FILENO); if (fd == -1) { fprintf(stderr, "Error writing to stdout. (%s)\n", strerror(errno)); if (gainmapBase) { gainmap->unlock(); } if (base) { buffer->unlock(); } return 1; } } else { fd = open(fn, O_WRONLY | O_CREAT | O_TRUNC, 0664); if (fd == -1) { fprintf(stderr, "Error opening file: %s (%s)\n", fn, strerror(errno)); if (gainmapBase) { gainmap->unlock(); } if (base) { buffer->unlock(); } return 1; } } if (png) { if (format) { AndroidBitmapInfo info; info.format = flinger2bitmapFormat(buffer->getPixelFormat()); info.flags = ANDROID_BITMAP_FLAGS_ALPHA_PREMUL; Loading @@ -211,16 +231,31 @@ status_t saveImage(const char* fn, bool png, const ScreenCaptureResults& capture info.height = buffer->getHeight(); info.stride = buffer->getStride() * bytesPerPixel(buffer->getPixelFormat()); int result = AndroidBitmap_compress(&info, static_cast<int32_t>(dataspace), base, ANDROID_BITMAP_COMPRESS_FORMAT_PNG, 100, &fd, int result; if (gainmapBase) { result = ABitmap_compressWithGainmap(&info, static_cast<ADataSpace>(dataspace), base, gainmapBase, captureResults.hdrSdrRatio, *format, 100, &fd, [](void* fdPtr, const void* data, size_t size) -> bool { int bytesWritten = write(*static_cast<int*>(fdPtr), data, size); return bytesWritten == size; }); } else { result = AndroidBitmap_compress(&info, static_cast<int32_t>(dataspace), base, *format, 100, &fd, [](void* fdPtr, const void* data, size_t size) -> bool { int bytesWritten = write(*static_cast<int*>(fdPtr), data, size); return bytesWritten == size; }); } if (result != ANDROID_BITMAP_RESULT_SUCCESS) { fprintf(stderr, "Failed to compress PNG (error code: %d)\n", result); fprintf(stderr, "Failed to compress (error code: %d)\n", result); } if (fn != NULL) { Loading @@ -245,6 +280,14 @@ status_t saveImage(const char* fn, bool png, const ScreenCaptureResults& capture } close(fd); if (gainmapBase) { gainmap->unlock(); } if (base) { buffer->unlock(); } return 0; } Loading @@ -262,13 +305,17 @@ int main(int argc, char** argv) gui::CaptureArgs captureArgs; const char* pname = argv[0]; bool png = false; bool jpeg = false; bool all = false; int c; while ((c = getopt_long(argc, argv, "aphd:", LONG_OPTIONS, nullptr)) != -1) { while ((c = getopt_long(argc, argv, "apjhd:", LONG_OPTIONS, nullptr)) != -1) { switch (c) { case 'p': png = true; break; case 'j': jpeg = true; break; case 'd': { errno = 0; char* end = nullptr; Loading Loading @@ -325,6 +372,14 @@ int main(int argc, char** argv) baseName = filename.substr(0, filename.size()-4); suffix = ".png"; png = true; } else if (filename.ends_with(".jpeg")) { baseName = filename.substr(0, filename.size() - 5); suffix = ".jpeg"; jpeg = true; } else if (filename.ends_with(".jpg")) { baseName = filename.substr(0, filename.size() - 4); suffix = ".jpg"; jpeg = true; } else { baseName = filename; } Loading @@ -350,6 +405,20 @@ int main(int argc, char** argv) } } if (png && jpeg) { fprintf(stderr, "Ambiguous file type"); return 1; } std::optional<AndroidBitmapCompressFormat> format = std::nullopt; if (png) { format = ANDROID_BITMAP_COMPRESS_FORMAT_PNG; } else if (jpeg) { format = ANDROID_BITMAP_COMPRESS_FORMAT_JPEG; captureArgs.attachGainmap = true; } // setThreadPoolMaxThreadCount(0) actually tells the kernel it's // not allowed to spawn any additional threads, but we still spawn // a binder thread from userspace when we call startThreadPool(). Loading Loading @@ -385,7 +454,7 @@ int main(int argc, char** argv) if (!filename.empty()) { fn = filename.c_str(); } if (const status_t saveImageStatus = saveImage(fn, png, result) != 0) { if (const status_t saveImageStatus = saveImage(fn, format, result) != 0) { fprintf(stderr, "Saving image failed.\n"); return saveImageStatus; } Loading
core/api/current.txt +2 −0 Original line number Diff line number Diff line Loading @@ -6396,6 +6396,7 @@ package android.app { method public android.graphics.drawable.Icon getLargeIcon(); method @Nullable public android.content.LocusId getLocusId(); method public CharSequence getSettingsText(); method @FlaggedApi("android.app.api_rich_ongoing") @Nullable public String getShortCriticalText(); method public String getShortcutId(); method public android.graphics.drawable.Icon getSmallIcon(); method public String getSortKey(); Loading Loading @@ -6719,6 +6720,7 @@ package android.app { method @NonNull public android.app.Notification.Builder setPublicVersion(android.app.Notification); method @NonNull public android.app.Notification.Builder setRemoteInputHistory(CharSequence[]); method @NonNull public android.app.Notification.Builder setSettingsText(CharSequence); method @FlaggedApi("android.app.api_rich_ongoing") @NonNull public android.app.Notification.Builder setShortCriticalText(@Nullable String); method @NonNull public android.app.Notification.Builder setShortcutId(String); method @NonNull public android.app.Notification.Builder setShowWhen(boolean); method @NonNull public android.app.Notification.Builder setSmallIcon(@DrawableRes int);