編輯:關於Android編程
這兩天老大發話說要我研究一下安卓安全軟件的功能,先抽取了一個小模塊,研究權限管理
一開始就去packagemanager 去看發現有幾個方法:
就先去看了一下IPackagemanager 裡面的方法:
有很多 這裡我之列出跟權限有關的
PermissionInfo getPermissionInfo(String name, int flags);
List queryPermissionsByGroup(String group, int flags);
PermissionGroupInfo getPermissionGroupInfo(String name, int flags);
List getAllPermissionGroups(int flags);
int checkPermission(String permName, String pkgName);
int checkUidPermission(String permName, int uid);
boolean addPermission(in PermissionInfo info);
void removePermission(String name);
void grantPermission(String packageName, String permissionName);
void revokePermission(String packageName, String permissionName);
String[] getAppOpPermissionPackages(String permissionName);
ParceledListSlice getPackagesHoldingPermissions(in String[] permissions,
int flags, int userId);
boolean addPermissionAsync(in PermissionInfo info);
void setPermissionEnforced(String permission, boolean enforced);
看安全軟件上的功能:
通過包名找權限
通過權限找包名
禁用 提示 允許 三種狀態
首先:就發現了2個方法:
void removePermission(String name); void grantPermission(String packageName, String permissionName);
我很高興的就開始寫代碼了 測試結果: java.lang.SecurityException: Can't change android.permission.INTERNET. It is required by the application 一直報這個錯 查看源碼其實查到了是需要檢查權限,源碼就不貼了,想要繞過檢查這個方法,可以通過hook的方式,猜測把源碼修改一下也可以用,目前這種方案先放棄。
我又去網上查了一部分資料:看到這個類AppOpsManager 我就明白了 我找到相應的服務端代碼IAppOpsService:
interface IAppOpsService {
// These first methods are also called by native code, so must
// be kept in sync with frameworks/native/include/binder/IAppOpsService.h
int checkOperation(int code, int uid, String packageName);
int noteOperation(int code, int uid, String packageName);
int startOperation(IBinder token, int code, int uid, String packageName);
void finishOperation(IBinder token, int code, int uid, String packageName);
void startWatchingMode(int op, String packageName, IAppOpsCallback callback);
void stopWatchingMode(IAppOpsCallback callback);
IBinder getToken(IBinder clientToken);
// Remaining methods are only used in Java.
int checkPackage(int uid, String packageName);
List getPackagesForOps(in int[] ops);
List getOpsForPackage(int uid, String packageName, in int[] ops);
void setMode(int code, int uid, String packageName, int mode);
void resetAllModes(int reqUserId, String reqPackageName);
int checkAudioOperation(int code, int usage, int uid, String packageName);
void setAudioRestriction(int code, int usage, int uid, int mode, in String[] exceptionPackages);
void setUserRestrictions(in Bundle restrictions, int userHandle);
void removeUser(int userHandle);
}
它通過mode的方式來設置狀態,
可以通過包名獲取權限
也可以通過權限獲取包名
更重要的是返回權限不是全部的 會根據級別 系統寫好的返回給你
你可以根據權限做個分級,這一切就明朗了
Android編譯系統
本文的目的是用比較容易理解的方式,介紹一下整個Android項目的編譯。至少知道大概的編譯流程是怎麼樣的,項目裡面的Android.mk文件包含些什麼內容。makefil
Android4.X中SIM卡信息初始化過程詳解
本文實例講述了Android4.X中SIM卡信息初始化過程詳解。分享給大家供大家參考,具體如下:Phone 對象初始化的過程中,會加載SIM卡的部分數據信息,這些信息會保
[Android基礎系列]設計模式(一)
前言 這篇文章可以說是java基礎的范疇,為了下一篇Android開發中的常用設計模式做一下鋪墊,也順便反思一下。 正文 設計模式分類 分類方式是多樣的,
Android Studio NDK基礎使用
NDK是什麼?Android平台是基於java實現,運行於虛擬機Dalvik;故而使用Android SDK創建應用程序需要使用java語言來編寫實現。不過並不僅限於使用
Android從零開搞系列:自定義View(6)ScrollTo+ScrollBy+Scroller+NestedScrolling機制(上)
本菜開源的一個自己寫的Demo,希望能給Androider們有所幫助,