注意:本文的範例於 Android 8 (Oreo) 上已無法執行,而 Google 也表明為了改善應用程式的安全與穩定,未來將逐步限制這些非正規的存取方式。 如果您有研究過 Android Source Code,應該會發現其中有許多函式都被標註了 @hide。也就是這些函式在 SDK 中是被隱藏的,一般情形下無法被呼叫使用。但有時我們又想使用這些功能該怎麼辦呢? 在不更動 Android System 的前提下,我們可以透過 Java 的反射機制 (Java Reflection) 來達成。 範例: 我們在 Android Source Code 中的 PackageManager 類別裡發現了一個函式 getPackageSizeInfo,可以用來取得應用程式的磁碟空間使用量,但在 SDK 內卻找不到此函式。 我們先試著用 getMethods 列出 PackageManager 中所有的函式 PackageManager pm = getPackageManager(); Method[] methods = pm.getClass().getMethods(); for (int i = 0; i < methods.length; i++) { Log.d(TAG, methods[i].getName()); } 看一下結果,沒錯,裡面確實有 getPackageSizeInfo 這個函式 調用方式: Method getPackageSizeInfo = pm.getClass().getMethod( "getPackageSizeInfo", String.class, IPackageStatsObserver.class); getPackageSizeInfo.invoke(pm, "xxx.xxx.xxx", new IPackageStatsObserver.Stub() { @Override public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) throws RemoteExc
留言
張貼留言