android 添加安装权限白名单
點擊打開鏈接
有些項目不允許所有APK都擁有安裝權限,例如apk只能通過應用商城來安裝或者升級,只允許某些特定的apk自升級,不允許pm install等。這就需要添加安裝權限白名單來控制。
1、packageManagerService修改
安裝肯定繞不開packageManagerService,我們在其中添加幾個接口及代碼來控制apk安裝。
1)增加以下函數:
/*add for installer white list*/private boolean isInstallerEnable(String packagename){ArrayList<String> whiteListApp = new ArrayList<String>();try{BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("/system/etc/WhiteListAppFilter.properties")));String line ="";while ((line = br.readLine()) != null){whiteListApp.add(line);}br.close();}catch(java.io.FileNotFoundException ex){return false;}catch(java.io.IOException ex){return false;}Iterator<String> it = whiteListApp.iterator();while (it.hasNext()) {String whitelisItem = it.next();if (whitelisItem.equals(packagename)) {return true;}}return false;}- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
isInstallerEnable函數會去讀取白名單文件/system/etc/WhiteListAppFilter.properties,然后和我們傳進來的包名進行匹配,在白名單中返回true,其他情況均返回false。
2)獲取調用的包名?
這個可以在installPackageWithVerificationAndEncryption函數中來獲取,
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
接下來要在installPackageLI函數對調用安裝的apk進行匹配,判斷是否在白名單中,如果不在的話則提示錯誤,錯誤碼是-xxx(自己定義),這個錯誤碼會給packageInstaller,packageInstaller中需要做什么,就由自己定義了。
//add for installer white listboolean caninstall =false;if(mCallingApp != null && isInstallerEnable(mCallingApp)){caninstall = true;}if(!caninstall){Toast.makeText(mContext, R.string.install_error, Toast.LENGTH_LONG).show();res.returnCode = -xxx;return;}//endif (DEBUG_INSTALL) Slog.d(TAG, "installPackageLI: path=" + tmpPackageFile);// Retrieve PackageSettings and parse packageint parseFlags = mDefParseFlags | PackageParser.PARSE_CHATTY| (forwardLocked ? PackageParser.PARSE_FORWARD_LOCK : 0)| (onSd ? PackageParser.PARSE_ON_SDCARD : 0);...省略- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
3)?
/system/etc/WhiteListAppFilter.properties內容如下,在編譯時可以在mk中修改拷貝到etc目錄下,例如下面就是允許這三個包名有安裝權限。
com.xxx.xxx1?
com.xxx.xxx2?
com.xxx.xxx3
2、pm install的修改
上面說了,還要禁止pm install,因為有些APK安裝竟然是調用pm install命令去安裝的。。。。?
修改要在pm.java修改,修改方法和上面基本一致。?
可以看到,pm install其實調用的是run再去判斷參數。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
那我們要添加的話,先獲取app名,再和packageManagerService一樣,增加isInstallerEnable去判斷是不是要調用runInstall()就OK了。
String callingApp = "";try {callingApp = mPm.getNameForUid(Binder.getCallingUid());} catch(RemoteException re) {Log.e("Pm", Log.getStackTraceString(new Throwable())); }- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
總結
以上是生活随笔為你收集整理的android 添加安装权限白名单的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android的开机流程及对应源码位置分
- 下一篇: 修改Linux内核的printk缓冲区(