Android應用開發中如何使用隱藏的API
Android應用中有時為了實現某些特殊的功能或效果,往往需要使用一些谷歌隱藏的API(加有@hide標記的public類、方法或常量),例如PolicyManager。
使用Android隱藏的API主要有兩種辦法:1.利用Java反射機制,使用反射的方法得到隱藏API;2.使用原始碼編譯時生成的全編譯過的classes.jar包。
舉例說明,下面的程式碼如果直接使用會報錯。
mWindowManager = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);
mWindow = PolicyManager.makeNewWindow(mContext);
mWindow.setWindowManager(mWindowManager, null, null);
1,使用Java反射機制,改為以下程式碼,就可以正常使用了。
mWindowManager = (WindowManager) mContext
.getSystemService(Context.WINDOW_SERVICE);
// using reflect mechanism to invoke hide api
String POLICYMANAGER_CLASS_NAME = "com.android.internal.policy.PolicyManager";
try {
Class policyClass;
policyClass = Class.forName(POLICYMANAGER_CLASS_NAME);
Log.i(TAG, policyClass.toString());
Method meths[] = policyClass.getMethods();
Method makenewwindow = null;
// Method makenewwindow = policyClass.getMethod("makeNewWindow");
for (int i = 0; i < meths.length; i++) {
if (meths[i].getName().endsWith("makeNewWindow"))
makenewwindow = meths[i];
}
Log.i(TAG, makenewwindow.toString());
mWindow = (Window) makenewwindow.invoke(null, mContext);
} catch (Exception e) {
e.printStackTrace();
}
mWindow.setWindowManager(mWindowManager, null, null);
2,如果不想修改程式碼,就需要使用第二種方法:匯入全編譯的classes.jar包。編譯Android框架原始碼後,將生成全編譯的classes.jar匯入到工程中。使用Eclipse,Android工程新增library(BuildPath -> Add Libraries->User Library->New User Library),將.jar檔案加入新增到library,同時勾選“SystemLibrary”選項,以避免產生“java.lang.OutOfMemoryError:Java
Heap Space”錯誤。如果已經正確匯入了jar庫,卻仍然找不到隱藏的API。原因可能是Buildclass path order不正確,即android.jar和classes.jar的匯入順序不對,具體調節Buildclass path order,選擇Build Path-> Config Build Path->Order and Export,調整自定義的library與android.jar的順序。
此時,本文最開始的那段程式碼不需要再做改動就可以生效了。
利用反射機制使用隱藏API的方法優點是靈活,能夠在不相容的系統捕獲異常,而使程式不至於崩潰;缺點是過程太繁雜,而且對於隱藏類的繼承等很難實現。如果需要大量使用隱藏API,使用反射無疑會讓人厭煩。
通過匯入全編譯的classes.jar包來實現對隱藏API的使用方法簡單,容易程式設計,就像是那些隱藏的API在SDK中變得可見了一樣,其缺點就是相容性問題,希望使用者引起重視。
兩種方法各有利弊,請大家斟酌使用。一般來說,谷歌設定隱藏API的主要原因在於Android系統本身還在不斷的進化發展中,這些API可能還不夠成熟、穩定。因此除非特殊情況,應儘量減少對隱藏API的使用。
Ref: http://zhmeup.iteye.com/blog/1119503
相關文章
- 隱藏域在Ajax中的應用
- 突破Android P(Preview 1)對呼叫隱藏API限制的方法AndroidViewAPI
- Android應用方法隱藏及反除錯技術淺析Android除錯
- Mac使用手冊:如何開啟Mac電腦中隱藏的資源庫Mac
- API開發中如何使用限速應對大規模訪問API
- 榮耀手機怎麼隱藏應用?華為手機EMUI顯示、隱藏應用方法UI
- 如何使用Funter檔案隱藏工具
- Java開發中POJO和JSON互轉時如何忽略隱藏欄位JavaPOJOJSON
- 前沿探索|AI 在 API 開發測試中的應用AIAPI
- Android開發中API層的最佳實踐AndroidAPI
- 如何使用電商API介面API介面如何應用API
- 在 Laravel 中動態 隱藏 / 顯示 API 欄位LaravelAPI
- Android 隱藏手機鍵盤Android
- Android Jetpack - Android TV 應用開發教程AndroidJetpack
- HarmonyOS NEXT應用開發案例——滑動頁面資訊隱藏與元件位移效果元件
- OSX中隱藏和顯示[隱藏檔案]的命令列命令列
- 教你如何使用Solitude評估應用程式中的使用者隱私問題
- win10隱藏磁碟怎麼檢視 win10如何開啟隱藏的磁碟Win10
- Android應用開發進階Android
- 開發Android系統應用Android
- .NET 5 中的隱藏特性
- Android 隱藏系統狀態列Android
- Android示例應用:開源框架Glide的使用Android框架IDE
- 如何在HTTP頭中隱藏PHP版本號HTTPPHP
- [譯]探索Kotlin中隱藏的效能開銷-Part 2Kotlin
- [譯]探索Kotlin中隱藏的效能開銷-Part 1Kotlin
- Android 眼睛 顯示隱藏密碼(ImageView)Android密碼View
- 聊聊React中的隱藏彩蛋功能React
- 如何自動實現本地AD中禁用的使用者從地址列表中隱藏掉?
- 用終端開啟macOS系統隱藏功能Mac
- 如何在 Android 專案中應用 OpenCV?AndroidOpenCV
- win10如何顯示隱藏資料夾 win10開啟隱藏資料夾的方法Win10
- Android開發教程-使用DataBinding(六)RecyclerViewAdapter中的使用AndroidViewAPT
- uni-app&H5&Android混合開發二 || 使用Android Studio打包應用APKAPPH5AndroidAPK
- 使用擴充套件技術將SAP Fiori應用隱藏動態建立的UI欄位套件UI
- Win10不使用的字型怎麼隱藏 win10隱藏不使用字型的教程Win10
- 運用Kotlin開發Android應用的一些技巧KotlinAndroid
- [譯] 如何在 Android 開發中充分利用多攝像頭 APIAndroidAPI