connglli / ELEGANT

ELEGANT - a tool to Effectively LocatE fraGmentAtion-iNduced compaTibility issues.
MIT License
3 stars 0 forks source link

weekly report: 2017.08.16-2017.08.22 #3

Closed connglli closed 6 years ago

connglli commented 6 years ago

周报

2017.08.16 ~ 2017.08.22

工作概述

同上周计划所述,本周的主要工作集中于 Model 的粗提取和第一步精提取,以下是 Model 提取的信息。

Model的提取 - 1.1.2

Model Api-Context 表格

以下表格列出了我对大部分 Issue 的分析,其中并没有包含太多 OS 和 Driver 相关的 Issue,因为这些偏底层,有些代码一时半会也不太好理解。

#issue API Context
1 activity.onBackPressed API level 5 支持
2 activity.getActionBar API level 11 支持
3 listView. setOverScrollMode API level 9 支持
4 menuItem.setShowAsAction API level 11 支持
5 activity.invalidateOptionsMenu API level 11 支持
6 activity.invalidateOptionsMenu API level 11 支持
7 setFocusableInTouchMode/setFocusable API level 8 以下最好同时使用,否则容易造成焦点损失,但仍能接受键盘事件的问题
8 <input /> or <textarea /> in WebView API level 8 以下无法使得它们唤起 softkeyboard
9 TextView API level 10 以上默认不可选中
10 sqliteDatabase.disableWriteAheadLogging API level 16 支持
11 activity.overridePendingTransition API level 5 支持
12 MediaRecord.AudioEncoder.AMR_WB API level 10 支持
13.1 SQLiteDatabase.openDatabase API level 11 起支持自定义错误处理
13.2 DatabaseErrorHandler API level 11 支持
14 radioButton.setText API level 17 以下会出现覆盖
27 ContentProvider CURD操作(query, update, delete, insert, bulkInsert) API level 23 及以上访问不受权限控制
28 textToSpeech.setOnUtteranceProgressListener API level 15 支持
29 Normalizer API level 9 支持
30 view.setScrollbarFadingEnabled API level 5 支持
31 View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY API level 19 支持
32 CookieSyncManager API level 21 废弃,应该使用 CookieManager
33 AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT/OPTION_APPWIDGET_MIN_WIDTH API level 16 支持
35 keyboardView.invalidateAllKeys API level 4 支持
53 PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT API level 8 支持
54 Intent.EXTRA_REMOTE_INTENT_TOKEN API level 5 支持
55 handlerThread.quit API level 5 支持
56 arlarmManager.setExact API level 19 支持
57 System.WIFI_SLEEP_POLICY, Settings.System.WIFI_SLEEP_POLICY_DEFAULT API level 17 废弃
58 AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE API level 17 支持
59 Camera 相关 API API level 5/8/9+ 支持不同
60 notification.contentView.setViewVisibiliy API level 8 才可用
61 contentResolver.insert() 任何 API 下都可能发生异常
62 cv.put(Data.RAW_CONTACT_ID, callerInfo.personId); HTC desire S 需要 ID 才能成功保存 log
63 keyCharacterMap.getNumber(keyCode) 有些平板不支持,如 Xoom ...
64 preferencesWrapper.setPreferenceBooleanValue(SipConfigManager.INTEGRATE_WITH_CALLLOGS, true); ‘Go Gear Connect' 设备不允许存储 CALLLOGS
66 preferencesWrapper.setPreferenceBooleanValue(PreferencesWrapper.KEEP_AWAKE_IN_CALL) HTC desire 和 Nexus One 需要设置为 true
87 audioManager.setRouting API level 4 被废弃
127 MenuItem.SHOW_AS_ACTION_WITH_TEXT API level 11 支持
128 ApplicationInfo.FLAG_EXTERNAL_STORAGE API level 8 支持
132 audioManager.requestAudioFocus API level 8 支持
133 audioManager.MODE_IN_COMMUNICATION API level 11 支持
134 Intent.ACTION_SEND_MULTIPLE API level 4 支持
135.1 Contants API level 5 废弃
135.2 ContactsContract API level 5 支持
136.1 Contants API level 5 废弃
136.2 ContactsContract API level 5 支持
137 BUILD.VERSION.SDK API level 4 废弃,应改用 BUILD.VERSION.SDK_INT
138 ConnectivityManager.getBackgroundDataSetting API level 3 支持,API level 14(ICS) 被废弃
139 uri.getQueryParameterNames API level 11 支持
141 sqlite.deleteDatabase API level 16 支持
142 AbsoluteSizeSpan API level 5 支持
143 Clipboard.setText API level 11 支持
144 PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH API level 7 支持
145.1 asyncTask.executeOnExecutor API level 11 支持
145.2 asyncTask.execute API level 3 支持
146 notification.setNumber HONEYCOMB 版本以上无法正常显示数据域
149 activity.getActionBar API level 11 支持
157 Contacts.ContactMethods API level 5 废弃
160 Notification.Builder API level 11 支持
161 activity.onBackPressed API level 5 支持
168 arrayAdapter.addAll API level 11 支持
169 arrayAdapter.addAll API level 11 支持
170 Build.CPU_ABI2 API level 8 支持
171 gridView.getNumColumns API level 11 支持
173 Environment.isExternalStorageRemovable API level 9 支持
174 context.getExternalCacheDir API level 8 支持
175 appWidgetManager.partiallyUpdateAppWidget API level 11 支持
176 display.getRotation API level 8 支持
179 BitmapFactory.Options.inBitmap API level 11 支持

备注

  1. #9 不应该作为 API ,而应该作为 System 特性之类的,因为这不是 API 引起的,而是从 API level 11 引入的可选中特性。
  2. #30 相关链接可以在这里找到。
  3. #51 给出的 issues 链接可能有误,应该是这个
  4. #52 根据commit描述,不应该归为 FIC issue。描述中说的是 KitKat 及以上版本默认的手势系统对于 AnySoftKeyboard 这个 App 来说不是很合适,但这应该不能归结为一个 FIC issue。
  5. #140 之所以位于 jdk 中的 Arrays 也会作为 Android FIC issues 出现,是因为:Android 为了提升性能,在内核中重新实现了 JVM 和 JDK,也正式因为这样,Oracle 才告 Google 侵权(知识产权,Oracle 认为 API 也是知识产权的一部分,Google 没有经过 Oracle 的同意就使用了 JDK 的 API ),也就造成了今天 Kotlin 成为了 Android 唯一的官方语言。
  6. #146 应该归结为 system bug (同[#147]()),这不是因为 API 更迭引起的,而是系统实现,所以作者的解决方案也是根据 系统版本 (而非 API)来进行数字的隐藏。
  7. #148 个人理解这是一种需求/功能的实现方式,虽然其中确有与版本相关的内容(有一个工厂方法来根据版本确定 TitleBarWebView 的类型),但这不应该算作 API 更迭引起的 FIC issue。
  8. #172/#177 给出的 commit hash 好像有问题...没搜到,其实 VLC 给出的链接好像都不怎么好用

Model 的提取 - 1.2

对上述提到的整个表格进行抽取后得到如下精简的表格

  1. [S]:suggested,建议
  2. [U]:unsuggested,不建议
# Context Api
1 API <= 3 audioManager.setRouting | BUILD.VERSION.SDK | asyncTask.execute
2 API >= 4 keyboardView.invalidateAllKeys | Intent.ACTION_SEND_MULTIPLE | BUILD.VERSION.SDK_INT
3 API <= 5 Contants
4 API >= 5 activity.onBackPressed | activity.overridePendingTransition | view.setScrollbarFadingEnabled | view.setScrollbarFadingEnabled | Intent.EXTRA_REMOTE_INTENT_TOKEN | handlerThread.quit | ContactsContract | AbsoluteSizeSpan
5 API >= 7 PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH
6 API < 8 ^ 一起使用 view.setFocusableInTouchMode & view.setFocusable
7 API >= 8 <input /> or <textarea /> in WebView | PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT | notification.contentView.setViewVisibiliy | ApplicationInfo.FLAG_EXTERNAL_STORAGE | audioManager.requestAudioFocus | Build. CPU_ABI2 | context.getExternalCacheDir | display.getRotation
8 API >= 9 listView. setOverScrollMode | Normalizer | Environment.isExternalStorageRemovable
9 API >= 10 MediaRecord.AudioEncoder.AMR_WB
10 API >= 11 activity.getActionBar | menuItem.setShowAsAction | activity.invalidateOptionsMenu | SQLiteDatabase.openDatabase | DatabaseErrorHandler | MenuItem.SHOW_AS_ACTION_WITH_TEXT | audioManager.MODE_IN_COMMUNICATION | uri.getQueryParameterNames | Clipboard.setText | asyncTask.executeOnExecutor | Notification.Builder | arrayAdapter.addAll | gridView.getNumColumns | appWidgetManager.partiallyUpdateAppWidget | BitmapFactory.Options.inBitmap
11 API >= 15 textToSpeech.setOnUtteranceProgressListener
12 API <= 16 System.WIFI_SLEEP_POLICY | Settings.System.WIFI_SLEEP_POLICY_DEFAULT
13 API >= 16 sqliteDatabase.disableWriteAheadLogging | AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT | AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH | sqlite.deleteDatabase
14 [S] API >= 16 radioButton.setText
15 API >= 17 AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE
16 API >= 19 View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | arlarmManager.setExact()
17 API < 21 CookieSyncManager
18 API >= 21 CookieManager
19 [S] API >= 23 ^ 做权限控制 ContentProvider.query | ContentProvider.update | ContentProvider.delete | ContentProvider.insert | ContentProvider.bulkInsert
20 API >= 3 ^ API < 14 ConnectivityManager.getBackgroundDataSetting
21 [U] any API contentResolver.insert
22 [U] BUILD.VERSION.SDK_INT < HONEYCOMB notification.setNumber
23 HTC desire ^ RAW_CONTACT_ID cv.put(Data.RAW_CONTACT_ID, callerInfo.personId)

小结

上表的分析同 Lily 学姐论文所述(数据也是从论文中取得的),FIC issues 中 Non-Device-Specific 的因素所占的比例更高,且在其中,API 更迭占的比重更高,但上表仍有以下几点不足值得继续修改:

  1. 对于原数据中的 Device-Specific 部分,有些代码难于理解,只能根据 BUILD.MODEL 或者 BUILD.DEVICE 来进行粗略判断,准确性有待提高,同时上表对于这种情况也亟待补充。
  2. 表格中所涉及 API 较多,大多 API 的使用均在官方文档有明确说明,所以不禁有这样的思考:既然引起 FIC issue 的问题占比最大的就是 API 更迭,那为何不对官方文档进行爬取,从而利用爬取到的 API 建立和废弃的信息进行 acpair 的建立?获取准确性将更高。