編輯:關於android開發
這兩天老大發話說要我研究一下安卓安全軟件的功能,先抽取了一個小模塊,研究權限管理
一開始就去packagemanager 去看發現有幾個方法:
就先去看了一下IPackagemanager 裡面的方法:
有很多 這裡我之列出跟權限有關的
PermissionInfo getPermissionInfo(String name, int flags); List<PermissionInfo> queryPermissionsByGroup(String group, int flags); PermissionGroupInfo getPermissionGroupInfo(String name, int flags); List<PermissionGroupInfo> 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<AppOpsManager.PackageOps> getPackagesForOps(in int[] ops); List<AppOpsManager.PackageOps> 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的方式來設置狀態,
可以通過包名獲取權限
也可以通過權限獲取包名
更重要的是返回權限不是全部的 會根據級別 系統寫好的返回給你
你可以根據權限做個分級,這一切就明朗了
自定義控件——開關按鈕ToggleButton,控件togglebutton 實現一個類似於ToggleButton的開關按鈕 效果圖: 資源圖片:
UI設計師不可不知的android屏幕知識,uiandroid北京尚學堂提供 不少設計師和工程師都被安卓設備紛繁的屏幕搞得暈頭轉向,我既做UI設計,也做過一點安卓界面布局
TabLayout + ViewPager,tablayoutviewpager一、實現思路 1、在build.gradle中添加依賴,例如: compile com.
Android 自定義控件的使用,android自定義控件首先自定義一個attrs.xml的資源文件,聲明自定義屬性 <?xml version=1.0 enco