From f8073f50b2f179cd2cae8e384d619f429a2bcb9d Mon Sep 17 00:00:00 2001 From: "mr.simple" Date: Sat, 19 Aug 2017 16:35:24 +0800 Subject: [PATCH 01/30] fixed condition --- .../java/com/github/moduth/blockcanary/AbstractSampler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/AbstractSampler.java b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/AbstractSampler.java index c1e3383..919e1c2 100644 --- a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/AbstractSampler.java +++ b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/AbstractSampler.java @@ -40,7 +40,7 @@ public void run() { }; public AbstractSampler(long sampleInterval) { - if (0 == sampleInterval) { + if ( sampleInterval <= 0 ) { sampleInterval = DEFAULT_SAMPLE_INTERVAL; } mSampleInterval = sampleInterval; From f3a469b6d7efe7e0848e7fa7371363fb2e6188c7 Mon Sep 17 00:00:00 2001 From: pscj Date: Mon, 21 Aug 2017 17:04:02 +0800 Subject: [PATCH 02/30] remove permission WRITE_EXTERNAL_STORAGE & READ_PHONE_STATE --- blockcanary-analyzer/src/main/AndroidManifest.xml | 8 ++++++-- .../moduth/blockcanary/BlockCanaryInternals.java | 13 ++++++++++--- .../moduth/blockcanary/internal/BlockInfo.java | 15 --------------- blockcanary-android/build.gradle | 4 ++-- .../github/moduth/blockcanary/ui/BlockInfoEx.java | 2 -- 5 files changed, 18 insertions(+), 24 deletions(-) diff --git a/blockcanary-analyzer/src/main/AndroidManifest.xml b/blockcanary-analyzer/src/main/AndroidManifest.xml index 36f52b2..0809f95 100644 --- a/blockcanary-analyzer/src/main/AndroidManifest.xml +++ b/blockcanary-analyzer/src/main/AndroidManifest.xml @@ -3,8 +3,12 @@ xmlns:android="http://schemas.android.com/apk/res/android"> - - + + diff --git a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/BlockCanaryInternals.java b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/BlockCanaryInternals.java index 895d0d6..195383f 100644 --- a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/BlockCanaryInternals.java +++ b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/BlockCanaryInternals.java @@ -15,6 +15,7 @@ */ package com.github.moduth.blockcanary; +import android.os.Build; import android.os.Environment; import android.os.Looper; @@ -120,9 +121,15 @@ static String getPath() { String logPath = BlockCanaryInternals.getContext() == null ? "" : BlockCanaryInternals.getContext().providePath(); - if (Environment.MEDIA_MOUNTED.equals(state) - && Environment.getExternalStorageDirectory().canWrite()) { - return Environment.getExternalStorageDirectory().getPath() + logPath; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + if (Environment.MEDIA_MOUNTED.equals(state) ) { + return BlockCanaryInternals.getContext().provideContext().getExternalFilesDir(logPath).getPath(); + } + }else{ + if (Environment.MEDIA_MOUNTED.equals(state) + && Environment.getExternalStorageDirectory().canWrite()) { + return Environment.getExternalStorageDirectory().getPath() + logPath; + } } return getContext().provideContext().getFilesDir() + BlockCanaryInternals.getContext().providePath(); } diff --git a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/internal/BlockInfo.java b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/internal/BlockInfo.java index 1b07edd..1cf6650 100644 --- a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/internal/BlockInfo.java +++ b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/internal/BlockInfo.java @@ -46,7 +46,6 @@ public class BlockInfo { public static final String KEY_QUA = "qua"; public static final String KEY_MODEL = "model"; public static final String KEY_API = "api-level"; - public static final String KEY_IMEI = "imei"; public static final String KEY_UID = "uid"; public static final String KEY_CPU_CORE = "cpu-core"; public static final String KEY_CPU_BUSY = "cpu-busy"; @@ -70,13 +69,11 @@ public class BlockInfo { * The International Mobile Equipment Identity or IMEI /aɪˈmiː/ is a number, * usually unique, to identify 3GPP and iDEN mobile phones */ - public static String sImei = ""; public static int sCpuCoreNum = -1; public String qualifier; public String model; public String apiLevel = ""; - public String imei = ""; public int cpuCoreNum = -1; // Per Block Info fields @@ -106,16 +103,6 @@ public class BlockInfo { sModel = Build.MODEL; sApiLevel = Build.VERSION.SDK_INT + " " + VERSION.RELEASE; sQualifier = BlockCanaryInternals.getContext().provideQualifier(); - try { - TelephonyManager telephonyManager = (TelephonyManager) BlockCanaryInternals - .getContext() - .provideContext() - .getSystemService(Context.TELEPHONY_SERVICE); - sImei = telephonyManager.getDeviceId(); - } catch (Exception exception) { - Log.e(TAG, NEW_INSTANCE_METHOD, exception); - sImei = EMPTY_IMEI; - } } public BlockInfo() { @@ -138,7 +125,6 @@ public static BlockInfo newInstance() { blockInfo.model = sModel; blockInfo.apiLevel = sApiLevel; blockInfo.qualifier = sQualifier; - blockInfo.imei = sImei; blockInfo.uid = BlockCanaryInternals.getContext().provideUid(); blockInfo.processName = ProcessUtils.myProcessName(); blockInfo.network = BlockCanaryInternals.getContext().provideNetworkType(); @@ -176,7 +162,6 @@ public BlockInfo flushString() { basicSb.append(KEY_QUA).append(KV).append(qualifier).append(separator); basicSb.append(KEY_VERSION_NAME).append(KV).append(versionName).append(separator); basicSb.append(KEY_VERSION_CODE).append(KV).append(versionCode).append(separator); - basicSb.append(KEY_IMEI).append(KV).append(imei).append(separator); basicSb.append(KEY_UID).append(KV).append(uid).append(separator); basicSb.append(KEY_NETWORK).append(KV).append(network).append(separator); basicSb.append(KEY_MODEL).append(KV).append(model).append(separator); diff --git a/blockcanary-android/build.gradle b/blockcanary-android/build.gradle index ebe613e..3e8ccc1 100644 --- a/blockcanary-android/build.gradle +++ b/blockcanary-android/build.gradle @@ -21,6 +21,6 @@ android { dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') -// compile project(':blockcanary-analyzer') - compile 'com.github.markzhai:blockcanary-analyzer:1.5.0' + compile project(':blockcanary-analyzer') + //compile 'com.github.markzhai:blockcanary-analyzer:1.5.0' } diff --git a/blockcanary-android/src/main/java/com/github/moduth/blockcanary/ui/BlockInfoEx.java b/blockcanary-android/src/main/java/com/github/moduth/blockcanary/ui/BlockInfoEx.java index 4733b69..fa6b93a 100644 --- a/blockcanary-android/src/main/java/com/github/moduth/blockcanary/ui/BlockInfoEx.java +++ b/blockcanary-android/src/main/java/com/github/moduth/blockcanary/ui/BlockInfoEx.java @@ -38,8 +38,6 @@ public static BlockInfoEx newInstance(File file) { blockInfo.model = line.split(KV)[1]; } else if (line.startsWith(KEY_API)) { blockInfo.apiLevel = line.split(KV)[1]; - } else if (line.startsWith(KEY_IMEI)) { - blockInfo.imei = line.split(KV)[1]; } else if (line.startsWith(KEY_CPU_CORE)) { blockInfo.cpuCoreNum = Integer.valueOf(line.split(KV)[1]); } else if (line.startsWith(KEY_UID)) { From 0280d0ca3de640501dd36546c653b248168151dc Mon Sep 17 00:00:00 2001 From: pscj Date: Mon, 21 Aug 2017 17:55:44 +0800 Subject: [PATCH 03/30] Update README_CN.md --- README_CN.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README_CN.md b/README_CN.md index 97c7090..6771fec 100644 --- a/README_CN.md +++ b/README_CN.md @@ -1,4 +1,5 @@ [English](https://github.com/markzhai/AndroidPerformanceMonitor/blob/master/README.md) +修正版删除了2个不需要的权限WRITE_EXTERNAL_STORAGE & READ_PHONE_STATE # Android Performance Monitor [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.github.markzhai/blockcanary-android/badge.svg?style=flat)](https://maven-badges.herokuapp.com/maven-central/com.github.markzhai/blockcanary-android) BlockCanary是一个Android平台的一个非侵入式的性能监控组件,应用只需要实现一个抽象类,提供一些该组件需要的上下文环境,就可以在平时使用应用的时候检测主线程上的各种卡慢问题,并通过组件提供的各种信息分析出原因并进行修复。 From 5017305d4d1028ebb274d7002d7e98e8d4407f02 Mon Sep 17 00:00:00 2001 From: pscj Date: Mon, 21 Aug 2017 17:56:14 +0800 Subject: [PATCH 04/30] Update README_CN.md --- README_CN.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README_CN.md b/README_CN.md index 6771fec..ed0df17 100644 --- a/README_CN.md +++ b/README_CN.md @@ -1,5 +1,6 @@ [English](https://github.com/markzhai/AndroidPerformanceMonitor/blob/master/README.md) -修正版删除了2个不需要的权限WRITE_EXTERNAL_STORAGE & READ_PHONE_STATE + +# 修正版删除了2个不需要的权限WRITE_EXTERNAL_STORAGE & READ_PHONE_STATE # Android Performance Monitor [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.github.markzhai/blockcanary-android/badge.svg?style=flat)](https://maven-badges.herokuapp.com/maven-central/com.github.markzhai/blockcanary-android) BlockCanary是一个Android平台的一个非侵入式的性能监控组件,应用只需要实现一个抽象类,提供一些该组件需要的上下文环境,就可以在平时使用应用的时候检测主线程上的各种卡慢问题,并通过组件提供的各种信息分析出原因并进行修复。 From da4220295ce8f2631c369d3f02f83737b1c2f360 Mon Sep 17 00:00:00 2001 From: pscj Date: Mon, 21 Aug 2017 17:56:59 +0800 Subject: [PATCH 05/30] Update README_CN.md --- README_CN.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README_CN.md b/README_CN.md index ed0df17..6ec21c0 100644 --- a/README_CN.md +++ b/README_CN.md @@ -1,6 +1,7 @@ [English](https://github.com/markzhai/AndroidPerformanceMonitor/blob/master/README.md) -# 修正版删除了2个不需要的权限WRITE_EXTERNAL_STORAGE & READ_PHONE_STATE +# 修改说明 +本修正版删除了2个不需要的权限WRITE_EXTERNAL_STORAGE & READ_PHONE_STATE # Android Performance Monitor [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.github.markzhai/blockcanary-android/badge.svg?style=flat)](https://maven-badges.herokuapp.com/maven-central/com.github.markzhai/blockcanary-android) BlockCanary是一个Android平台的一个非侵入式的性能监控组件,应用只需要实现一个抽象类,提供一些该组件需要的上下文环境,就可以在平时使用应用的时候检测主线程上的各种卡慢问题,并通过组件提供的各种信息分析出原因并进行修复。 From cfda0a80d88c2561d2f4d7f5645c66eb9357200b Mon Sep 17 00:00:00 2001 From: xcc3641 <446022570@qq.com> Date: Thu, 19 Jul 2018 19:28:45 +0800 Subject: [PATCH 06/30] =?UTF-8?q?Android=20O=20=E5=81=9C=E6=AD=A2=20cpu=20?= =?UTF-8?q?=E9=87=87=E6=A0=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/github/moduth/blockcanary/CpuSampler.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/CpuSampler.java b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/CpuSampler.java index 86c966d..01f0455 100644 --- a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/CpuSampler.java +++ b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/CpuSampler.java @@ -15,8 +15,8 @@ */ package com.github.moduth.blockcanary; +import android.os.Build; import android.util.Log; - import com.github.moduth.blockcanary.internal.BlockInfo; import java.io.BufferedReader; @@ -56,8 +56,10 @@ public CpuSampler(long sampleInterval) { @Override public void start() { - super.start(); - reset(); + if (Build.VERSION.SDK_INT < 26) { + super.start(); + reset(); + } } /** From 0e2f46dea66482eedb238021e3a0c066137eb57d Mon Sep 17 00:00:00 2001 From: okasurya Date: Thu, 27 Jun 2019 00:39:12 +0700 Subject: [PATCH 07/30] add support for oreo --- blockcanary-analyzer/build.gradle | 2 +- blockcanary-android-no-op/build.gradle | 2 +- blockcanary-android/build.gradle | 6 +- .../moduth/blockcanary/BlockCanary.java | 86 +++++++++++-------- .../moduth/blockcanary/DisplayService.java | 74 +++++++++------- blockcanary-sample/build.gradle | 10 +-- build.gradle | 14 +-- gradle.properties | 1 - gradle/wrapper/gradle-wrapper.properties | 4 +- 9 files changed, 117 insertions(+), 82 deletions(-) diff --git a/blockcanary-analyzer/build.gradle b/blockcanary-analyzer/build.gradle index 83af379..e8054dc 100644 --- a/blockcanary-analyzer/build.gradle +++ b/blockcanary-analyzer/build.gradle @@ -20,5 +20,5 @@ android { } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) + implementation fileTree(dir: 'libs', include: ['*.jar']) } diff --git a/blockcanary-android-no-op/build.gradle b/blockcanary-android-no-op/build.gradle index 83af379..e8054dc 100644 --- a/blockcanary-android-no-op/build.gradle +++ b/blockcanary-android-no-op/build.gradle @@ -20,5 +20,5 @@ android { } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) + implementation fileTree(dir: 'libs', include: ['*.jar']) } diff --git a/blockcanary-android/build.gradle b/blockcanary-android/build.gradle index 3e8ccc1..dc6db41 100644 --- a/blockcanary-android/build.gradle +++ b/blockcanary-android/build.gradle @@ -20,7 +20,7 @@ android { } dependencies { - compile fileTree(include: ['*.jar'], dir: 'libs') - compile project(':blockcanary-analyzer') - //compile 'com.github.markzhai:blockcanary-analyzer:1.5.0' + implementation fileTree(include: ['*.jar'], dir: 'libs') + api project(':blockcanary-analyzer') + //implementation 'com.github.markzhai:blockcanary-analyzer:1.5.0' } diff --git a/blockcanary-android/src/main/java/com/github/moduth/blockcanary/BlockCanary.java b/blockcanary-android/src/main/java/com/github/moduth/blockcanary/BlockCanary.java index edc0858..aa5bf48 100644 --- a/blockcanary-android/src/main/java/com/github/moduth/blockcanary/BlockCanary.java +++ b/blockcanary-android/src/main/java/com/github/moduth/blockcanary/BlockCanary.java @@ -15,9 +15,12 @@ */ package com.github.moduth.blockcanary; +import android.app.NotificationChannel; +import android.app.NotificationManager; import android.content.ComponentName; import android.content.Context; import android.content.pm.PackageManager; +import android.os.Build; import android.os.Looper; import android.preference.PreferenceManager; @@ -33,7 +36,8 @@ public final class BlockCanary { private static final String TAG = "BlockCanary"; - + // these lines are originally copied from LeakCanary: Copyright (C) 2015 Square, Inc. + private static final Executor fileIoExecutor = newSingleThreadExecutor("File-IO"); private static BlockCanary sInstance; private BlockCanaryInternals mBlockCanaryCore; private boolean mMonitorStarted = false; @@ -57,6 +61,7 @@ private BlockCanary() { * @return {@link BlockCanary} */ public static BlockCanary install(Context context, BlockCanaryContext blockCanaryContext) { + createNotificationChannel(context); BlockCanaryContext.init(context, blockCanaryContext); setEnabled(context, DisplayActivity.class, BlockCanaryContext.get().displayNotification()); return get(); @@ -78,6 +83,50 @@ public static BlockCanary get() { return sInstance; } + private static void setEnabledBlocking(Context appContext, + Class componentClass, + boolean enabled) { + ComponentName component = new ComponentName(appContext, componentClass); + PackageManager packageManager = appContext.getPackageManager(); + int newState = enabled ? COMPONENT_ENABLED_STATE_ENABLED : COMPONENT_ENABLED_STATE_DISABLED; + // Blocks on IPC. + packageManager.setComponentEnabledSetting(component, newState, DONT_KILL_APP); + } + + private static void executeOnFileIoThread(Runnable runnable) { + fileIoExecutor.execute(runnable); + } + + private static Executor newSingleThreadExecutor(String threadName) { + return Executors.newSingleThreadExecutor(new SingleThreadFactory(threadName)); + } + + private static void setEnabled(Context context, + final Class componentClass, + final boolean enabled) { + final Context appContext = context.getApplicationContext(); + executeOnFileIoThread(new Runnable() { + @Override + public void run() { + setEnabledBlocking(appContext, componentClass, enabled); + } + }); + } + + private static void createNotificationChannel(Context context) { + // Create the NotificationChannel, but only on API 26+ because + // the NotificationChannel class is new and not in the support library + if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + int importance = NotificationManager.IMPORTANCE_DEFAULT; + NotificationChannel channel = new NotificationChannel(DisplayService.CHANNEL_ID, "Block Canary", importance); + channel.setDescription("Block Canary"); + // Register the channel with the system; you can't change the importance + // or other notification behaviors after this + NotificationManager notificationManager = context.getSystemService(NotificationManager.class); + if(notificationManager != null) notificationManager.createNotificationChannel(channel); + } + } + /** * Start monitoring. */ @@ -99,6 +148,7 @@ public void stop() { mBlockCanaryCore.cpuSampler.stop(); } } + // end of lines copied from LeakCanary /** * Zip and upload log files, will user context's zip and log implementation. @@ -130,38 +180,4 @@ public boolean isMonitorDurationEnd() { return startTime != 0 && System.currentTimeMillis() - startTime > BlockCanaryContext.get().provideMonitorDuration() * 3600 * 1000; } - - // these lines are originally copied from LeakCanary: Copyright (C) 2015 Square, Inc. - private static final Executor fileIoExecutor = newSingleThreadExecutor("File-IO"); - - private static void setEnabledBlocking(Context appContext, - Class componentClass, - boolean enabled) { - ComponentName component = new ComponentName(appContext, componentClass); - PackageManager packageManager = appContext.getPackageManager(); - int newState = enabled ? COMPONENT_ENABLED_STATE_ENABLED : COMPONENT_ENABLED_STATE_DISABLED; - // Blocks on IPC. - packageManager.setComponentEnabledSetting(component, newState, DONT_KILL_APP); - } - // end of lines copied from LeakCanary - - private static void executeOnFileIoThread(Runnable runnable) { - fileIoExecutor.execute(runnable); - } - - private static Executor newSingleThreadExecutor(String threadName) { - return Executors.newSingleThreadExecutor(new SingleThreadFactory(threadName)); - } - - private static void setEnabled(Context context, - final Class componentClass, - final boolean enabled) { - final Context appContext = context.getApplicationContext(); - executeOnFileIoThread(new Runnable() { - @Override - public void run() { - setEnabledBlocking(appContext, componentClass, enabled); - } - }); - } } diff --git a/blockcanary-android/src/main/java/com/github/moduth/blockcanary/DisplayService.java b/blockcanary-android/src/main/java/com/github/moduth/blockcanary/DisplayService.java index 7d71590..fc10be7 100644 --- a/blockcanary-android/src/main/java/com/github/moduth/blockcanary/DisplayService.java +++ b/blockcanary-android/src/main/java/com/github/moduth/blockcanary/DisplayService.java @@ -15,12 +15,12 @@ */ package com.github.moduth.blockcanary; -import android.annotation.TargetApi; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; +import android.os.Build; import android.util.Log; import com.github.moduth.blockcanary.internal.BlockInfo; @@ -33,10 +33,12 @@ import static android.os.Build.VERSION.SDK_INT; import static android.os.Build.VERSION_CODES.HONEYCOMB; import static android.os.Build.VERSION_CODES.JELLY_BEAN; +import static android.os.Build.VERSION_CODES.LOLLIPOP; final class DisplayService implements BlockInterceptor { private static final String TAG = "DisplayService"; + public static final String CHANNEL_ID = "BLOCK_CANARY"; @Override public void onBlock(Context context, BlockInfo blockInfo) { @@ -49,40 +51,54 @@ public void onBlock(Context context, BlockInfo blockInfo) { show(context, contentTitle, contentText, pendingIntent); } - @TargetApi(HONEYCOMB) private void show(Context context, String contentTitle, String contentText, PendingIntent pendingIntent) { NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); - Notification notification; - if (SDK_INT < HONEYCOMB) { - notification = new Notification(); - notification.icon = R.drawable.block_canary_notification; - notification.when = System.currentTimeMillis(); - notification.flags |= Notification.FLAG_AUTO_CANCEL; - notification.defaults = Notification.DEFAULT_SOUND; - try { - Method deprecatedMethod = notification.getClass().getMethod("setLatestEventInfo", Context.class, CharSequence.class, CharSequence.class, PendingIntent.class); - deprecatedMethod.invoke(notification, context, contentTitle, contentText, pendingIntent); - } catch (NoSuchMethodException | IllegalAccessException | IllegalArgumentException - | InvocationTargetException e) { - Log.w(TAG, "Method not found", e); - } - } else { - Notification.Builder builder = new Notification.Builder(context) - .setSmallIcon(R.drawable.block_canary_notification) - .setWhen(System.currentTimeMillis()) - .setContentTitle(contentTitle) - .setContentText(contentText) - .setAutoCancel(true) - .setContentIntent(pendingIntent) - .setDefaults(Notification.DEFAULT_SOUND); - if (SDK_INT < JELLY_BEAN) { - notification = builder.getNotification(); + if(notificationManager != null) { + Notification notification; + if (SDK_INT < HONEYCOMB) { + notification = new Notification(); + notification.icon = R.drawable.block_canary_notification; + notification.when = System.currentTimeMillis(); + notification.flags |= Notification.FLAG_AUTO_CANCEL; + notification.defaults = Notification.DEFAULT_SOUND; + try { + Method deprecatedMethod = notification.getClass().getMethod("setLatestEventInfo", Context.class, CharSequence.class, CharSequence.class, PendingIntent.class); + deprecatedMethod.invoke(notification, context, contentTitle, contentText, pendingIntent); + } catch (NoSuchMethodException | IllegalAccessException | IllegalArgumentException + | InvocationTargetException e) { + Log.w(TAG, "Method not found", e); + } } else { - notification = builder.build(); + Notification.Builder builder; + if(SDK_INT >= Build.VERSION_CODES.O) { + builder = new Notification.Builder(context, CHANNEL_ID) + .setSmallIcon(R.drawable.block_canary_notification) + .setWhen(System.currentTimeMillis()) + .setContentTitle(contentTitle) + .setContentText(contentText) + .setAutoCancel(true) + .setContentIntent(pendingIntent) + .setDefaults(Notification.DEFAULT_SOUND); + } else { + builder = new Notification.Builder(context) + .setSmallIcon(R.drawable.block_canary_notification) + .setWhen(System.currentTimeMillis()) + .setContentTitle(contentTitle) + .setContentText(contentText) + .setAutoCancel(true) + .setContentIntent(pendingIntent) + .setDefaults(Notification.DEFAULT_SOUND); + } + + if (SDK_INT < JELLY_BEAN) { + notification = builder.getNotification(); + } else { + notification = builder.build(); + } } + notificationManager.notify(0xDEAFBEEF, notification); } - notificationManager.notify(0xDEAFBEEF, notification); } } diff --git a/blockcanary-sample/build.gradle b/blockcanary-sample/build.gradle index 32d69b8..3635637 100644 --- a/blockcanary-sample/build.gradle +++ b/blockcanary-sample/build.gradle @@ -20,10 +20,10 @@ android { } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - debugCompile project(':blockcanary-android') - releaseCompile project(':blockcanary-android-no-op') + implementation fileTree(dir: 'libs', include: ['*.jar']) + debugImplementation project(':blockcanary-android') + releaseImplementation project(':blockcanary-android-no-op') - compile 'com.android.support:appcompat-v7:24.2.0' - compile 'com.android.support:design:24.2.0' + implementation 'com.android.support:appcompat-v7:28.0.0' + implementation 'com.android.support:design:28.0.0' } diff --git a/build.gradle b/build.gradle index 2e498be..549caeb 100644 --- a/build.gradle +++ b/build.gradle @@ -4,9 +4,10 @@ buildscript { repositories { mavenCentral() jcenter() + google() } dependencies { - classpath 'com.android.tools.build:gradle:2.2.2' + classpath 'com.android.tools.build:gradle:3.4.1' } } @@ -14,11 +15,14 @@ allprojects { repositories { mavenCentral() jcenter() + maven { + url 'https://maven.google.com/' + } } ext { - LIBRARY_COMPILE_SDK_VERSION = 23 - LIBRARY_BUILD_TOOLS_VERSION = "23.0.3" - LIBRARY_MIN_SDK_VERSION = 9 - LIBRARY_TARGET_SDK_VERSION = 22 + LIBRARY_COMPILE_SDK_VERSION = 28 + LIBRARY_BUILD_TOOLS_VERSION = "28.0.3" + LIBRARY_MIN_SDK_VERSION = 16 + LIBRARY_TARGET_SDK_VERSION = 28 } } diff --git a/gradle.properties b/gradle.properties index d4b7bce..fc62b95 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,4 +18,3 @@ org.gradle.jvmargs=-Xmx8192M org.gradle.daemon=true org.gradle.configureondemand=true org.gradle.parallel=true -android.useDeprecatedNdk=true \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 586936a..f9dee44 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Wed Apr 13 16:42:11 CST 2016 +#Wed Jun 26 23:56:27 WIB 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip From 762eed264ace0c235128d6d7795267e881cabe96 Mon Sep 17 00:00:00 2001 From: Zhang Wei Date: Tue, 23 Jul 2019 11:13:45 +0800 Subject: [PATCH 08/30] target29 --- blockcanary-analyzer/build.gradle | 1 - blockcanary-android-no-op/build.gradle | 1 - blockcanary-sample/build.gradle | 1 - build.gradle | 4 +--- 4 files changed, 1 insertion(+), 6 deletions(-) diff --git a/blockcanary-analyzer/build.gradle b/blockcanary-analyzer/build.gradle index e8054dc..a19d27f 100644 --- a/blockcanary-analyzer/build.gradle +++ b/blockcanary-analyzer/build.gradle @@ -3,7 +3,6 @@ apply from: 'gradle-mvn-push.gradle' android { compileSdkVersion LIBRARY_COMPILE_SDK_VERSION - buildToolsVersion LIBRARY_BUILD_TOOLS_VERSION defaultConfig { minSdkVersion LIBRARY_MIN_SDK_VERSION diff --git a/blockcanary-android-no-op/build.gradle b/blockcanary-android-no-op/build.gradle index e8054dc..a19d27f 100644 --- a/blockcanary-android-no-op/build.gradle +++ b/blockcanary-android-no-op/build.gradle @@ -3,7 +3,6 @@ apply from: 'gradle-mvn-push.gradle' android { compileSdkVersion LIBRARY_COMPILE_SDK_VERSION - buildToolsVersion LIBRARY_BUILD_TOOLS_VERSION defaultConfig { minSdkVersion LIBRARY_MIN_SDK_VERSION diff --git a/blockcanary-sample/build.gradle b/blockcanary-sample/build.gradle index 3635637..40d05ac 100644 --- a/blockcanary-sample/build.gradle +++ b/blockcanary-sample/build.gradle @@ -2,7 +2,6 @@ apply plugin: 'com.android.application' android { compileSdkVersion LIBRARY_COMPILE_SDK_VERSION - buildToolsVersion LIBRARY_BUILD_TOOLS_VERSION defaultConfig { applicationId "com.example.blockcanary" diff --git a/build.gradle b/build.gradle index 549caeb..aaf6893 100644 --- a/build.gradle +++ b/build.gradle @@ -15,9 +15,7 @@ allprojects { repositories { mavenCentral() jcenter() - maven { - url 'https://maven.google.com/' - } + google() } ext { LIBRARY_COMPILE_SDK_VERSION = 28 From c7c859a77ef7b679c5c661af3e9cd781a9f4f40a Mon Sep 17 00:00:00 2001 From: xcc3641 <446022570@qq.com> Date: Thu, 19 Jul 2018 14:44:46 +0800 Subject: [PATCH 09/30] =?UTF-8?q?=E5=8D=87=E7=BA=A7=20gradle?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index fc62b95..793545a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -16,5 +16,5 @@ org.gradle.jvmargs=-Xmx8192M #org.gradle.jvmargs=-Xmx10248m -XX\:MaxPermSize\=512m -XX\:+HeapDumpOnOutOfMemoryError -Dfile.encoding\=UTF-8 org.gradle.daemon=true -org.gradle.configureondemand=true +org.gradle.configureondemand=false org.gradle.parallel=true From 7d9d79c2142ad88bffaf71cb6cccb2f771ae1c68 Mon Sep 17 00:00:00 2001 From: xcc3641 <446022570@qq.com> Date: Thu, 19 Jul 2018 15:41:12 +0800 Subject: [PATCH 10/30] =?UTF-8?q?=E5=88=9D=E6=AD=A5=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../moduth/blockcanary/BlockCanaryInternals.java | 8 +++----- .../moduth/blockcanary/HandlerThreadFactory.java | 2 +- .../com/github/moduth/blockcanary/LooperMonitor.java | 10 +++++----- .../com/github/moduth/blockcanary/StackSampler.java | 4 +--- .../github/moduth/blockcanary/internal/BlockInfo.java | 5 +++-- 5 files changed, 13 insertions(+), 16 deletions(-) diff --git a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/BlockCanaryInternals.java b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/BlockCanaryInternals.java index 195383f..d5e70b3 100644 --- a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/BlockCanaryInternals.java +++ b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/BlockCanaryInternals.java @@ -40,9 +40,7 @@ public final class BlockCanaryInternals { public BlockCanaryInternals() { - stackSampler = new StackSampler( - Looper.getMainLooper().getThread(), - sContext.provideDumpInterval()); + stackSampler = new StackSampler(Looper.getMainLooper().getThread(), sContext.provideDumpInterval()); cpuSampler = new CpuSampler(sContext.provideDumpInterval()); @@ -118,8 +116,8 @@ long getSampleDelay() { static String getPath() { String state = Environment.getExternalStorageState(); - String logPath = BlockCanaryInternals.getContext() - == null ? "" : BlockCanaryInternals.getContext().providePath(); + String logPath = BlockCanaryInternals.getContext() == null ? "" : + BlockCanaryInternals.getContext().providePath(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { if (Environment.MEDIA_MOUNTED.equals(state) ) { diff --git a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/HandlerThreadFactory.java b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/HandlerThreadFactory.java index bf4c26d..e2b77cc 100644 --- a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/HandlerThreadFactory.java +++ b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/HandlerThreadFactory.java @@ -36,7 +36,7 @@ public static Handler getWriteLogThreadHandler() { } private static class HandlerThreadWrapper { - private Handler handler = null; + private Handler handler; public HandlerThreadWrapper(String threadName) { HandlerThread handlerThread = new HandlerThread("BlockCanary-" + threadName); diff --git a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/LooperMonitor.java b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/LooperMonitor.java index 3b697e6..e101c92 100644 --- a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/LooperMonitor.java +++ b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/LooperMonitor.java @@ -26,7 +26,7 @@ class LooperMonitor implements Printer { private long mBlockThresholdMillis = DEFAULT_BLOCK_THRESHOLD_MILLIS; private long mStartTimestamp = 0; private long mStartThreadTimestamp = 0; - private BlockListener mBlockListener = null; + private BlockListener mBlockListener; private boolean mPrintingStarted = false; private final boolean mStopWhenDebugging; @@ -83,21 +83,21 @@ public void run() { } private void startDump() { - if (null != BlockCanaryInternals.getInstance().stackSampler) { + if (BlockCanaryInternals.getInstance().stackSampler != null) { BlockCanaryInternals.getInstance().stackSampler.start(); } - if (null != BlockCanaryInternals.getInstance().cpuSampler) { + if (BlockCanaryInternals.getInstance().cpuSampler != null) { BlockCanaryInternals.getInstance().cpuSampler.start(); } } private void stopDump() { - if (null != BlockCanaryInternals.getInstance().stackSampler) { + if (BlockCanaryInternals.getInstance().stackSampler != null) { BlockCanaryInternals.getInstance().stackSampler.stop(); } - if (null != BlockCanaryInternals.getInstance().cpuSampler) { + if (BlockCanaryInternals.getInstance().cpuSampler != null) { BlockCanaryInternals.getInstance().cpuSampler.stop(); } } diff --git a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/StackSampler.java b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/StackSampler.java index 2d65e4a..a6f43d4 100644 --- a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/StackSampler.java +++ b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/StackSampler.java @@ -61,9 +61,7 @@ protected void doSample() { StringBuilder stringBuilder = new StringBuilder(); for (StackTraceElement stackTraceElement : mCurrentThread.getStackTrace()) { - stringBuilder - .append(stackTraceElement.toString()) - .append(BlockInfo.SEPARATOR); + stringBuilder.append(stackTraceElement.toString()).append(BlockInfo.SEPARATOR); } synchronized (sStackMap) { diff --git a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/internal/BlockInfo.java b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/internal/BlockInfo.java index 1cf6650..90dd98a 100644 --- a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/internal/BlockInfo.java +++ b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/internal/BlockInfo.java @@ -20,6 +20,7 @@ import android.os.Build; import android.os.Build.VERSION; import android.telephony.TelephonyManager; +import android.text.TextUtils; import android.util.Log; import com.github.moduth.blockcanary.BlockCanaryInternals; @@ -105,13 +106,13 @@ public class BlockInfo { sQualifier = BlockCanaryInternals.getContext().provideQualifier(); } - public BlockInfo() { + private BlockInfo() { } public static BlockInfo newInstance() { BlockInfo blockInfo = new BlockInfo(); Context context = BlockCanaryInternals.getContext().provideContext(); - if (blockInfo.versionName == null || blockInfo.versionName.length() == 0) { + if (TextUtils.isEmpty(blockInfo.versionName)) { try { PackageInfo info = context.getPackageManager().getPackageInfo(context.getPackageName(), 0); blockInfo.versionCode = info.versionCode; From 6e043427edc5b9a95ff5e7692b55d5cb2ab0bd13 Mon Sep 17 00:00:00 2001 From: xcc3641 <446022570@qq.com> Date: Thu, 19 Jul 2018 16:24:18 +0800 Subject: [PATCH 11/30] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../moduth/blockcanary/AbstractSampler.java | 3 +- .../moduth/blockcanary/ui/DetailAdapter.java | 11 ++-- .../blockcanary/ui/DisplayActivity.java | 52 ++++++------------- 3 files changed, 22 insertions(+), 44 deletions(-) diff --git a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/AbstractSampler.java b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/AbstractSampler.java index 919e1c2..5bf61e9 100644 --- a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/AbstractSampler.java +++ b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/AbstractSampler.java @@ -53,8 +53,7 @@ public void start() { mShouldSample.set(true); HandlerThreadFactory.getTimerThreadHandler().removeCallbacks(mRunnable); - HandlerThreadFactory.getTimerThreadHandler().postDelayed(mRunnable, - BlockCanaryInternals.getInstance().getSampleDelay()); + HandlerThreadFactory.getTimerThreadHandler().postDelayed(mRunnable, BlockCanaryInternals.getInstance().getSampleDelay()); } public void stop() { diff --git a/blockcanary-android/src/main/java/com/github/moduth/blockcanary/ui/DetailAdapter.java b/blockcanary-android/src/main/java/com/github/moduth/blockcanary/ui/DetailAdapter.java index c1599c3..46282e7 100644 --- a/blockcanary-android/src/main/java/com/github/moduth/blockcanary/ui/DetailAdapter.java +++ b/blockcanary-android/src/main/java/com/github/moduth/blockcanary/ui/DetailAdapter.java @@ -47,15 +47,13 @@ public View getView(int position, View convertView, ViewGroup parent) { Context context = parent.getContext(); if (getItemViewType(position) == TOP_ROW) { if (convertView == null) { - convertView = - LayoutInflater.from(context).inflate(R.layout.block_canary_ref_top_row, parent, false); + convertView = LayoutInflater.from(context).inflate(R.layout.block_canary_ref_top_row, parent, false); } TextView textView = findById(convertView, R.id.__leak_canary_row_text); textView.setText(context.getPackageName()); } else { if (convertView == null) { - convertView = - LayoutInflater.from(context).inflate(R.layout.block_canary_ref_row, parent, false); + convertView = LayoutInflater.from(context).inflate(R.layout.block_canary_ref_row, parent, false); } TextView textView = findById(convertView, R.id.__leak_canary_row_text); @@ -78,9 +76,8 @@ public View getView(int position, View convertView, ViewGroup parent) { } private DisplayConnectorView.Type connectorViewType(int position) { - return (position == 1) ? DisplayConnectorView.Type.START : ( - (position == getCount() - 1) ? DisplayConnectorView.Type.END : - DisplayConnectorView.Type.NODE); + return (position == 1) ? DisplayConnectorView.Type.START : ((position == getCount() - 1) + ? DisplayConnectorView.Type.END : DisplayConnectorView.Type.NODE); } private String elementToHtmlString(String element, int position, boolean folding) { diff --git a/blockcanary-android/src/main/java/com/github/moduth/blockcanary/ui/DisplayActivity.java b/blockcanary-android/src/main/java/com/github/moduth/blockcanary/ui/DisplayActivity.java index cdd30b8..79ce79c 100644 --- a/blockcanary-android/src/main/java/com/github/moduth/blockcanary/ui/DisplayActivity.java +++ b/blockcanary-android/src/main/java/com/github/moduth/blockcanary/ui/DisplayActivity.java @@ -23,25 +23,14 @@ import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; -import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.text.TextUtils; import android.text.format.DateUtils; import android.util.Log; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.widget.AdapterView; -import android.widget.BaseAdapter; -import android.widget.Button; -import android.widget.ListAdapter; -import android.widget.ListView; -import android.widget.TextView; - +import android.view.*; +import android.widget.*; import com.github.moduth.blockcanary.BlockCanaryContext; import com.github.moduth.blockcanary.BlockCanaryInternals; import com.github.moduth.blockcanary.LogWriter; @@ -101,9 +90,9 @@ protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.block_canary_display_leak); - mListView = (ListView) findViewById(R.id.__leak_canary_display_leak_list); - mFailureView = (TextView) findViewById(R.id.__leak_canary_display_leak_failure); - mActionButton = (Button) findViewById(R.id.__leak_canary_action); + mListView = findViewById(R.id.__leak_canary_display_leak_list); + mFailureView = findViewById(R.id.__leak_canary_display_leak_failure); + mActionButton = findViewById(R.id.__leak_canary_action); mMaxStoredBlockCount = getResources().getInteger(R.integer.block_canary_max_stored_count); @@ -199,10 +188,7 @@ private void shareBlock(BlockInfoEx blockInfo) { private void shareHeapDump(BlockInfoEx blockInfo) { File heapDumpFile = blockInfo.logFile; - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) { - heapDumpFile.setReadable(true, false); - } + heapDumpFile.setReadable(true, false); Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("application/octet-stream"); intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(heapDumpFile)); @@ -240,12 +226,10 @@ public void onItemClick(AdapterView parent, View view, int position, long id) updateUi(); } }); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { - invalidateOptionsMenu(); - ActionBar actionBar = getActionBar(); - if (actionBar != null) { - actionBar.setDisplayHomeAsUpEnabled(false); - } + invalidateOptionsMenu(); + ActionBar actionBar = getActionBar(); + if (actionBar != null) { + actionBar.setDisplayHomeAsUpEnabled(false); } setTitle(getString(R.string.block_canary_block_list_title, getPackageName())); mActionButton.setText(R.string.block_canary_delete_all); @@ -287,12 +271,10 @@ public void onItemClick(AdapterView parent, View view, int position, long id) adapter.toggleRow(position); } }); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { - invalidateOptionsMenu(); - ActionBar actionBar = getActionBar(); - if (actionBar != null) { - actionBar.setDisplayHomeAsUpEnabled(true); - } + invalidateOptionsMenu(); + ActionBar actionBar = getActionBar(); + if (actionBar != null) { + actionBar.setDisplayHomeAsUpEnabled(true); } mActionButton.setVisibility(VISIBLE); mActionButton.setText(R.string.block_canary_delete); @@ -317,7 +299,7 @@ private BlockInfoEx getBlock(String startTime) { return null; } for (BlockInfoEx blockInfo : mBlockInfoEntries) { - if (blockInfo.timeStart != null && startTime.equals(blockInfo.timeStart)) { + if (startTime.equals(blockInfo.timeStart)) { return blockInfo; } } @@ -347,8 +329,8 @@ public View getView(int position, View convertView, ViewGroup parent) { convertView = LayoutInflater.from(DisplayActivity.this) .inflate(R.layout.block_canary_block_row, parent, false); } - TextView titleView = (TextView) convertView.findViewById(R.id.__leak_canary_row_text); - TextView timeView = (TextView) convertView.findViewById(R.id.__leak_canary_row_time); + TextView titleView = convertView.findViewById(R.id.__leak_canary_row_text); + TextView timeView = convertView.findViewById(R.id.__leak_canary_row_time); BlockInfoEx blockInfo = getItem(position); String index; From f2783f1298ef1e2f95ed8c10e9b28b6cb20c8740 Mon Sep 17 00:00:00 2001 From: xcc3641 <446022570@qq.com> Date: Thu, 19 Jul 2018 16:48:10 +0800 Subject: [PATCH 12/30] =?UTF-8?q?=E6=9C=AC=E5=9C=B0=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/github/moduth/blockcanary/internal/BlockInfo.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/internal/BlockInfo.java b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/internal/BlockInfo.java index 90dd98a..b8c7365 100644 --- a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/internal/BlockInfo.java +++ b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/internal/BlockInfo.java @@ -106,7 +106,7 @@ public class BlockInfo { sQualifier = BlockCanaryInternals.getContext().provideQualifier(); } - private BlockInfo() { + public BlockInfo() { } public static BlockInfo newInstance() { From b14593451c39cd47155e9d995d82646eeb19692a Mon Sep 17 00:00:00 2001 From: luowei Date: Fri, 14 Sep 2018 14:48:28 +0800 Subject: [PATCH 13/30] Judge white list is null --- .../com/github/moduth/blockcanary/ui/BlockCanaryUtils.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/blockcanary-android/src/main/java/com/github/moduth/blockcanary/ui/BlockCanaryUtils.java b/blockcanary-android/src/main/java/com/github/moduth/blockcanary/ui/BlockCanaryUtils.java index 195b0ce..3d1b872 100644 --- a/blockcanary-android/src/main/java/com/github/moduth/blockcanary/ui/BlockCanaryUtils.java +++ b/blockcanary-android/src/main/java/com/github/moduth/blockcanary/ui/BlockCanaryUtils.java @@ -15,7 +15,9 @@ final class BlockCanaryUtils { private static final List CONCERN_LIST = new LinkedList<>(); static { - WHITE_LIST.addAll(BlockCanaryInternals.getContext().provideWhiteList()); + if (BlockCanaryInternals.getContext().provideWhiteList() != null) { + WHITE_LIST.addAll(BlockCanaryInternals.getContext().provideWhiteList()); + } if (BlockCanaryInternals.getContext().concernPackages() != null) { CONCERN_LIST.addAll(BlockCanaryInternals.getContext().concernPackages()); From 29276b98d4cd1e9386efc33dc1737a5015deb83d Mon Sep 17 00:00:00 2001 From: luowei Date: Fri, 14 Sep 2018 14:49:15 +0800 Subject: [PATCH 14/30] Remove imei analysis --- .../com/github/moduth/blockcanary/internal/BlockInfo.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/internal/BlockInfo.java b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/internal/BlockInfo.java index b8c7365..74e27fb 100644 --- a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/internal/BlockInfo.java +++ b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/internal/BlockInfo.java @@ -66,10 +66,6 @@ public class BlockInfo { public static String sQualifier; public static String sModel; public static String sApiLevel = ""; - /** - * The International Mobile Equipment Identity or IMEI /aɪˈmiː/ is a number, - * usually unique, to identify 3GPP and iDEN mobile phones - */ public static int sCpuCoreNum = -1; public String qualifier; @@ -97,7 +93,6 @@ public class BlockInfo { private StringBuilder cpuSb = new StringBuilder(); private StringBuilder timeSb = new StringBuilder(); private StringBuilder stackSb = new StringBuilder(); - private static final String EMPTY_IMEI = "empty_imei"; static { sCpuCoreNum = PerformanceUtils.getNumCores(); From ea3de3521efe02195b1d3f4d2b1ea7d8f6baf9d6 Mon Sep 17 00:00:00 2001 From: luowei Date: Fri, 14 Sep 2018 14:50:05 +0800 Subject: [PATCH 15/30] Add NetUtils to get network type --- .../src/main/AndroidManifest.xml | 2 + .../moduth/blockcanary/internal/NetUtils.java | 163 ++++++++++++++++++ .../com/example/blockcanary/AppContext.java | 3 +- 3 files changed, 167 insertions(+), 1 deletion(-) create mode 100644 blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/internal/NetUtils.java diff --git a/blockcanary-analyzer/src/main/AndroidManifest.xml b/blockcanary-analyzer/src/main/AndroidManifest.xml index 0809f95..bf633ac 100644 --- a/blockcanary-analyzer/src/main/AndroidManifest.xml +++ b/blockcanary-analyzer/src/main/AndroidManifest.xml @@ -10,6 +10,8 @@ android:name="android.permission.READ_PHONE_STATE" android:maxSdkVersion="18" /> + + diff --git a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/internal/NetUtils.java b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/internal/NetUtils.java new file mode 100644 index 0000000..b3ad2cd --- /dev/null +++ b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/internal/NetUtils.java @@ -0,0 +1,163 @@ +package com.github.moduth.blockcanary.internal; + +import android.content.Context; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.telephony.TelephonyManager; + +public class NetUtils { + /** + * 没有网络连接 + */ + public static final String NETWORK_NONE = "NONE"; + /** + * wifi连接 + */ + public static final String NETWORK_WIFI = "WIFI"; + /** + * 2G + */ + public static final String NETWORK_2G = "2G"; + /** + * 3G + */ + public static final String NETWORK_3G = "3G"; + /** + * 4G + */ + public static final String NETWORK_4G = "4G"; + /** + * 手机流量 + */ + public static final String NETWORK_MOBILE = "MOBILE"; + + /** + * 获取运营商名字 + * + * @param context context + * @return int + */ + public static String getOperatorName(Context context) { + /* + * getSimOperatorName()就可以直接获取到运营商的名字 + * 也可以使用IMSI获取,getSimOperator(),然后根据返回值判断,例如"46000"为移动 + * IMSI相关链接:http://baike.baidu.com/item/imsi + */ + TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); + // getSimOperatorName就可以直接获取到运营商的名字 + return telephonyManager.getSimOperatorName(); + } + + /** + * 获取当前网络连接的类型 + * + * @param context context + * @return int + */ + public static String getNetworkType(Context context) { + ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context + .CONNECTIVITY_SERVICE); + if (null == connManager) { + return NETWORK_NONE; + } + // 获取网络类型,如果为空,返回无网络 + NetworkInfo activeNetInfo = connManager.getActiveNetworkInfo(); + if (activeNetInfo == null || !activeNetInfo.isAvailable()) { + return NETWORK_NONE; + } + // 判断是否为WIFI + NetworkInfo wifiInfo = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); + if (null != wifiInfo) { + NetworkInfo.State state = wifiInfo.getState(); + if (null != state) { + if (state == NetworkInfo.State.CONNECTED || state == NetworkInfo.State.CONNECTING) { + return NETWORK_WIFI; + } + } + } + // 若不是WIFI,则去判断是2G、3G、4G网 + TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); + int networkType = telephonyManager.getNetworkType(); + switch (networkType) { + /* + GPRS : 2G(2.5) General Packet Radia Service 114kbps + EDGE : 2G(2.75G) Enhanced Data Rate for GSM Evolution 384kbps + UMTS : 3G WCDMA 联通3G Universal Mobile Telecommunication System 完整的3G移动通信技术标准 + CDMA : 2G 电信 Code Division Multiple Access 码分多址 + EVDO_0 : 3G (EVDO 全程 CDMA2000 1xEV-DO) Evolution - Data Only (Data Optimized) 153.6kps - 2.4mbps 属于3G + EVDO_A : 3G 1.8mbps - 3.1mbps 属于3G过渡,3.5G + 1xRTT : 2G CDMA2000 1xRTT (RTT - 无线电传输技术) 144kbps 2G的过渡, + HSDPA : 3.5G 高速下行分组接入 3.5G WCDMA High Speed Downlink Packet Access 14.4mbps + HSUPA : 3.5G High Speed Uplink Packet Access 高速上行链路分组接入 1.4 - 5.8 mbps + HSPA : 3G (分HSDPA,HSUPA) High Speed Packet Access + IDEN : 2G Integrated Dispatch Enhanced Networks 集成数字增强型网络 (属于2G,来自维基百科) + EVDO_B : 3G EV-DO Rev.B 14.7Mbps 下行 3.5G + LTE : 4G Long Term Evolution FDD-LTE 和 TDD-LTE , 3G过渡,升级版 LTE Advanced 才是4G + EHRPD : 3G CDMA2000向LTE 4G的中间产物 Evolved High Rate Packet Data HRPD的升级 + HSPAP : 3G HSPAP 比 HSDPA 快些 + */ + // 2G网络 + case TelephonyManager.NETWORK_TYPE_GPRS: + case TelephonyManager.NETWORK_TYPE_CDMA: + case TelephonyManager.NETWORK_TYPE_EDGE: + case TelephonyManager.NETWORK_TYPE_1xRTT: + case TelephonyManager.NETWORK_TYPE_IDEN: + return NETWORK_2G; + // 3G网络 + case TelephonyManager.NETWORK_TYPE_EVDO_A: + case TelephonyManager.NETWORK_TYPE_UMTS: + case TelephonyManager.NETWORK_TYPE_EVDO_0: + case TelephonyManager.NETWORK_TYPE_HSDPA: + case TelephonyManager.NETWORK_TYPE_HSUPA: + case TelephonyManager.NETWORK_TYPE_HSPA: + case TelephonyManager.NETWORK_TYPE_EVDO_B: + case TelephonyManager.NETWORK_TYPE_EHRPD: + case TelephonyManager.NETWORK_TYPE_HSPAP: + return NETWORK_3G; + // 4G网络 + case TelephonyManager.NETWORK_TYPE_LTE: + return NETWORK_4G; + default: + return NETWORK_MOBILE; + } + } + + /** + * 判断网络是否连接 + * + * @param context context + * @return true/false + */ + public static boolean isNetConnected(Context context) { + ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); + if (connectivity != null) { + NetworkInfo info = connectivity.getActiveNetworkInfo(); + if (info != null && info.isConnected()) { + return info.getState() == NetworkInfo.State.CONNECTED; + } + } + return false; + } + + /** + * 判断是否wifi连接 + * + * @param context context + * @return true/false + */ + public static synchronized boolean isWifiConnected(Context context) { + ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context + .CONNECTIVITY_SERVICE); + if (connectivityManager != null) { + NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); + if (networkInfo != null) { + int networkInfoType = networkInfo.getType(); + if (networkInfoType == ConnectivityManager.TYPE_WIFI || networkInfoType == ConnectivityManager + .TYPE_ETHERNET) { + return networkInfo.isConnected(); + } + } + } + return false; + } +} diff --git a/blockcanary-sample/src/main/java/com/example/blockcanary/AppContext.java b/blockcanary-sample/src/main/java/com/example/blockcanary/AppContext.java index 612df72..5d4bc0e 100644 --- a/blockcanary-sample/src/main/java/com/example/blockcanary/AppContext.java +++ b/blockcanary-sample/src/main/java/com/example/blockcanary/AppContext.java @@ -20,6 +20,7 @@ import android.util.Log; import com.github.moduth.blockcanary.BlockCanaryContext; +import com.github.moduth.blockcanary.internal.NetUtils; import java.util.List; @@ -46,7 +47,7 @@ public String provideUid() { @Override public String provideNetworkType() { - return "4G"; + return NetUtils.getNetworkType(DemoApplication.getAppContext()) ; } @Override From cf621a42dce323acf288ad2f82a2421ad7c80055 Mon Sep 17 00:00:00 2001 From: luowei Date: Fri, 14 Sep 2018 14:58:46 +0800 Subject: [PATCH 16/30] Rename fields --- .../blockcanary/ui/BlockCanaryUtils.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/blockcanary-android/src/main/java/com/github/moduth/blockcanary/ui/BlockCanaryUtils.java b/blockcanary-android/src/main/java/com/github/moduth/blockcanary/ui/BlockCanaryUtils.java index 3d1b872..b08248e 100644 --- a/blockcanary-android/src/main/java/com/github/moduth/blockcanary/ui/BlockCanaryUtils.java +++ b/blockcanary-android/src/main/java/com/github/moduth/blockcanary/ui/BlockCanaryUtils.java @@ -11,19 +11,19 @@ final class BlockCanaryUtils { - private static final List WHITE_LIST = new LinkedList<>(); - private static final List CONCERN_LIST = new LinkedList<>(); + private static final List sWhiteList = new LinkedList<>(); + private static final List sConcernList = new LinkedList<>(); static { if (BlockCanaryInternals.getContext().provideWhiteList() != null) { - WHITE_LIST.addAll(BlockCanaryInternals.getContext().provideWhiteList()); + sWhiteList.addAll(BlockCanaryInternals.getContext().provideWhiteList()); } if (BlockCanaryInternals.getContext().concernPackages() != null) { - CONCERN_LIST.addAll(BlockCanaryInternals.getContext().concernPackages()); + sConcernList.addAll(BlockCanaryInternals.getContext().concernPackages()); } - if (CONCERN_LIST.isEmpty()) { - CONCERN_LIST.add(ProcessUtils.myProcessName()); + if (sConcernList.isEmpty()) { + sConcernList.add(ProcessUtils.myProcessName()); } } @@ -58,7 +58,7 @@ public static boolean isInWhiteList(BlockInfo info) { if (Character.isLetter(stackEntry.charAt(0))) { String[] lines = stackEntry.split(BlockInfo.SEPARATOR); for (String line : lines) { - for (String whiteListEntry : WHITE_LIST) { + for (String whiteListEntry : sWhiteList) { if (line.startsWith(whiteListEntry)) { return true; } @@ -70,11 +70,11 @@ public static boolean isInWhiteList(BlockInfo info) { } public static List getConcernPackages() { - return CONCERN_LIST; + return sConcernList; } private static String concernStackString(String line) { - for (String concernPackage : CONCERN_LIST) { + for (String concernPackage : sConcernList) { if (line.startsWith(concernPackage)) { return classSimpleName(line); } From 170a29b4e19668c28f8e49a218f1d01ebcb80adc Mon Sep 17 00:00:00 2001 From: hss01248 Date: Sat, 8 Jun 2019 14:56:03 +0800 Subject: [PATCH 17/30] =?UTF-8?q?=E4=B8=8A=E6=8A=A5=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blockcanary/BlockCanaryInternals.java | 1 + .../moduth/blockcanary/StackSampler.java | 16 ++++++++++--- .../blockcanary/internal/BlockInfo.java | 24 +++++++++++++++++++ .../internal/BlockcanaryException.java | 19 +++++++++++++++ .../blockcanary/internal/BlockInfo.java | 19 +++++++++++++++ .../com/example/blockcanary/AppContext.java | 12 ++++++++++ 6 files changed, 88 insertions(+), 3 deletions(-) create mode 100644 blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/internal/BlockcanaryException.java diff --git a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/BlockCanaryInternals.java b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/BlockCanaryInternals.java index d5e70b3..d9660a9 100644 --- a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/BlockCanaryInternals.java +++ b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/BlockCanaryInternals.java @@ -58,6 +58,7 @@ public void onBlockEvent(long realTimeStart, long realTimeEnd, .setCpuBusyFlag(cpuSampler.isCpuBusy(realTimeStart, realTimeEnd)) .setRecentCpuRate(cpuSampler.getCpuRateInfo()) .setThreadStackEntries(threadStackEntries) + .setStackTraceElements(stackSampler.getTraceElements()) .flushString(); LogWriter.save(blockInfo.toString()); diff --git a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/StackSampler.java b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/StackSampler.java index a6f43d4..b6c6653 100644 --- a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/StackSampler.java +++ b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/StackSampler.java @@ -31,6 +31,14 @@ class StackSampler extends AbstractSampler { private int mMaxEntryCount = DEFAULT_MAX_ENTRY_COUNT; private Thread mCurrentThread; + public StackTraceElement[] getTraceElements() { + synchronized (sStackMap) { + return traceElements; + } + } + + private static StackTraceElement[] traceElements; + public StackSampler(Thread thread, long sampleIntervalMillis) { this(thread, DEFAULT_MAX_ENTRY_COUNT, sampleIntervalMillis); } @@ -59,9 +67,11 @@ public ArrayList getThreadStackEntries(long startTime, long endTime) { @Override protected void doSample() { StringBuilder stringBuilder = new StringBuilder(); - - for (StackTraceElement stackTraceElement : mCurrentThread.getStackTrace()) { - stringBuilder.append(stackTraceElement.toString()).append(BlockInfo.SEPARATOR); + traceElements = mCurrentThread.getStackTrace(); + for (StackTraceElement stackTraceElement : traceElements) { + stringBuilder + .append(stackTraceElement.toString()) + .append(BlockInfo.SEPARATOR); } synchronized (sStackMap) { diff --git a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/internal/BlockInfo.java b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/internal/BlockInfo.java index 74e27fb..67dd315 100644 --- a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/internal/BlockInfo.java +++ b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/internal/BlockInfo.java @@ -88,6 +88,7 @@ public class BlockInfo { public boolean cpuBusy; public String cpuRateInfo; public ArrayList threadStackEntries = new ArrayList<>(); + public StackTraceElement[] stackTraceElements ; private StringBuilder basicSb = new StringBuilder(); private StringBuilder cpuSb = new StringBuilder(); @@ -145,6 +146,11 @@ public BlockInfo setThreadStackEntries(ArrayList threadStackEntries) { return this; } + public BlockInfo setStackTraceElements(StackTraceElement[] stackTraceElements) { + this.stackTraceElements = stackTraceElements; + return this; + } + public BlockInfo setMainThreadTimeCost(long realTimeStart, long realTimeEnd, long threadTimeStart, long threadTimeEnd) { timeCost = realTimeEnd - realTimeStart; threadTimeCost = threadTimeEnd - threadTimeStart; @@ -201,4 +207,22 @@ public String getTimeString() { public String toString() { return String.valueOf(basicSb) + timeSb + cpuSb + stackSb; } + + public Exception buildException(){ + StringBuilder sb = new StringBuilder("threadTimeCost time cost:") + .append(threadTimeCost) + .append("ms,real time cost:") + .append(timeCost) + .append("ms"); + if(timeCost - threadTimeCost > 300){ + sb.append(",thread waiting a long time!!!"); + } + if(cpuBusy){ + sb.append(",cpu is busy !!!"); + } + Exception exception = new BlockcanaryException(sb.toString()); + exception.setStackTrace(stackTraceElements); + return exception; + + } } diff --git a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/internal/BlockcanaryException.java b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/internal/BlockcanaryException.java new file mode 100644 index 0000000..86fe7f8 --- /dev/null +++ b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/internal/BlockcanaryException.java @@ -0,0 +1,19 @@ +package com.github.moduth.blockcanary.internal; + +public class BlockcanaryException extends Exception{ + + public BlockcanaryException() { + } + + public BlockcanaryException(String detailMessage) { + super(detailMessage); + } + + public BlockcanaryException(String detailMessage, Throwable throwable) { + super(detailMessage, throwable); + } + + public BlockcanaryException(Throwable throwable) { + super(throwable); + } +} diff --git a/blockcanary-android-no-op/src/main/java/com/github/moduth/blockcanary/internal/BlockInfo.java b/blockcanary-android-no-op/src/main/java/com/github/moduth/blockcanary/internal/BlockInfo.java index 278a8c7..0dbd64f 100644 --- a/blockcanary-android-no-op/src/main/java/com/github/moduth/blockcanary/internal/BlockInfo.java +++ b/blockcanary-android-no-op/src/main/java/com/github/moduth/blockcanary/internal/BlockInfo.java @@ -1,4 +1,23 @@ package com.github.moduth.blockcanary.internal; public class BlockInfo { + public Exception buildException(){ + return null; + } + + public String getBasicString() { + return ""; + } + + public String getCpuString() { + return ""; + } + + public String getTimeString() { + return ""; + } + + public String toString() { + return ""; + } } diff --git a/blockcanary-sample/src/main/java/com/example/blockcanary/AppContext.java b/blockcanary-sample/src/main/java/com/example/blockcanary/AppContext.java index 5d4bc0e..3a0fdc8 100644 --- a/blockcanary-sample/src/main/java/com/example/blockcanary/AppContext.java +++ b/blockcanary-sample/src/main/java/com/example/blockcanary/AppContext.java @@ -15,11 +15,13 @@ */ package com.example.blockcanary; +import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.util.Log; import com.github.moduth.blockcanary.BlockCanaryContext; +import com.github.moduth.blockcanary.internal.BlockInfo; import com.github.moduth.blockcanary.internal.NetUtils; import java.util.List; @@ -83,4 +85,14 @@ public List provideWhiteList() { public boolean stopWhenDebugging() { return true; } + + @Override + public void onBlock(Context context, BlockInfo blockInfo) { + super.onBlock(context, blockInfo); + Exception e = blockInfo.buildException(); + if(e != null){ + e.printStackTrace(); + } + Log.e("block",blockInfo.toString()); + } } \ No newline at end of file From 3d002db7cadf2f4edf19167572c96b40b4cb9615 Mon Sep 17 00:00:00 2001 From: 1951FDG <1951FDG@users.noreply.github.com> Date: Mon, 12 Aug 2019 17:32:41 +0200 Subject: [PATCH 18/30] Update Gradle to v3.4.2, fix some inspection warnings, display notification light for notifications shown, add adaptive and legacy icons --- .../moduth/blockcanary/AbstractSampler.java | 2 +- .../blockcanary/BlockCanaryInternals.java | 4 +- .../github/moduth/blockcanary/CpuSampler.java | 2 +- .../blockcanary/HandlerThreadFactory.java | 6 +- .../moduth/blockcanary/StackSampler.java | 4 +- .../blockcanary/internal/BlockInfo.java | 16 +- .../moduth/blockcanary/BlockCanary.java | 5 +- .../moduth/blockcanary/DisplayService.java | 75 +++----- .../blockcanary/ui/DisplayActivity.java | 2 +- .../blockcanary/ui/DisplayConnectorView.java | 1 - .../src/main/AndroidManifest.xml | 6 +- .../com/example/blockcanary/DemoActivity.java | 2 +- .../com/example/blockcanary/DemoFragment.java | 6 +- .../src/main/res/drawable-anydpi/ic_done.xml | 10 + .../src/main/res/drawable-hdpi/ic_done.png | Bin 0 -> 424 bytes .../src/main/res/drawable-mdpi/ic_done.png | Bin 0 -> 277 bytes .../src/main/res/drawable-xhdpi/ic_done.png | Bin 0 -> 536 bytes .../src/main/res/drawable-xxhdpi/ic_done.png | Bin 0 -> 795 bytes .../src/main/res/drawable/btn_select.xml | 6 +- .../src/main/res/drawable/ic_done.png | Bin 516 -> 0 bytes .../res/drawable/ic_launcher_foreground.xml | 13 ++ .../src/main/res/layout/activity_main.xml | 2 +- .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3529 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 3529 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2183 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2183 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4876 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 4876 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 3119 -> 8152 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 8152 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 11909 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 11909 bytes .../res/values/ic_launcher_background.xml | 4 + build.gradle | 2 +- gradle.properties | 21 +-- gradle/wrapper/gradle-wrapper.jar | Bin 51010 -> 55190 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 72 +++++--- gradlew.bat | 174 +++++++++--------- 41 files changed, 235 insertions(+), 212 deletions(-) create mode 100644 blockcanary-sample/src/main/res/drawable-anydpi/ic_done.xml create mode 100644 blockcanary-sample/src/main/res/drawable-hdpi/ic_done.png create mode 100644 blockcanary-sample/src/main/res/drawable-mdpi/ic_done.png create mode 100644 blockcanary-sample/src/main/res/drawable-xhdpi/ic_done.png create mode 100644 blockcanary-sample/src/main/res/drawable-xxhdpi/ic_done.png delete mode 100644 blockcanary-sample/src/main/res/drawable/ic_done.png create mode 100644 blockcanary-sample/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 blockcanary-sample/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 blockcanary-sample/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 blockcanary-sample/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 blockcanary-sample/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 blockcanary-sample/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 blockcanary-sample/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 blockcanary-sample/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 blockcanary-sample/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 blockcanary-sample/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 blockcanary-sample/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 blockcanary-sample/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 blockcanary-sample/src/main/res/values/ic_launcher_background.xml diff --git a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/AbstractSampler.java b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/AbstractSampler.java index 5bf61e9..6b7e566 100644 --- a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/AbstractSampler.java +++ b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/AbstractSampler.java @@ -27,7 +27,7 @@ abstract class AbstractSampler { protected AtomicBoolean mShouldSample = new AtomicBoolean(false); protected long mSampleInterval; - private Runnable mRunnable = new Runnable() { + private final Runnable mRunnable = new Runnable() { @Override public void run() { doSample(); diff --git a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/BlockCanaryInternals.java b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/BlockCanaryInternals.java index d9660a9..0d9095e 100644 --- a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/BlockCanaryInternals.java +++ b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/BlockCanaryInternals.java @@ -36,7 +36,7 @@ public final class BlockCanaryInternals { private static BlockCanaryInternals sInstance; private static BlockCanaryContext sContext; - private List mInterceptorChain = new LinkedList<>(); + private final List mInterceptorChain = new LinkedList<>(); public BlockCanaryInternals() { @@ -151,7 +151,7 @@ public static File[] getLogFiles() { private static class BlockLogFileFilter implements FilenameFilter { - private String TYPE = ".log"; + private final String TYPE = ".log"; BlockLogFileFilter() { diff --git a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/CpuSampler.java b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/CpuSampler.java index 01f0455..de89b2f 100644 --- a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/CpuSampler.java +++ b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/CpuSampler.java @@ -56,7 +56,7 @@ public CpuSampler(long sampleInterval) { @Override public void start() { - if (Build.VERSION.SDK_INT < 26) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { super.start(); reset(); } diff --git a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/HandlerThreadFactory.java b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/HandlerThreadFactory.java index e2b77cc..cf552be 100644 --- a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/HandlerThreadFactory.java +++ b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/HandlerThreadFactory.java @@ -20,8 +20,8 @@ final class HandlerThreadFactory { - private static HandlerThreadWrapper sLoopThread = new HandlerThreadWrapper("loop"); - private static HandlerThreadWrapper sWriteLogThread = new HandlerThreadWrapper("writer"); + private static final HandlerThreadWrapper sLoopThread = new HandlerThreadWrapper("loop"); + private static final HandlerThreadWrapper sWriteLogThread = new HandlerThreadWrapper("writer"); private HandlerThreadFactory() { throw new InstantiationError("Must not instantiate this class"); @@ -36,7 +36,7 @@ public static Handler getWriteLogThreadHandler() { } private static class HandlerThreadWrapper { - private Handler handler; + private final Handler handler; public HandlerThreadWrapper(String threadName) { HandlerThread handlerThread = new HandlerThread("BlockCanary-" + threadName); diff --git a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/StackSampler.java b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/StackSampler.java index b6c6653..ca7cc2d 100644 --- a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/StackSampler.java +++ b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/StackSampler.java @@ -28,8 +28,8 @@ class StackSampler extends AbstractSampler { private static final int DEFAULT_MAX_ENTRY_COUNT = 100; private static final LinkedHashMap sStackMap = new LinkedHashMap<>(); - private int mMaxEntryCount = DEFAULT_MAX_ENTRY_COUNT; - private Thread mCurrentThread; + private final int mMaxEntryCount; + private final Thread mCurrentThread; public StackTraceElement[] getTraceElements() { synchronized (sStackMap) { diff --git a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/internal/BlockInfo.java b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/internal/BlockInfo.java index 67dd315..b7e9873 100644 --- a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/internal/BlockInfo.java +++ b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/internal/BlockInfo.java @@ -63,10 +63,10 @@ public class BlockInfo { public static final String KEY_TOTAL_MEMORY = "totalMemory"; public static final String KEY_FREE_MEMORY = "freeMemory"; - public static String sQualifier; - public static String sModel; - public static String sApiLevel = ""; - public static int sCpuCoreNum = -1; + public static final String sQualifier; + public static final String sModel; + public static final String sApiLevel; + public static final int sCpuCoreNum; public String qualifier; public String model; @@ -90,10 +90,10 @@ public class BlockInfo { public ArrayList threadStackEntries = new ArrayList<>(); public StackTraceElement[] stackTraceElements ; - private StringBuilder basicSb = new StringBuilder(); - private StringBuilder cpuSb = new StringBuilder(); - private StringBuilder timeSb = new StringBuilder(); - private StringBuilder stackSb = new StringBuilder(); + private final StringBuilder basicSb = new StringBuilder(); + private final StringBuilder cpuSb = new StringBuilder(); + private final StringBuilder timeSb = new StringBuilder(); + private final StringBuilder stackSb = new StringBuilder(); static { sCpuCoreNum = PerformanceUtils.getNumCores(); diff --git a/blockcanary-android/src/main/java/com/github/moduth/blockcanary/BlockCanary.java b/blockcanary-android/src/main/java/com/github/moduth/blockcanary/BlockCanary.java index aa5bf48..a0b93f1 100644 --- a/blockcanary-android/src/main/java/com/github/moduth/blockcanary/BlockCanary.java +++ b/blockcanary-android/src/main/java/com/github/moduth/blockcanary/BlockCanary.java @@ -20,6 +20,7 @@ import android.content.ComponentName; import android.content.Context; import android.content.pm.PackageManager; +import android.graphics.Color; import android.os.Build; import android.os.Looper; import android.preference.PreferenceManager; @@ -39,7 +40,7 @@ public final class BlockCanary { // these lines are originally copied from LeakCanary: Copyright (C) 2015 Square, Inc. private static final Executor fileIoExecutor = newSingleThreadExecutor("File-IO"); private static BlockCanary sInstance; - private BlockCanaryInternals mBlockCanaryCore; + private final BlockCanaryInternals mBlockCanaryCore; private boolean mMonitorStarted = false; private BlockCanary() { @@ -119,7 +120,9 @@ private static void createNotificationChannel(Context context) { if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { int importance = NotificationManager.IMPORTANCE_DEFAULT; NotificationChannel channel = new NotificationChannel(DisplayService.CHANNEL_ID, "Block Canary", importance); + channel.enableLights(true); channel.setDescription("Block Canary"); + channel.setLightColor(Color.RED); // Register the channel with the system; you can't change the importance // or other notification behaviors after this NotificationManager notificationManager = context.getSystemService(NotificationManager.class); diff --git a/blockcanary-android/src/main/java/com/github/moduth/blockcanary/DisplayService.java b/blockcanary-android/src/main/java/com/github/moduth/blockcanary/DisplayService.java index fc10be7..d30dc77 100644 --- a/blockcanary-android/src/main/java/com/github/moduth/blockcanary/DisplayService.java +++ b/blockcanary-android/src/main/java/com/github/moduth/blockcanary/DisplayService.java @@ -21,20 +21,12 @@ import android.content.Context; import android.content.Intent; import android.os.Build; -import android.util.Log; +import android.os.Build.VERSION; +import android.os.Build.VERSION_CODES; import com.github.moduth.blockcanary.internal.BlockInfo; import com.github.moduth.blockcanary.ui.DisplayActivity; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; - -import static android.app.PendingIntent.FLAG_UPDATE_CURRENT; -import static android.os.Build.VERSION.SDK_INT; -import static android.os.Build.VERSION_CODES.HONEYCOMB; -import static android.os.Build.VERSION_CODES.JELLY_BEAN; -import static android.os.Build.VERSION_CODES.LOLLIPOP; - final class DisplayService implements BlockInterceptor { private static final String TAG = "DisplayService"; @@ -45,7 +37,7 @@ public void onBlock(Context context, BlockInfo blockInfo) { Intent intent = new Intent(context, DisplayActivity.class); intent.putExtra("show_latest", blockInfo.timeStart); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); - PendingIntent pendingIntent = PendingIntent.getActivity(context, 1, intent, FLAG_UPDATE_CURRENT); + PendingIntent pendingIntent = PendingIntent.getActivity(context, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT); String contentTitle = context.getString(R.string.block_canary_class_has_blocked, blockInfo.timeStart); String contentText = context.getString(R.string.block_canary_notification_message); show(context, contentTitle, contentText, pendingIntent); @@ -57,46 +49,31 @@ private void show(Context context, String contentTitle, String contentText, Pend if(notificationManager != null) { Notification notification; - if (SDK_INT < HONEYCOMB) { - notification = new Notification(); - notification.icon = R.drawable.block_canary_notification; - notification.when = System.currentTimeMillis(); - notification.flags |= Notification.FLAG_AUTO_CANCEL; - notification.defaults = Notification.DEFAULT_SOUND; - try { - Method deprecatedMethod = notification.getClass().getMethod("setLatestEventInfo", Context.class, CharSequence.class, CharSequence.class, PendingIntent.class); - deprecatedMethod.invoke(notification, context, contentTitle, contentText, pendingIntent); - } catch (NoSuchMethodException | IllegalAccessException | IllegalArgumentException - | InvocationTargetException e) { - Log.w(TAG, "Method not found", e); - } + Notification.Builder builder; + if(VERSION.SDK_INT >= Build.VERSION_CODES.O) { + builder = new Notification.Builder(context, CHANNEL_ID) + .setSmallIcon(R.drawable.block_canary_notification) + .setWhen(System.currentTimeMillis()) + .setContentTitle(contentTitle) + .setContentText(contentText) + .setAutoCancel(true) + .setContentIntent(pendingIntent) + .setDefaults(Notification.DEFAULT_SOUND); } else { - Notification.Builder builder; - if(SDK_INT >= Build.VERSION_CODES.O) { - builder = new Notification.Builder(context, CHANNEL_ID) - .setSmallIcon(R.drawable.block_canary_notification) - .setWhen(System.currentTimeMillis()) - .setContentTitle(contentTitle) - .setContentText(contentText) - .setAutoCancel(true) - .setContentIntent(pendingIntent) - .setDefaults(Notification.DEFAULT_SOUND); - } else { - builder = new Notification.Builder(context) - .setSmallIcon(R.drawable.block_canary_notification) - .setWhen(System.currentTimeMillis()) - .setContentTitle(contentTitle) - .setContentText(contentText) - .setAutoCancel(true) - .setContentIntent(pendingIntent) - .setDefaults(Notification.DEFAULT_SOUND); - } + builder = new Notification.Builder(context) + .setSmallIcon(R.drawable.block_canary_notification) + .setWhen(System.currentTimeMillis()) + .setContentTitle(contentTitle) + .setContentText(contentText) + .setAutoCancel(true) + .setContentIntent(pendingIntent) + .setDefaults(Notification.DEFAULT_SOUND); + } - if (SDK_INT < JELLY_BEAN) { - notification = builder.getNotification(); - } else { - notification = builder.build(); - } + if (VERSION.SDK_INT < VERSION_CODES.JELLY_BEAN) { + notification = builder.getNotification(); + } else { + notification = builder.build(); } notificationManager.notify(0xDEAFBEEF, notification); } diff --git a/blockcanary-android/src/main/java/com/github/moduth/blockcanary/ui/DisplayActivity.java b/blockcanary-android/src/main/java/com/github/moduth/blockcanary/ui/DisplayActivity.java index 79ce79c..7a1bf5f 100644 --- a/blockcanary-android/src/main/java/com/github/moduth/blockcanary/ui/DisplayActivity.java +++ b/blockcanary-android/src/main/java/com/github/moduth/blockcanary/ui/DisplayActivity.java @@ -57,7 +57,7 @@ public class DisplayActivity extends Activity { private static final String TAG = "DisplayActivity"; private static final String SHOW_BLOCK_EXTRA = "show_latest"; - public static final String SHOW_BLOCK_EXTRA_KEY = "BlockStartTime"; + private static final String SHOW_BLOCK_EXTRA_KEY = "BlockStartTime"; // empty until it's been first loaded. private List mBlockInfoEntries = new ArrayList<>(); diff --git a/blockcanary-android/src/main/java/com/github/moduth/blockcanary/ui/DisplayConnectorView.java b/blockcanary-android/src/main/java/com/github/moduth/blockcanary/ui/DisplayConnectorView.java index 0f09d47..e07e9af 100644 --- a/blockcanary-android/src/main/java/com/github/moduth/blockcanary/ui/DisplayConnectorView.java +++ b/blockcanary-android/src/main/java/com/github/moduth/blockcanary/ui/DisplayConnectorView.java @@ -53,7 +53,6 @@ public DisplayConnectorView(Context context, AttributeSet attrs) { type = Type.NODE; } - @SuppressWarnings("SuspiciousNameCombination") @Override protected void onDraw(Canvas canvas) { int width = getWidth(); diff --git a/blockcanary-sample/src/main/AndroidManifest.xml b/blockcanary-sample/src/main/AndroidManifest.xml index fbf6d6b..6455486 100644 --- a/blockcanary-sample/src/main/AndroidManifest.xml +++ b/blockcanary-sample/src/main/AndroidManifest.xml @@ -1,5 +1,6 @@ - + android:theme="@style/ModuThreeHandsomeTheme" + tools:ignore="AllowBackup,GoogleAppIndexingWarning"> + + diff --git a/blockcanary-sample/src/main/res/drawable-hdpi/ic_done.png b/blockcanary-sample/src/main/res/drawable-hdpi/ic_done.png new file mode 100644 index 0000000000000000000000000000000000000000..4c4b06932d79600b0940941dbc90d136d8628880 GIT binary patch literal 424 zcmV;Z0ayNsP)Fq*3m2Zpb1A7;5Pv8DG zgcN}>a2E?4fF;lc>OhT9r)x{%aJy5i;wNHOBIpT7fwIECOx%-*v5FD}r-=xZ0ZBxh zgnYS8LWA@~n&zK$40YyQq_3xSu8IQAd}45~4U7owH=;68=v9rN0dqROOA`rs*+`MT zBjXP=ulCFwQpE$P1ra}G{Ije_cwc ziogjE!a{ff3)VDOoi*5mwfgu7ud5hS4@+<*palcCdl%9wxw8#aO_h-FX2NZP5v06utR*}~8##k) zF9fvkm~G?=vi2A_TLiv_Wc^A&utgC8-WCOi91-9ha`I!E_D4&8Rb;vBvRv26ADnDY b=Fij{l6T3k9s3>+00000NkvXXu0mjf1uk$= literal 0 HcmV?d00001 diff --git a/blockcanary-sample/src/main/res/drawable-xhdpi/ic_done.png b/blockcanary-sample/src/main/res/drawable-xhdpi/ic_done.png new file mode 100644 index 0000000000000000000000000000000000000000..68e436523adfa9abcc23d5079df481546b265b7e GIT binary patch literal 536 zcmV+z0_XjSP)UwG~R_=A>fryk=!A^fOp=dCvZ;TU9$*1Mtg$>(m;EFWTlQ^pzRw&j1eor&{%}5#ydh4yX#wLUq0#<+=PywC+XYplc{8r&V^55ZKa6AG$08YZ( zPRNa1I6ecEfU9V3SJayQmh)@Chu}AL zdTXl4*ee}kPDn?G)$Wn_lIxHvLdqNlkP%-h9TH6@slxzLnnZO-GfZt3GhN z3m3G=%v^V8?q=j1IE{(t-aWfBJ9B3yjRpV!0000&7-Kex$Ha5ulz2;A67S3>?)Y!F z{GD_DpUt0YN}D(!E{HFtJYHC%&}#n#V|v6n@y&$C8*BGcH0FqSZS+vYI!eKq4smAc zLlL{PuIBWK|4jWTa_FyfO;HZ&%b`iHe%rj*k01=-kaQ z@ho1i`vLTW8^pT%jv>Hx$dZK(qd+mD7{uBmNB+GK0p^Yoa-M)exnsmV4^auUJ)*;a zO*ooCtUq*g5$!6%1INU(m5@O##{_p!MR;Km9Vb}j99ynsQDybv)gpS3pg{+gYk4iT zTEfdLtMEYFNYJ1S&V3b*%Lrar#I72Nf-94&a8X8VY7sk2*q}4ZHBHNi-B`p<5;o|> za!og7#FiGZZiK|6zUIHg=~_Z9%ZNQ$#C8%kXvY%jsf?Iy4LwWPpv<=B4}&5YgeHbg zx>_f#_L^5TDClcmZJ?-VP|$&*+Ehc)prBI?waKc6K`|z)YUK_kgTj_OGz(@*28At{ zq2wwPM$uj%j%6QD04y8|f?(;{69}6Z1Oc)A#S;`8s04wr1y7I!HgO8dme>X?7<^$P zxhFXsMG)RW9A**pNjMHA90K4#onSDDBbmav8xHjfOC>lKF04%AhXsUY;ioA80000$ Z1s}o;Sz!x7+~@!R002ovPDHLkV1mG_W+MOq literal 0 HcmV?d00001 diff --git a/blockcanary-sample/src/main/res/drawable/btn_select.xml b/blockcanary-sample/src/main/res/drawable/btn_select.xml index a8a916a..588f1ba 100644 --- a/blockcanary-sample/src/main/res/drawable/btn_select.xml +++ b/blockcanary-sample/src/main/res/drawable/btn_select.xml @@ -1,8 +1,8 @@ - - - + + + \ No newline at end of file diff --git a/blockcanary-sample/src/main/res/drawable/ic_done.png b/blockcanary-sample/src/main/res/drawable/ic_done.png deleted file mode 100644 index bf5bc7e090422d8100df27bbe8ad463cfbf757e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 516 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>U_9;V;uunK>+P*xUuQ!e*N1!z zsmyALGHf5iWE<|+N+|4E-qgavbje~{@_euIhI#&>x2MZQWwSpsR|1;B%)kINiid$g zf`P#RZ1@2Nh6YB6gu{xvIlI{p=>N;M-p|6Y|A#MgQ1=5HvjVVLun`9rPy=^qRh$Jq~9+A*B_$XL)9FMGhYF1116<7%ds&UitEkUv=r z4>Tp;#s`ExZf4REj+cIrcRTa8=*PE=-+tuF=f670 znYi;u6hr)DbM+S0$Jq>jMD9x^-u$tcVgJ$XP7zlBI1aqEe^kFuPF+z)zW$4_f^2@A zw4!TG?|TOR7TbTtZ9k&+H&qF)>sO;QoJ~ zh>rL58u~}R?-x}B64R8fK6c+Bt}^wp`_37vp^x2nNvexJcHccq#J + + + + diff --git a/blockcanary-sample/src/main/res/layout/activity_main.xml b/blockcanary-sample/src/main/res/layout/activity_main.xml index 5c5fdff..46bb797 100644 --- a/blockcanary-sample/src/main/res/layout/activity_main.xml +++ b/blockcanary-sample/src/main/res/layout/activity_main.xml @@ -17,7 +17,7 @@ android:layout_centerInParent="true" android:text="@string/app_name" android:textColor="@android:color/white" - android:textSize="18sp"/> + android:textSize="18sp" /> diff --git a/blockcanary-sample/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/blockcanary-sample/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..7353dbd --- /dev/null +++ b/blockcanary-sample/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/blockcanary-sample/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/blockcanary-sample/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..7353dbd --- /dev/null +++ b/blockcanary-sample/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/blockcanary-sample/src/main/res/mipmap-hdpi/ic_launcher.png b/blockcanary-sample/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..fb04068a362cd2c5a3527477e51202c59de16103 GIT binary patch literal 3529 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 JPDHLkV1n`-P1yhd literal 0 HcmV?d00001 diff --git a/blockcanary-sample/src/main/res/mipmap-mdpi/ic_launcher_round.png b/blockcanary-sample/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..4265ffb614b5a63eb083a4d2b3d4b9d44be1aa3e GIT binary patch literal 2183 zcmV;22zd92P)CBYDGPZ~rBpyDTPVa|AM4|5+1uw;y+nAHP%z1NxkC9uBQ)`xn`CVeUawSfc|S^Mj?mg@ zH2QBO61gDMEYB?v&wR#rtkG*ny>vqey~E3;qSP*-4k0B<`X;?+7d(UpxXI{E#RCT4 z`uS^7qS2vrG#m~`{19s$1~tOdRtfykqa5K7G12 zV;>go`kB@#00bb?a8OV8H@4dGcgcSXiir4jmdJp81ULSi@TOB#B1E zM5C*#t6EeDq-BJiJi_cZl((7M)ZN{!8XFtc;>C;A*s)_(C=^n#NJXq+EqmAtk0kjK zlh@JF@w;V2z>fhz?fLJF=iQXQd-tv?FE3Yld3l~nCnNU4172=Mi2Mi!wzRZ-Z|mk+ z=Ow%!n}l_P&GF;M)wF5TR8CG#T$$|bY*kQDpr%ZjqE@U}p{lE^)t)_j)Xtqd)%x}8 z)$--b)x?Pt)v#g1R3H$D?}G=t;OPb@oG4HV-?(w(vy^?p#=TfwXC-U`({ty}siLBy z1SJLy8l=j~%G9xA$5dx$XVOG{^5ls+a^#3wxNu=YkMQPfvgpyj>y@1xh5nL}8vQl#E64 zx4(G5(W=b}m?zZ6^SQaXYT2@7>cN8t8P)!)SFft#;^G7Y;EfDtPM`};l_;DSNWRe{ z3dW*`4X*_Z`3nR@>E_3LWJj2W?{hZjZ=2^&txLZ(|TG&eW@W9331-XQMWxieB0 zb(j)nHz{hiov@i;-Y7qN_UyRlF@i_{Cvsxoz=3f&$aFNji0DdR=s0-rU{SoenX)AK znycZHkhpYB8jlf3Im{F`c-|<_U*7Y%SwnR)IfhJRJ75$AMhy)O-^5F*i9maM`yXy~ zpVn_WEOnkznMuOpX&W{~f{57bD6#Yj)3K55>9Fa- zX6n?b39um&Hf)>(M2$RTyLDzMvzJz_T9p?!;KYd&LnUEuI}IRQOp=D-#*G_&D}Uw6 z6*X(ttT?6(Y=Bd$eU+7!ae2r_2d4pTZEejmo(zv0P+wnPD0TON(*S09#$m&7_wL=k zJ&*Fn^B6%SfRoqW9Xoc!vHcD*RuwlIPf;O*Vj)9B8%kOyL zmlzNk6q5~ec%NZTpx$0lQSqs6z(ISQ&XtLDub*+6(U%d}&v@X67|j{c{fyJ{d9AE@ zGvO#;@?ih|{om@cl>j5>fyO33<3TE-C~!F9kd*8|!+}h6jIwsywr#*Cm~gB#$Fm6& zCcG;lI`8L5X^2Q0{Cg0U0U&$WtR|Cp>D zhJu?mZOTq{E7y1R>ea<^!0*!6ieWz&TPQ)FpxIFlxy<5Hi_0x8x#+MoDeAnbTwWJj zf`l-YN1)cVa^=brbd$j|Pq)Ymi7bPVySc#PM*d-pnPYHEH#=5r};!%0e94mgx^!+vcT$}%M4 z_h%=^FPbsM;RVlzhKBk@ix$mB7BbU@O{&BeW*EUuz!*6-{nXUdbe>S_h{Rszmlcnn zSR>Z@7+m00RaNz~@cs}P$a*3FhM;ROka~OY;KAe9ty{PByX=#N*mp}B&^?If zYuBz_5ct)xhPCXGy`wdce(;oL_e%a}0%P9Lija6?^7HdQnlx$BL>crxhj`{QzSC=l z=slsA{?8t65us9?IddjQ=ZT39|Nrp1rUCl1kj8h2J-vbR{{X;%F$yPFo_7EM002ov JPDHLkV1n`-P1yhd literal 0 HcmV?d00001 diff --git a/blockcanary-sample/src/main/res/mipmap-xhdpi/ic_launcher.png b/blockcanary-sample/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d8ea51c30986d483a53cb0f02553d749d4b11a76 GIT binary patch literal 4876 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 literal 3119 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 JPDHLkV1kxP;h+Ej diff --git a/blockcanary-sample/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/blockcanary-sample/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..2a3e83d2eb4c2273fe988cc9d5e50ed47e5f2d80 GIT binary patch literal 8152 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 literal 0 HcmV?d00001 diff --git a/blockcanary-sample/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/blockcanary-sample/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..7d6b1dd2d679906ed35d187fc225189d72a61c16 GIT binary patch literal 11909 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 UsnP8d&|VHwkX4nbkunSWKQ^}F*Z=?k literal 0 HcmV?d00001 diff --git a/blockcanary-sample/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/blockcanary-sample/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..7d6b1dd2d679906ed35d187fc225189d72a61c16 GIT binary patch literal 11909 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 UsnP8d&|VHwkX4nbkunSWKQ^}F*Z=?k literal 0 HcmV?d00001 diff --git a/blockcanary-sample/src/main/res/values/ic_launcher_background.xml b/blockcanary-sample/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..c5d5899 --- /dev/null +++ b/blockcanary-sample/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #FFFFFF + \ No newline at end of file diff --git a/build.gradle b/build.gradle index aaf6893..9b119f6 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:3.4.1' + classpath 'com.android.tools.build:gradle:3.4.2' } } diff --git a/gradle.properties b/gradle.properties index 793545a..98f4adf 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,20 +1,19 @@ -## Project-wide Gradle settings. -# +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + # For more details on how to configure your build environment visit # http://www.gradle.org/docs/current/userguide/build_environment.html -# + # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. -# Default value: -Xmx10248m -XX:MaxPermSize=256m -# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 -# +org.gradle.jvmargs=-Xmx8192M + # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true -#Sat Mar 05 00:07:08 CST 2016 -org.gradle.jvmargs=-Xmx8192M -#org.gradle.jvmargs=-Xmx10248m -XX\:MaxPermSize\=512m -XX\:+HeapDumpOnOutOfMemoryError -Dfile.encoding\=UTF-8 +org.gradle.parallel=true org.gradle.daemon=true org.gradle.configureondemand=false -org.gradle.parallel=true diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 2322723c7ed5f591adfa4c87b6c51932f591249a..87b738cbd051603d91cc39de6cb000dd98fe6b02 100644 GIT binary patch literal 55190 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 z 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∓LFg$ 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index f9dee44..aadee1f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,4 +1,4 @@ -#Wed Jun 26 23:56:27 WIB 2019 +#Mon Aug 12 14:46:31 CEST 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index 9d82f78..af6708f 100755 --- a/gradlew +++ b/gradlew @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#!/usr/bin/env sh ############################################################################## ## @@ -6,20 +6,38 @@ ## ############################################################################## -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m"' + # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" -warn ( ) { +warn () { echo "$*" } -die ( ) { +die () { echo echo "$*" echo @@ -30,6 +48,7 @@ die ( ) { cygwin=false msys=false darwin=false +nonstop=false case "`uname`" in CYGWIN* ) cygwin=true @@ -40,26 +59,11 @@ case "`uname`" in MINGW* ) msys=true ;; + NONSTOP* ) + nonstop=true + ;; esac -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -85,7 +89,7 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then MAX_FD_LIMIT=`ulimit -H -n` if [ $? -eq 0 ] ; then if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then @@ -150,11 +154,19 @@ if $cygwin ; then esac fi -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " } -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index 8a0b282..0f8d593 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,90 +1,84 @@ -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windowz variants - -if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega From 394aa3905fb1ca3494807456a8117a28652ec6d3 Mon Sep 17 00:00:00 2001 From: 1951FDG <1951FDG@users.noreply.github.com> Date: Mon, 12 Aug 2019 17:35:22 +0200 Subject: [PATCH 19/30] Use NotificationCompat.Builder --- blockcanary-android/build.gradle | 1 + .../moduth/blockcanary/DisplayService.java | 39 ++++++------------- 2 files changed, 12 insertions(+), 28 deletions(-) diff --git a/blockcanary-android/build.gradle b/blockcanary-android/build.gradle index dc6db41..82d5c4c 100644 --- a/blockcanary-android/build.gradle +++ b/blockcanary-android/build.gradle @@ -23,4 +23,5 @@ dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') api project(':blockcanary-analyzer') //implementation 'com.github.markzhai:blockcanary-analyzer:1.5.0' + implementation 'com.android.support:support-compat:28.0.0' } diff --git a/blockcanary-android/src/main/java/com/github/moduth/blockcanary/DisplayService.java b/blockcanary-android/src/main/java/com/github/moduth/blockcanary/DisplayService.java index d30dc77..b9c672f 100644 --- a/blockcanary-android/src/main/java/com/github/moduth/blockcanary/DisplayService.java +++ b/blockcanary-android/src/main/java/com/github/moduth/blockcanary/DisplayService.java @@ -20,9 +20,7 @@ import android.app.PendingIntent; import android.content.Context; import android.content.Intent; -import android.os.Build; -import android.os.Build.VERSION; -import android.os.Build.VERSION_CODES; +import android.support.v4.app.NotificationCompat; import com.github.moduth.blockcanary.internal.BlockInfo; import com.github.moduth.blockcanary.ui.DisplayActivity; @@ -49,32 +47,17 @@ private void show(Context context, String contentTitle, String contentText, Pend if(notificationManager != null) { Notification notification; - Notification.Builder builder; - if(VERSION.SDK_INT >= Build.VERSION_CODES.O) { - builder = new Notification.Builder(context, CHANNEL_ID) - .setSmallIcon(R.drawable.block_canary_notification) - .setWhen(System.currentTimeMillis()) - .setContentTitle(contentTitle) - .setContentText(contentText) - .setAutoCancel(true) - .setContentIntent(pendingIntent) - .setDefaults(Notification.DEFAULT_SOUND); - } else { - builder = new Notification.Builder(context) - .setSmallIcon(R.drawable.block_canary_notification) - .setWhen(System.currentTimeMillis()) - .setContentTitle(contentTitle) - .setContentText(contentText) - .setAutoCancel(true) - .setContentIntent(pendingIntent) - .setDefaults(Notification.DEFAULT_SOUND); - } + NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CHANNEL_ID) + .setSmallIcon(R.drawable.block_canary_notification) + .setWhen(System.currentTimeMillis()) + .setContentTitle(contentTitle) + .setContentText(contentText) + .setAutoCancel(true) + .setContentIntent(pendingIntent) + .setDefaults(Notification.DEFAULT_SOUND) + .setPriority(NotificationCompat.PRIORITY_DEFAULT); - if (VERSION.SDK_INT < VERSION_CODES.JELLY_BEAN) { - notification = builder.getNotification(); - } else { - notification = builder.build(); - } + notification = builder.build(); notificationManager.notify(0xDEAFBEEF, notification); } } From ed9b600a9d88dfb051f79435bde1f046cae7cf13 Mon Sep 17 00:00:00 2001 From: 1951FDG <1951FDG@users.noreply.github.com> Date: Mon, 12 Aug 2019 17:38:51 +0200 Subject: [PATCH 20/30] Update layout of sample app --- blockcanary-sample/src/main/AndroidManifest.xml | 3 ++- .../java/com/example/blockcanary/DemoActivity.java | 10 +--------- .../src/main/res/layout/activity_demo.xml | 9 --------- .../src/main/res/layout/activity_main.xml | 14 ++------------ blockcanary-sample/src/main/res/menu/menu_demo.xml | 11 ++++++++--- blockcanary-sample/src/main/res/values/styles.xml | 3 +-- 6 files changed, 14 insertions(+), 36 deletions(-) diff --git a/blockcanary-sample/src/main/AndroidManifest.xml b/blockcanary-sample/src/main/AndroidManifest.xml index 6455486..ceac407 100644 --- a/blockcanary-sample/src/main/AndroidManifest.xml +++ b/blockcanary-sample/src/main/AndroidManifest.xml @@ -13,7 +13,8 @@ + android:label="@string/app_name" + android:theme="@style/CjjBaseTheme"> diff --git a/blockcanary-sample/src/main/java/com/example/blockcanary/DemoActivity.java b/blockcanary-sample/src/main/java/com/example/blockcanary/DemoActivity.java index 4453b14..975ea56 100644 --- a/blockcanary-sample/src/main/java/com/example/blockcanary/DemoActivity.java +++ b/blockcanary-sample/src/main/java/com/example/blockcanary/DemoActivity.java @@ -33,14 +33,6 @@ protected void onCreate(Bundle savedInstanceState) { getSupportFragmentManager().beginTransaction() .add(R.id.container, DemoFragment.newInstance()) .commit(); - - FloatingActionButton fab = findViewById(R.id.fab); - fab.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - showTipDialog(); - } - }); } private void showTipDialog() { @@ -65,8 +57,8 @@ public boolean onOptionsItemSelected(MenuItem item) { // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); - //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { + showTipDialog(); return true; } diff --git a/blockcanary-sample/src/main/res/layout/activity_demo.xml b/blockcanary-sample/src/main/res/layout/activity_demo.xml index 066c36a..0b423d5 100644 --- a/blockcanary-sample/src/main/res/layout/activity_demo.xml +++ b/blockcanary-sample/src/main/res/layout/activity_demo.xml @@ -19,13 +19,4 @@ android:layout_width="match_parent" android:layout_height="match_parent" tools:ignore="MergeRootFrame" /> - - \ No newline at end of file diff --git a/blockcanary-sample/src/main/res/layout/activity_main.xml b/blockcanary-sample/src/main/res/layout/activity_main.xml index 46bb797..35d7ff9 100644 --- a/blockcanary-sample/src/main/res/layout/activity_main.xml +++ b/blockcanary-sample/src/main/res/layout/activity_main.xml @@ -7,7 +7,8 @@ + android:background="@color/material_blue" + android:visibility="gone"> @@ -94,14 +94,4 @@ - - - \ No newline at end of file diff --git a/blockcanary-sample/src/main/res/menu/menu_demo.xml b/blockcanary-sample/src/main/res/menu/menu_demo.xml index 300f66a..f841b74 100644 --- a/blockcanary-sample/src/main/res/menu/menu_demo.xml +++ b/blockcanary-sample/src/main/res/menu/menu_demo.xml @@ -1,5 +1,10 @@ - - + + \ No newline at end of file diff --git a/blockcanary-sample/src/main/res/values/styles.xml b/blockcanary-sample/src/main/res/values/styles.xml index 5e0dd50..b309e57 100644 --- a/blockcanary-sample/src/main/res/values/styles.xml +++ b/blockcanary-sample/src/main/res/values/styles.xml @@ -3,11 +3,10 @@ - From d397b38ed8eab54168d57a587c3f2cbb1473c054 Mon Sep 17 00:00:00 2001 From: 1951FDG <1951FDG@users.noreply.github.com> Date: Mon, 12 Aug 2019 17:39:53 +0200 Subject: [PATCH 21/30] Fourth action titled " WAIT FOR MORE" is not implemented yet --- .../src/main/java/com/example/blockcanary/DemoFragment.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/blockcanary-sample/src/main/java/com/example/blockcanary/DemoFragment.java b/blockcanary-sample/src/main/java/com/example/blockcanary/DemoFragment.java index c4c2261..afed5d4 100644 --- a/blockcanary-sample/src/main/java/com/example/blockcanary/DemoFragment.java +++ b/blockcanary-sample/src/main/java/com/example/blockcanary/DemoFragment.java @@ -52,10 +52,12 @@ public void onViewCreated(final View view, @Nullable final Bundle savedInstanceS Button button1 = view.findViewById(R.id.button1); Button button2 = view.findViewById(R.id.button2); Button button3 = view.findViewById(R.id.button3); + Button button4 = view.findViewById(R.id.button4); button1.setOnClickListener(this); button2.setOnClickListener(this); button3.setOnClickListener(this); + button4.setOnClickListener(this); } @Override @@ -88,6 +90,9 @@ public void onClick(View v) { double result = compute(); System.out.println(result); break; + case R.id.button4: + System.out.println("not implemented"); + break; default: break; } From e6f681d3f2432ce38916fec03e937930d93040c7 Mon Sep 17 00:00:00 2001 From: 1951FDG <1951FDG@users.noreply.github.com> Date: Mon, 12 Aug 2019 17:40:52 +0200 Subject: [PATCH 22/30] /proc/stat is no longer accessible in Android O --- .../src/main/java/com/example/blockcanary/DemoFragment.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/blockcanary-sample/src/main/java/com/example/blockcanary/DemoFragment.java b/blockcanary-sample/src/main/java/com/example/blockcanary/DemoFragment.java index afed5d4..cc4408f 100644 --- a/blockcanary-sample/src/main/java/com/example/blockcanary/DemoFragment.java +++ b/blockcanary-sample/src/main/java/com/example/blockcanary/DemoFragment.java @@ -15,6 +15,7 @@ */ package com.example.blockcanary; +import android.os.Build; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; @@ -83,7 +84,9 @@ public void onClick(View v) { break; case R.id.button2: for (int i = 0; i < 100; ++i) { - readFile(); + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { + readFile(); + } } break; case R.id.button3: @@ -107,6 +110,7 @@ private static double compute() { return result; } + @Deprecated private static void readFile() { FileInputStream reader = null; try { From bff502fa0d5b73542e9a40280ac30c0486a557cf Mon Sep 17 00:00:00 2001 From: 1951FDG <1951FDG@users.noreply.github.com> Date: Mon, 12 Aug 2019 17:43:12 +0200 Subject: [PATCH 23/30] Increase number of times loop is run to ensure that on newer devices the threshold in ms is also exceeded --- .../src/main/java/com/example/blockcanary/DemoFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockcanary-sample/src/main/java/com/example/blockcanary/DemoFragment.java b/blockcanary-sample/src/main/java/com/example/blockcanary/DemoFragment.java index cc4408f..31f0e02 100644 --- a/blockcanary-sample/src/main/java/com/example/blockcanary/DemoFragment.java +++ b/blockcanary-sample/src/main/java/com/example/blockcanary/DemoFragment.java @@ -103,7 +103,7 @@ public void onClick(View v) { private static double compute() { double result = 0; - for (int i = 0; i < 1000000; ++i) { + for (int i = 0; i < 2000000; ++i) { result += Math.acos(Math.cos(i)); result -= Math.asin(Math.sin(i)); } From 2e4ba4e9fb8cc5c8ae0bebfe927acdfddfb7e9b0 Mon Sep 17 00:00:00 2001 From: 1951FDG <1951FDG@users.noreply.github.com> Date: Mon, 12 Aug 2019 21:54:31 +0200 Subject: [PATCH 24/30] Fix some inspection warnings --- .../github/moduth/blockcanary/LooperMonitor.java | 4 +--- .../moduth/blockcanary/internal/BlockInfo.java | 1 - blockcanary-android/build.gradle | 3 +-- .../github/moduth/blockcanary/ui/DetailAdapter.java | 4 ++-- .../moduth/blockcanary/ui/DisplayActivity.java | 4 ++-- .../src/main/res/values-v14/themes.xml | 5 ----- .../java/com/example/blockcanary/DemoActivity.java | 2 -- .../java/com/example/blockcanary/DemoFragment.java | 8 ++------ .../src/main/res/drawable/background_splash.xml | 13 ------------- .../src/main/res/layout/activity_main.xml | 1 - blockcanary-sample/src/main/res/values/dimens.xml | 6 ------ build.gradle | 1 - 12 files changed, 8 insertions(+), 44 deletions(-) delete mode 100644 blockcanary-android/src/main/res/values-v14/themes.xml delete mode 100644 blockcanary-sample/src/main/res/drawable/background_splash.xml diff --git a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/LooperMonitor.java b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/LooperMonitor.java index e101c92..ee5b41a 100644 --- a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/LooperMonitor.java +++ b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/LooperMonitor.java @@ -21,9 +21,7 @@ class LooperMonitor implements Printer { - private static final int DEFAULT_BLOCK_THRESHOLD_MILLIS = 3000; - - private long mBlockThresholdMillis = DEFAULT_BLOCK_THRESHOLD_MILLIS; + private long mBlockThresholdMillis; private long mStartTimestamp = 0; private long mStartThreadTimestamp = 0; private BlockListener mBlockListener; diff --git a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/internal/BlockInfo.java b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/internal/BlockInfo.java index b7e9873..f78058d 100644 --- a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/internal/BlockInfo.java +++ b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/internal/BlockInfo.java @@ -19,7 +19,6 @@ import android.content.pm.PackageInfo; import android.os.Build; import android.os.Build.VERSION; -import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.Log; diff --git a/blockcanary-android/build.gradle b/blockcanary-android/build.gradle index 82d5c4c..58ae0fe 100644 --- a/blockcanary-android/build.gradle +++ b/blockcanary-android/build.gradle @@ -3,7 +3,6 @@ apply from: 'gradle-mvn-push.gradle' android { compileSdkVersion LIBRARY_COMPILE_SDK_VERSION - buildToolsVersion LIBRARY_BUILD_TOOLS_VERSION defaultConfig { minSdkVersion LIBRARY_MIN_SDK_VERSION @@ -20,7 +19,7 @@ android { } dependencies { - implementation fileTree(include: ['*.jar'], dir: 'libs') + implementation fileTree(dir: 'libs', include: ['*.jar']) api project(':blockcanary-analyzer') //implementation 'com.github.markzhai:blockcanary-analyzer:1.5.0' implementation 'com.android.support:support-compat:28.0.0' diff --git a/blockcanary-android/src/main/java/com/github/moduth/blockcanary/ui/DetailAdapter.java b/blockcanary-android/src/main/java/com/github/moduth/blockcanary/ui/DetailAdapter.java index 46282e7..679ef18 100644 --- a/blockcanary-android/src/main/java/com/github/moduth/blockcanary/ui/DetailAdapter.java +++ b/blockcanary-android/src/main/java/com/github/moduth/blockcanary/ui/DetailAdapter.java @@ -16,7 +16,7 @@ package com.github.moduth.blockcanary.ui; import android.content.Context; -import android.text.Html; +import android.support.v4.text.HtmlCompat; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -63,7 +63,7 @@ public View getView(int position, View convertView, ViewGroup parent) { if (isThreadStackEntry && !mFoldings[position]) { htmlString += " " + "blocked" + ""; } - textView.setText(Html.fromHtml(htmlString)); + textView.setText(HtmlCompat.fromHtml(htmlString, HtmlCompat.FROM_HTML_MODE_LEGACY)); DisplayConnectorView connectorView = findById(convertView, R.id.__leak_canary_row_connector); connectorView.setType(connectorViewType(position)); diff --git a/blockcanary-android/src/main/java/com/github/moduth/blockcanary/ui/DisplayActivity.java b/blockcanary-android/src/main/java/com/github/moduth/blockcanary/ui/DisplayActivity.java index 7a1bf5f..28bdfc6 100644 --- a/blockcanary-android/src/main/java/com/github/moduth/blockcanary/ui/DisplayActivity.java +++ b/blockcanary-android/src/main/java/com/github/moduth/blockcanary/ui/DisplayActivity.java @@ -291,7 +291,7 @@ public void onClick(View v) { } }); adapter.update(blockInfo); - setTitle(getString(R.string.block_canary_class_has_blocked, blockInfo.timeCost)); + setTitle(getString(R.string.block_canary_class_has_blocked, Long.toString(blockInfo.timeCost))); } private BlockInfoEx getBlock(String startTime) { @@ -342,7 +342,7 @@ public View getView(int position, View convertView, ViewGroup parent) { String keyStackString = BlockCanaryUtils.concernStackString(blockInfo); String title = index + keyStackString + " " + - getString(R.string.block_canary_class_has_blocked, blockInfo.timeCost); + getString(R.string.block_canary_class_has_blocked, Long.toString(blockInfo.timeCost)); titleView.setText(title); String time = DateUtils.formatDateTime(DisplayActivity.this, blockInfo.logFile.lastModified(), FORMAT_SHOW_TIME | FORMAT_SHOW_DATE); diff --git a/blockcanary-android/src/main/res/values-v14/themes.xml b/blockcanary-android/src/main/res/values-v14/themes.xml deleted file mode 100644 index 0f875ae..0000000 --- a/blockcanary-android/src/main/res/values-v14/themes.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/blockcanary-sample/src/main/java/com/example/blockcanary/DemoActivity.java b/blockcanary-sample/src/main/java/com/example/blockcanary/DemoActivity.java index 975ea56..2853f9c 100644 --- a/blockcanary-sample/src/main/java/com/example/blockcanary/DemoActivity.java +++ b/blockcanary-sample/src/main/java/com/example/blockcanary/DemoActivity.java @@ -16,12 +16,10 @@ package com.example.blockcanary; import android.os.Bundle; -import android.support.design.widget.FloatingActionButton; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.view.Menu; import android.view.MenuItem; -import android.view.View; public class DemoActivity extends AppCompatActivity { diff --git a/blockcanary-sample/src/main/java/com/example/blockcanary/DemoFragment.java b/blockcanary-sample/src/main/java/com/example/blockcanary/DemoFragment.java index 31f0e02..fd67490 100644 --- a/blockcanary-sample/src/main/java/com/example/blockcanary/DemoFragment.java +++ b/blockcanary-sample/src/main/java/com/example/blockcanary/DemoFragment.java @@ -17,6 +17,7 @@ import android.os.Build; import android.os.Bundle; +import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.util.Log; @@ -48,7 +49,7 @@ public View onCreateView(final LayoutInflater inflater, final ViewGroup containe } @Override - public void onViewCreated(final View view, @Nullable final Bundle savedInstanceState) { + public void onViewCreated(@NonNull final View view, @Nullable final Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); Button button1 = view.findViewById(R.id.button1); Button button2 = view.findViewById(R.id.button2); @@ -61,11 +62,6 @@ public void onViewCreated(final View view, @Nullable final Bundle savedInstanceS button4.setOnClickListener(this); } - @Override - public void onDestroyView() { - super.onDestroyView(); - } - @Override public void onActivityCreated(@Nullable final Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); diff --git a/blockcanary-sample/src/main/res/drawable/background_splash.xml b/blockcanary-sample/src/main/res/drawable/background_splash.xml deleted file mode 100644 index 8ecd5eb..0000000 --- a/blockcanary-sample/src/main/res/drawable/background_splash.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/blockcanary-sample/src/main/res/layout/activity_main.xml b/blockcanary-sample/src/main/res/layout/activity_main.xml index 35d7ff9..d5dabb8 100644 --- a/blockcanary-sample/src/main/res/layout/activity_main.xml +++ b/blockcanary-sample/src/main/res/layout/activity_main.xml @@ -12,7 +12,6 @@ - - 16dp - 16dp - 0dp 48dp - 48dp - 0.5dp diff --git a/build.gradle b/build.gradle index 9b119f6..a1b7f03 100644 --- a/build.gradle +++ b/build.gradle @@ -19,7 +19,6 @@ allprojects { } ext { LIBRARY_COMPILE_SDK_VERSION = 28 - LIBRARY_BUILD_TOOLS_VERSION = "28.0.3" LIBRARY_MIN_SDK_VERSION = 16 LIBRARY_TARGET_SDK_VERSION = 28 } From 2e34405a6bce554888afa28e3b0f51fb7c3c1d2d Mon Sep 17 00:00:00 2001 From: 1951FDG <1951FDG@users.noreply.github.com> Date: Mon, 12 Aug 2019 21:55:42 +0200 Subject: [PATCH 25/30] Catch all inspection warnings available --- blockcanary-analyzer/build.gradle | 3 +++ blockcanary-android-no-op/build.gradle | 3 +++ blockcanary-android/build.gradle | 3 +++ blockcanary-sample/build.gradle | 3 +++ build.gradle | 5 +++++ 5 files changed, 17 insertions(+) diff --git a/blockcanary-analyzer/build.gradle b/blockcanary-analyzer/build.gradle index a19d27f..f7a50e6 100644 --- a/blockcanary-analyzer/build.gradle +++ b/blockcanary-analyzer/build.gradle @@ -16,6 +16,9 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + lintOptions { + checkAllWarnings true + } } dependencies { diff --git a/blockcanary-android-no-op/build.gradle b/blockcanary-android-no-op/build.gradle index a19d27f..f7a50e6 100644 --- a/blockcanary-android-no-op/build.gradle +++ b/blockcanary-android-no-op/build.gradle @@ -16,6 +16,9 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + lintOptions { + checkAllWarnings true + } } dependencies { diff --git a/blockcanary-android/build.gradle b/blockcanary-android/build.gradle index 58ae0fe..2dd1117 100644 --- a/blockcanary-android/build.gradle +++ b/blockcanary-android/build.gradle @@ -16,6 +16,9 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + lintOptions { + checkAllWarnings true + } } dependencies { diff --git a/blockcanary-sample/build.gradle b/blockcanary-sample/build.gradle index 40d05ac..ec173be 100644 --- a/blockcanary-sample/build.gradle +++ b/blockcanary-sample/build.gradle @@ -16,6 +16,9 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + lintOptions { + checkAllWarnings true + } } dependencies { diff --git a/build.gradle b/build.gradle index a1b7f03..17bc182 100644 --- a/build.gradle +++ b/build.gradle @@ -22,4 +22,9 @@ allprojects { LIBRARY_MIN_SDK_VERSION = 16 LIBRARY_TARGET_SDK_VERSION = 28 } + gradle.projectsEvaluated { + tasks.withType(JavaCompile) { + options.compilerArgs << "-Xlint:deprecation" + } + } } From f46805d977f1e67c48f6761a28d6e951734d44ae Mon Sep 17 00:00:00 2001 From: 1951FDG <1951FDG@users.noreply.github.com> Date: Mon, 12 Aug 2019 21:55:56 +0200 Subject: [PATCH 26/30] Add JitPack --- build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle b/build.gradle index 17bc182..a694c31 100644 --- a/build.gradle +++ b/build.gradle @@ -13,6 +13,7 @@ buildscript { allprojects { repositories { + maven { url 'https://jitpack.io' } mavenCentral() jcenter() google() From c682b9a0ca5919b528bc895ba8fd9591c8712a44 Mon Sep 17 00:00:00 2001 From: 1951FDG <1951FDG@users.noreply.github.com> Date: Wed, 25 Sep 2019 14:55:30 +0200 Subject: [PATCH 27/30] Update to AndroidX, Android Studio 3.5 --- blockcanary-analyzer/build.gradle | 2 +- blockcanary-android-no-op/build.gradle | 2 +- blockcanary-android/build.gradle | 4 ++-- .../moduth/blockcanary/DisplayService.java | 2 +- .../moduth/blockcanary/ui/DetailAdapter.java | 2 +- blockcanary-sample/build.gradle | 6 +++--- .../com/example/blockcanary/DemoActivity.java | 4 ++-- .../com/example/blockcanary/DemoFragment.java | 6 +++--- build.gradle | 6 +++--- gradle.properties | 2 ++ gradle/wrapper/gradle-wrapper.jar | Bin 55190 -> 55616 bytes gradle/wrapper/gradle-wrapper.properties | 3 +-- gradlew | 18 +++++++++++++++++- gradlew.bat | 18 +++++++++++++++++- 14 files changed, 54 insertions(+), 21 deletions(-) diff --git a/blockcanary-analyzer/build.gradle b/blockcanary-analyzer/build.gradle index f7a50e6..5e17a87 100644 --- a/blockcanary-analyzer/build.gradle +++ b/blockcanary-analyzer/build.gradle @@ -13,7 +13,7 @@ android { buildTypes { release { minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } lintOptions { diff --git a/blockcanary-android-no-op/build.gradle b/blockcanary-android-no-op/build.gradle index f7a50e6..5e17a87 100644 --- a/blockcanary-android-no-op/build.gradle +++ b/blockcanary-android-no-op/build.gradle @@ -13,7 +13,7 @@ android { buildTypes { release { minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } lintOptions { diff --git a/blockcanary-android/build.gradle b/blockcanary-android/build.gradle index 2dd1117..2163bf1 100644 --- a/blockcanary-android/build.gradle +++ b/blockcanary-android/build.gradle @@ -13,7 +13,7 @@ android { buildTypes { release { minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } lintOptions { @@ -25,5 +25,5 @@ dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) api project(':blockcanary-analyzer') //implementation 'com.github.markzhai:blockcanary-analyzer:1.5.0' - implementation 'com.android.support:support-compat:28.0.0' + implementation 'androidx.core:core:1.0.0' } diff --git a/blockcanary-android/src/main/java/com/github/moduth/blockcanary/DisplayService.java b/blockcanary-android/src/main/java/com/github/moduth/blockcanary/DisplayService.java index b9c672f..26d4426 100644 --- a/blockcanary-android/src/main/java/com/github/moduth/blockcanary/DisplayService.java +++ b/blockcanary-android/src/main/java/com/github/moduth/blockcanary/DisplayService.java @@ -20,7 +20,7 @@ import android.app.PendingIntent; import android.content.Context; import android.content.Intent; -import android.support.v4.app.NotificationCompat; +import androidx.core.app.NotificationCompat; import com.github.moduth.blockcanary.internal.BlockInfo; import com.github.moduth.blockcanary.ui.DisplayActivity; diff --git a/blockcanary-android/src/main/java/com/github/moduth/blockcanary/ui/DetailAdapter.java b/blockcanary-android/src/main/java/com/github/moduth/blockcanary/ui/DetailAdapter.java index 679ef18..353f67b 100644 --- a/blockcanary-android/src/main/java/com/github/moduth/blockcanary/ui/DetailAdapter.java +++ b/blockcanary-android/src/main/java/com/github/moduth/blockcanary/ui/DetailAdapter.java @@ -16,7 +16,7 @@ package com.github.moduth.blockcanary.ui; import android.content.Context; -import android.support.v4.text.HtmlCompat; +import androidx.core.text.HtmlCompat; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/blockcanary-sample/build.gradle b/blockcanary-sample/build.gradle index ec173be..ff480ec 100644 --- a/blockcanary-sample/build.gradle +++ b/blockcanary-sample/build.gradle @@ -13,7 +13,7 @@ android { buildTypes { release { minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } lintOptions { @@ -26,6 +26,6 @@ dependencies { debugImplementation project(':blockcanary-android') releaseImplementation project(':blockcanary-android-no-op') - implementation 'com.android.support:appcompat-v7:28.0.0' - implementation 'com.android.support:design:28.0.0' + implementation 'androidx.appcompat:appcompat:1.0.0' + implementation 'com.google.android.material:material:1.0.0' } diff --git a/blockcanary-sample/src/main/java/com/example/blockcanary/DemoActivity.java b/blockcanary-sample/src/main/java/com/example/blockcanary/DemoActivity.java index 2853f9c..958ae25 100644 --- a/blockcanary-sample/src/main/java/com/example/blockcanary/DemoActivity.java +++ b/blockcanary-sample/src/main/java/com/example/blockcanary/DemoActivity.java @@ -16,8 +16,8 @@ package com.example.blockcanary; import android.os.Bundle; -import android.support.v7.app.AlertDialog; -import android.support.v7.app.AppCompatActivity; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; import android.view.Menu; import android.view.MenuItem; diff --git a/blockcanary-sample/src/main/java/com/example/blockcanary/DemoFragment.java b/blockcanary-sample/src/main/java/com/example/blockcanary/DemoFragment.java index fd67490..f00961c 100644 --- a/blockcanary-sample/src/main/java/com/example/blockcanary/DemoFragment.java +++ b/blockcanary-sample/src/main/java/com/example/blockcanary/DemoFragment.java @@ -17,9 +17,9 @@ import android.os.Build; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; import android.util.Log; import android.view.LayoutInflater; import android.view.View; diff --git a/build.gradle b/build.gradle index a694c31..6ba40c1 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:3.4.2' + classpath 'com.android.tools.build:gradle:3.5.0' } } @@ -19,9 +19,9 @@ allprojects { google() } ext { - LIBRARY_COMPILE_SDK_VERSION = 28 + LIBRARY_COMPILE_SDK_VERSION = 29 LIBRARY_MIN_SDK_VERSION = 16 - LIBRARY_TARGET_SDK_VERSION = 28 + LIBRARY_TARGET_SDK_VERSION = 29 } gradle.projectsEvaluated { tasks.withType(JavaCompile) { diff --git a/gradle.properties b/gradle.properties index 98f4adf..2eab12f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,3 +17,5 @@ org.gradle.jvmargs=-Xmx8192M org.gradle.parallel=true org.gradle.daemon=true org.gradle.configureondemand=false +android.useAndroidX=true +android.enableJetifier=true diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 87b738cbd051603d91cc39de6cb000dd98fe6b02..5c2d1cf016b3885f6930543d57b744ea8c220a1a 100644 GIT binary patch delta 3320 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 Date: Wed, 25 Sep 2019 14:56:07 +0200 Subject: [PATCH 28/30] Increase number of times loop is run to ensure that on newer devices the threshold in ms is also exceeded --- .../src/main/java/com/example/blockcanary/DemoFragment.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blockcanary-sample/src/main/java/com/example/blockcanary/DemoFragment.java b/blockcanary-sample/src/main/java/com/example/blockcanary/DemoFragment.java index f00961c..7a0a035 100644 --- a/blockcanary-sample/src/main/java/com/example/blockcanary/DemoFragment.java +++ b/blockcanary-sample/src/main/java/com/example/blockcanary/DemoFragment.java @@ -79,7 +79,7 @@ public void onClick(View v) { } break; case R.id.button2: - for (int i = 0; i < 100; ++i) { + for (int i = 0; i < 200; ++i) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { readFile(); } @@ -99,7 +99,7 @@ public void onClick(View v) { private static double compute() { double result = 0; - for (int i = 0; i < 2000000; ++i) { + for (int i = 0; i < 4000000; ++i) { result += Math.acos(Math.cos(i)); result -= Math.asin(Math.sin(i)); } From aabd17268f58b53c57c746820d8d8a4242ff0009 Mon Sep 17 00:00:00 2001 From: 1951FDG <1951FDG@users.noreply.github.com> Date: Wed, 25 Sep 2019 15:15:52 +0200 Subject: [PATCH 29/30] Fix some inspection warnings --- .../java/com/github/moduth/blockcanary/internal/NetUtils.java | 1 + blockcanary-android/build.gradle | 3 ++- .../main/java/com/github/moduth/blockcanary/BlockCanary.java | 2 +- blockcanary-sample/build.gradle | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/internal/NetUtils.java b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/internal/NetUtils.java index b3ad2cd..448ce67 100644 --- a/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/internal/NetUtils.java +++ b/blockcanary-analyzer/src/main/java/com/github/moduth/blockcanary/internal/NetUtils.java @@ -5,6 +5,7 @@ import android.net.NetworkInfo; import android.telephony.TelephonyManager; +@SuppressWarnings({ "deprecation", "RedundantSuppression" }) public class NetUtils { /** * 没有网络连接 diff --git a/blockcanary-android/build.gradle b/blockcanary-android/build.gradle index 2163bf1..11764b3 100644 --- a/blockcanary-android/build.gradle +++ b/blockcanary-android/build.gradle @@ -25,5 +25,6 @@ dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) api project(':blockcanary-analyzer') //implementation 'com.github.markzhai:blockcanary-analyzer:1.5.0' - implementation 'androidx.core:core:1.0.0' + implementation 'androidx.core:core:1.1.0' + implementation "androidx.preference:preference:1.1.0" } diff --git a/blockcanary-android/src/main/java/com/github/moduth/blockcanary/BlockCanary.java b/blockcanary-android/src/main/java/com/github/moduth/blockcanary/BlockCanary.java index a0b93f1..e80d322 100644 --- a/blockcanary-android/src/main/java/com/github/moduth/blockcanary/BlockCanary.java +++ b/blockcanary-android/src/main/java/com/github/moduth/blockcanary/BlockCanary.java @@ -23,7 +23,7 @@ import android.graphics.Color; import android.os.Build; import android.os.Looper; -import android.preference.PreferenceManager; +import androidx.preference.PreferenceManager; import com.github.moduth.blockcanary.ui.DisplayActivity; diff --git a/blockcanary-sample/build.gradle b/blockcanary-sample/build.gradle index ff480ec..4606b24 100644 --- a/blockcanary-sample/build.gradle +++ b/blockcanary-sample/build.gradle @@ -26,6 +26,6 @@ dependencies { debugImplementation project(':blockcanary-android') releaseImplementation project(':blockcanary-android-no-op') - implementation 'androidx.appcompat:appcompat:1.0.0' + implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'com.google.android.material:material:1.0.0' } From b249897d22dd48a02430c1e17ad81171da34fa56 Mon Sep 17 00:00:00 2001 From: guyc Date: Mon, 19 Aug 2019 16:33:25 +0800 Subject: [PATCH 30/30] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/build.gradle b/build.gradle index 6ba40c1..f3e8219 100644 --- a/build.gradle +++ b/build.gradle @@ -29,3 +29,7 @@ allprojects { } } } + +task clean(type: Delete) { + delete rootProject.buildDir +}