优秀不是偶然的,evernote 内嵌有 google analytics 分析器,一博内嵌有友盟分析器。几款口碑不错的 android 应用软件都有分析器。就来学习一下 evernote 是如何利用分析器的。
Evernote 记录的机器信息:
IsTablet: 根据屏幕尺寸和分辨率来判断设备是否具备 Tablet 能力
Locale: java.util.Locale.getDefault().toString()
Service: commerce_service
Package: AndroidManifest.xml 中定义的 package
Brand: android.os.Build.BRAND
Model: android.os.Build.MODEL
Network operator: TelephonyManager.getNetworkOperator() + " / " + TelephonyManager.getNetworkOperatorName()
Android version: android.os.Build.VERSION.RELEASE
Evernote version: AndroidManifest.xml 中定义的 android:versionName
Evernote revision: Enum.REVISION=unknown
Evernote type: Enum.BUILD_TYPE=public
Internal storage: StatFs.getBlockSize*getAvailableBlocks
External storage: StatFs.getBlockSize*getAvailableBlocks
SDCardStatus: SD
反馈crash报告:Android应用如何反馈Crash报告
(1)主线程中设置处理程序,DefaultExceptionHandler
(2)在主Activity的onCreate(Bundle savedInstanceState) 方法中增加代码
Thread.setDefaultUncaughtExceptionHandler(new DefaultExceptionHandler( this.getApplicationContext() ));
evernote 处理异常:
(1)全局处理 Thread.UncaughtExceptionHandler 的实现
(2)StackTraceElement 中包含com.google.android.apps.analytics了就交给 GoogleAnalytics 处理
(3)异常及处理类型:
- CrashHandler
- NullPointerException
- restartEvernote
- IndexOutOfBoundsException
- SecurityException
- IllegalStateException
- OtherException
(4)日志:slf4j
(5)analytics 记录或发送的 evernote 内容
- category: Exception
- action: Evernote
- label: NullPointerException
- value: 0
(6)analytics 完整的记录
- id
- random
- timestampCurrent
- timestampPrevious
- timestampFirst
- visits: 访问次数
- value:
- category
- action
- label
- screen_width:
- screen_height:
(7)analytics 保存
- google_analytics.db
- GoogleAnalyticsTracker 大于1000条后不再保存
- 删除原来的 hits 记录
(8)发送
- org.apache.http.message.BasicHttpEntityEnclosingRequest
- POST
Evernote 使用举例:
(1)创建新的笔记本:createBusinessNotebook
调用:log("Generic", "businessNotebookCreated", label, 0)
label内容:
- content://com.evernote.evernoteprovider
- linkednotebooks
- guid: UUID.randomUUID()
- notebook_guid: UUID.randomUUID()
- share_name
- user_name: null
- usn: 0
- dirty: true
- sync_mode: 1
- business_id: 0
- stack:
- uploaded: 0
- permissions: 2304
交给 google analystics 的 action
Class | category | action | label | value |
ExceptionHandler | Exception | Evernote | CrashHandler | 0 |
Exception | Evernote | NullPointerException | 0 | |
Exception | Evernote | restartEvernote | 0 | |
Exception | Evernote | IndexOutOfBoundsException | 0 | |
Exception | Evernote | SecurityException | 0 | |
Exception | Evernote | IllegalStateException | 0 | |
Exception | Evernote | OtherException | 0 | |
BillingActivity | Generic | BillingActivity | Billing pending | 0 |
Generic | BillingActivity | Billing already purchased | 0 | |
BillingService | Generic | BillingActivity | Evernote server returned successful response code | 0 |
Generic | BillingActivity | Evernote server returned error response code | 0 | |
Generic | BillingActivity | Evernote server returned un-successful response code | 0 | |
Generic | BillingActivity | Exception occurred while communication with evernote server,setting alarm | 0 | |
Generic | BillingActivity | Evernote server returned pending response code,setting alarm | 0 | |
EvernoteService | Generic | businessNotebookCreated | {Notebook} | 0 |
Login | failure | ... | 0 | |
Login | failure | exception | 0 | |
Login | failure | throwable | 0 | |
Login | reaunthenticate | success | 0 | |
Register | success | createUser | 0 | |
Register | failure | ... | 0 | |
Register | failureAll | ... | 0 | |
Register | failure | createUserEx | 0 | |
Login | login | success | 0 | |
Login | failure | ClientUnsupported | 0 | |
Login | login | failure | 0 | |
ResetPassword | failure | ... | 0 | |
Login | logout | success | 0 | |
SyncService | Exception | SyncService-updateQuota | quota-notification-95 | 0 |
Exception | SyncService-updateQuota | quota-notification-75 | 0 | |
Exception | SyncService-updateQuota | quota-notification-50 | 0 | |
FeatureDiscoveryPromo | ButtonClick | FeatureDiscoveryPromo | HidePromo | 1 |
ButtonClick | FeatureDiscoveryPromo | RemindLater | 1 | |
ButtonClick | FeatureDiscoveryPromo | ActivateButton | 1 | |
Generic | FeatureDiscoveryPromo | BackPressed | 1 | |
UserSetupActivity | Generic | setupUser | failure | 0 |
Generic | setupUser | alreadyPreactivated | 0 | |
Generic | setupUser | success | 0 | |
LandingActivity | Show | ... | ShowOneClickRegistration | 0 |
Register | failure | registrationUrls | 0 | |
Login | failureLoadingDialog | ... | 0 | |
Register | success | registration | 0 | |
RegistrationFragment | Show | PopulateCreateEmail | null | 0 |
Register | submit | attempt | 0 | |
Register | failure | emailValidation | 0 | |
Register | failure | emailExists | 0 | |
Register | failure | usernameValidation | 0 | |
Register | failure | usernameExists | 0 | |
Register | failure | passwordValidation | 0 | |
Register | failure | networkUnreachable | 0 | |
Register | checkUsername | success | 0 | |
Register | checkUsername | failure | 0 | |
Register | failure | registration | 0 |