今天有任务安排需要实现给任何一个应用在不动态申请权限的情况下,实现权限赋予,大体知道应用权限的赋予逻辑是在PMS中,于是大概研究了下,最终的手段就是在install安装时,就把应用程序AndroidManifest中请求的权限赋予它,但是时间有限,跟踪了下应用安装的逻辑,往上走还是非常复杂,就暂且放下了。

解决方案:

在PMS的grantPermissionsLPw方法中的if ((changedInstallPermission || replace) && !ps.installPermissionsFixed && !isSystemApp(ps) || isUpdatedSystemApp(ps)){   判断条件之前加上如下代码,其中的whiteList是自己定义的一个白名单数组,保存着目标应用的包名。

        if (Arrays.asList(whiteList).contains(pkg.packageName)) {final int permsSize = pkg.requestedPermissions.size();for (int i = 0; i < permsSize; i++) {final String name = pkg.requestedPermissions.get(i);final BasePermission bp = mSettings.mPermissions.get(name);if (null != bp && permissionsState.grantInstallPermission(bp) != PermissionsState.PERMISSION_OPERATION_FAILURE) {Slog.d(TAG, "grant permission " + name + " to package " + pkg.packageName);changedInstallPermission = true;}}}

添加后的截图如下:

添加的代码的意思也非常清楚,就是对当前应用需要申请的权限全部赋为true,这样应用就可以不动态申请,就直接有了想要的权限了;手机上所有应用的部分信息都保存在/data/system/packages.xml文件中,应用申请的权限在当前应用包名的xml根节点下明确记录,实例截图如下。

本来想把install应用安装的逻辑完全搞清楚,但是进来后发现这块还真是复杂,加上时间不够,有要事在身,就把install安装的系统日志贴出来吧,供大家参考。

我是在cmd中adb install命令行执行安装的,发现的入口点是在PackageInstallerSession.java类的commitLocked方法中调用PMS类的installStage方法来进行安装的。PackageInstallerSession.java类的commitLocked方法源码如下:

    private void commitLocked(PackageInfo pkgInfo, ApplicationInfo appInfo)throws PackageManagerException {if (mDestroyed) {throw new PackageManagerException(INSTALL_FAILED_INTERNAL_ERROR, "Session destroyed");}if (!mSealed) {throw new PackageManagerException(INSTALL_FAILED_INTERNAL_ERROR, "Session not sealed");}try {resolveStageDir();} catch (IOException e) {throw new PackageManagerException(INSTALL_FAILED_CONTAINER_ERROR,"Failed to resolve stage location", e);}// Verify that stage looks sane with respect to existing application.// This currently only ensures packageName, versionCode, and certificate// consistency.validateInstallLocked(pkgInfo, appInfo);Preconditions.checkNotNull(mPackageName);Preconditions.checkNotNull(mSignatures);Preconditions.checkNotNull(mResolvedBaseFile);if (!mPermissionsAccepted) {// User needs to accept permissions; give installer an intent they// can use to involve user.final Intent intent = new Intent(PackageInstaller.ACTION_CONFIRM_PERMISSIONS);intent.setPackage(mContext.getPackageManager().getPermissionControllerPackageName());intent.putExtra(PackageInstaller.EXTRA_SESSION_ID, sessionId);try {mRemoteObserver.onUserActionRequired(intent);} catch (RemoteException ignored) {}// Commit was keeping session marked as active until now; release// that extra refcount so session appears idle.close();return;}if (stageCid != null) {// Figure out the final installed size and resize the container once// and for all. Internally the parser handles straddling between two// locations when inheriting.final long finalSize = calculateInstalledSize();resizeContainer(stageCid, finalSize);}// Inherit any packages and native libraries from existing install that// haven't been overridden.if (params.mode == SessionParams.MODE_INHERIT_EXISTING) {try {final List<File> fromFiles = mResolvedInheritedFiles;final File toDir = resolveStageDir();if (LOGD) Slog.d(TAG, "Inherited files: " + mResolvedInheritedFiles);if (!mResolvedInheritedFiles.isEmpty() && mInheritedFilesBase == null) {throw new IllegalStateException("mInheritedFilesBase == null");}if (isLinkPossible(fromFiles, toDir)) {if (!mResolvedInstructionSets.isEmpty()) {final File oatDir = new File(toDir, "oat");createOatDirs(mResolvedInstructionSets, oatDir);}linkFiles(fromFiles, toDir, mInheritedFilesBase);} else {// TODO: this should delegate to DCS so the system process// avoids holding open FDs into containers.copyFiles(fromFiles, toDir);}} catch (IOException e) {throw new PackageManagerException(INSTALL_FAILED_INSUFFICIENT_STORAGE,"Failed to inherit existing install", e);}}// TODO: surface more granular state from dexoptmInternalProgress = 0.5f;computeProgressLocked(true);// Unpack native librariesextractNativeLibraries(mResolvedStageDir, params.abiOverride);// Container is ready to go, let's seal it up!if (stageCid != null) {finalizeAndFixContainer(stageCid);}// We've reached point of no return; call into PMS to install the stage.// Regardless of success or failure we always destroy session.final IPackageInstallObserver2 localObserver = new IPackageInstallObserver2.Stub() {@Overridepublic void onUserActionRequired(Intent intent) {throw new IllegalStateException();}@Overridepublic void onPackageInstalled(String basePackageName, int returnCode, String msg,Bundle extras) {destroyInternal();dispatchSessionFinished(returnCode, msg, extras);}};final UserHandle user;if ((params.installFlags & PackageManager.INSTALL_ALL_USERS) != 0) {user = UserHandle.ALL;} else {user = new UserHandle(userId);}mRelinquished = true;mPm.installStage(mPackageName, stageDir, stageCid, localObserver, params,installerPackageName, installerUid, user, mCertificates);}

这里的mPm就是PackageManagerService了,执行到installStage方法中,会先通过PMS中mHandler成员变量发送一条INIT_COPY消息,mHandler是PMS的内部类PackageHandler,它在handleMessage方法中就是直接调用doHandleMessage方法去处理安装逻辑的,doHandleMessage方法源码如下:

void doHandleMessage(Message msg) {switch (msg.what) {case INIT_COPY: {HandlerParams params = (HandlerParams) msg.obj;int idx = mPendingInstalls.size();if (DEBUG_INSTALL) Slog.i(TAG, "init_copy idx=" + idx + ": " + params);// If a bind was already initiated we dont really// need to do anything. The pending install// will be processed later on.if (!mBound) {Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "bindingMCS",System.identityHashCode(mHandler));// If this is the only one pending we might// have to bind to the service again.if (!connectToService()) {Slog.e(TAG, "Failed to bind to media container service");params.serviceError();Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, "bindingMCS",System.identityHashCode(mHandler));if (params.traceMethod != null) {Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, params.traceMethod,params.traceCookie);}return;} else {// Once we bind to the service, the first// pending request will be processed.mPendingInstalls.add(idx, params);}} else {mPendingInstalls.add(idx, params);// Already bound to the service. Just make// sure we trigger off processing the first request.if (idx == 0) {mHandler.sendEmptyMessage(MCS_BOUND);}}break;}case MCS_BOUND: {if (DEBUG_INSTALL) Slog.i(TAG, "mcs_bound");if (msg.obj != null) {mContainerService = (IMediaContainerService) msg.obj;Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, "bindingMCS",System.identityHashCode(mHandler));}if (mContainerService == null) {if (!mBound) {// Something seriously wrong since we are not bound and we are not// waiting for connection. Bail out.Slog.e(TAG, "Cannot bind to media container service");for (HandlerParams params : mPendingInstalls) {// Indicate service bind errorparams.serviceError();Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, "queueInstall",System.identityHashCode(params));if (params.traceMethod != null) {Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER,params.traceMethod, params.traceCookie);}return;}mPendingInstalls.clear();} else {Slog.w(TAG, "Waiting to connect to media container service");}} else if (mPendingInstalls.size() > 0) {HandlerParams params = mPendingInstalls.get(0);if (params != null) {Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, "queueInstall",System.identityHashCode(params));Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "startCopy");if (params.startCopy()) {// We are done...  look for more work or to// go idle.if (DEBUG_SD_INSTALL) Log.i(TAG,"Checking for more work or unbind...");// Delete pending installif (mPendingInstalls.size() > 0) {mPendingInstalls.remove(0);}if (mPendingInstalls.size() == 0) {if (mBound) {if (DEBUG_SD_INSTALL) Log.i(TAG,"Posting delayed MCS_UNBIND");removeMessages(MCS_UNBIND);Message ubmsg = obtainMessage(MCS_UNBIND);// Unbind after a little delay, to avoid// continual thrashing.sendMessageDelayed(ubmsg, 10000);}} else {// There are more pending requests in queue.// Just post MCS_BOUND message to trigger processing// of next pending install.if (DEBUG_SD_INSTALL) Log.i(TAG,"Posting MCS_BOUND for next work");mHandler.sendEmptyMessage(MCS_BOUND);}}Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);}} else {// Should never happen ideally.Slog.w(TAG, "Empty queue");}break;}case MCS_RECONNECT: {if (DEBUG_INSTALL) Slog.i(TAG, "mcs_reconnect");if (mPendingInstalls.size() > 0) {if (mBound) {disconnectService();}if (!connectToService()) {Slog.e(TAG, "Failed to bind to media container service");for (HandlerParams params : mPendingInstalls) {// Indicate service bind errorparams.serviceError();Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, "queueInstall",System.identityHashCode(params));}mPendingInstalls.clear();}}break;}case MCS_UNBIND: {// If there is no actual work left, then time to unbind.if (DEBUG_INSTALL) Slog.i(TAG, "mcs_unbind");if (mPendingInstalls.size() == 0 && mPendingVerification.size() == 0) {if (mBound) {if (DEBUG_INSTALL) Slog.i(TAG, "calling disconnectService()");disconnectService();}} else if (mPendingInstalls.size() > 0) {// There are more pending requests in queue.// Just post MCS_BOUND message to trigger processing// of next pending install.mHandler.sendEmptyMessage(MCS_BOUND);}break;}case MCS_GIVE_UP: {if (DEBUG_INSTALL) Slog.i(TAG, "mcs_giveup too many retries");HandlerParams params = mPendingInstalls.remove(0);Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, "queueInstall",System.identityHashCode(params));break;}case SEND_PENDING_BROADCAST: {String packages[];ArrayList<String> components[];int size = 0;int uids[];Process.setThreadPriority(Process.THREAD_PRIORITY_DEFAULT);synchronized (mPackages) {if (mPendingBroadcasts == null) {return;}size = mPendingBroadcasts.size();if (size <= 0) {// Nothing to be done. Just returnreturn;}packages = new String[size];components = new ArrayList[size];uids = new int[size];int i = 0;  // filling out the above arraysfor (int n = 0; n < mPendingBroadcasts.userIdCount(); n++) {int packageUserId = mPendingBroadcasts.userIdAt(n);Iterator<Map.Entry<String, ArrayList<String>>> it= mPendingBroadcasts.packagesForUserId(packageUserId).entrySet().iterator();while (it.hasNext() && i < size) {Map.Entry<String, ArrayList<String>> ent = it.next();packages[i] = ent.getKey();components[i] = ent.getValue();PackageSetting ps = mSettings.mPackages.get(ent.getKey());uids[i] = (ps != null)? UserHandle.getUid(packageUserId, ps.appId): -1;i++;}}size = i;mPendingBroadcasts.clear();}// Send broadcastsfor (int i = 0; i < size; i++) {sendPackageChangedBroadcast(packages[i], true, components[i], uids[i]);}Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);break;}case START_CLEANING_PACKAGE: {Process.setThreadPriority(Process.THREAD_PRIORITY_DEFAULT);final String packageName = (String)msg.obj;final int userId = msg.arg1;final boolean andCode = msg.arg2 != 0;synchronized (mPackages) {if (userId == UserHandle.USER_ALL) {int[] users = sUserManager.getUserIds();for (int user : users) {mSettings.addPackageToCleanLPw(new PackageCleanItem(user, packageName, andCode));}} else {mSettings.addPackageToCleanLPw(new PackageCleanItem(userId, packageName, andCode));}}Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);startCleaningPackages();} break;case POST_INSTALL: {if (DEBUG_INSTALL) Log.v(TAG, "Handling post-install for " + msg.arg1);PostInstallData data = mRunningInstalls.get(msg.arg1);final boolean didRestore = (msg.arg2 != 0);mRunningInstalls.delete(msg.arg1);if (data != null) {InstallArgs args = data.args;PackageInstalledInfo parentRes = data.res;final boolean grantPermissions = (args.installFlags& PackageManager.INSTALL_GRANT_RUNTIME_PERMISSIONS) != 0;final boolean killApp = (args.installFlags& PackageManager.INSTALL_DONT_KILL_APP) == 0;final String[] grantedPermissions = args.installGrantPermissions;// Handle the parent packagehandlePackagePostInstall(parentRes, grantPermissions, killApp,grantedPermissions, didRestore, args.installerPackageName,args.observer);// Handle the child packagesfinal int childCount = (parentRes.addedChildPackages != null)? parentRes.addedChildPackages.size() : 0;for (int i = 0; i < childCount; i++) {PackageInstalledInfo childRes = parentRes.addedChildPackages.valueAt(i);handlePackagePostInstall(childRes, grantPermissions, killApp,grantedPermissions, false, args.installerPackageName,args.observer);}// Log tracing if neededif (args.traceMethod != null) {Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, args.traceMethod,args.traceCookie);}} else {Slog.e(TAG, "Bogus post-install token " + msg.arg1);}Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, "postInstall", msg.arg1);} break;case UPDATED_MEDIA_STATUS: {if (DEBUG_SD_INSTALL) Log.i(TAG, "Got message UPDATED_MEDIA_STATUS");boolean reportStatus = msg.arg1 == 1;boolean doGc = msg.arg2 == 1;if (DEBUG_SD_INSTALL) Log.i(TAG, "reportStatus=" + reportStatus + ", doGc = " + doGc);if (doGc) {// Force a gc to clear up stale containers.Runtime.getRuntime().gc();}if (msg.obj != null) {@SuppressWarnings("unchecked")Set<AsecInstallArgs> args = (Set<AsecInstallArgs>) msg.obj;if (DEBUG_SD_INSTALL) Log.i(TAG, "Unloading all containers");// Unload containersunloadAllContainers(args);}if (reportStatus) {try {if (DEBUG_SD_INSTALL) Log.i(TAG, "Invoking MountService call back");PackageHelper.getMountService().finishMediaUpdate();} catch (RemoteException e) {Log.e(TAG, "MountService not running?");}}} break;case WRITE_SETTINGS: {Process.setThreadPriority(Process.THREAD_PRIORITY_DEFAULT);synchronized (mPackages) {removeMessages(WRITE_SETTINGS);removeMessages(WRITE_PACKAGE_RESTRICTIONS);mSettings.writeLPr();mDirtyUsers.clear();}Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);} break;case WRITE_PACKAGE_RESTRICTIONS: {Process.setThreadPriority(Process.THREAD_PRIORITY_DEFAULT);synchronized (mPackages) {removeMessages(WRITE_PACKAGE_RESTRICTIONS);for (int userId : mDirtyUsers) {mSettings.writePackageRestrictionsLPr(userId);}mDirtyUsers.clear();}Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);} break;case WRITE_PACKAGE_LIST: {Process.setThreadPriority(Process.THREAD_PRIORITY_DEFAULT);synchronized (mPackages) {removeMessages(WRITE_PACKAGE_LIST);mSettings.writePackageListLPr(msg.arg1);}Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);} break;case CHECK_PENDING_VERIFICATION: {final int verificationId = msg.arg1;final PackageVerificationState state = mPendingVerification.get(verificationId);if ((state != null) && !state.timeoutExtended()) {final InstallArgs args = state.getInstallArgs();final Uri originUri = Uri.fromFile(args.origin.resolvedFile);Slog.i(TAG, "Verification timed out for " + originUri);mPendingVerification.remove(verificationId);int ret = PackageManager.INSTALL_FAILED_VERIFICATION_FAILURE;if (getDefaultVerificationResponse() == PackageManager.VERIFICATION_ALLOW) {Slog.i(TAG, "Continuing with installation of " + originUri);state.setVerifierResponse(Binder.getCallingUid(),PackageManager.VERIFICATION_ALLOW_WITHOUT_SUFFICIENT);broadcastPackageVerified(verificationId, originUri,PackageManager.VERIFICATION_ALLOW,state.getInstallArgs().getUser());try {ret = args.copyApk(mContainerService, true);} catch (RemoteException e) {Slog.e(TAG, "Could not contact the ContainerService");}} else {broadcastPackageVerified(verificationId, originUri,PackageManager.VERIFICATION_REJECT,state.getInstallArgs().getUser());}Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, "verification", verificationId);processPendingInstall(args, ret);mHandler.sendEmptyMessage(MCS_UNBIND);}break;}case PACKAGE_VERIFIED: {final int verificationId = msg.arg1;final PackageVerificationState state = mPendingVerification.get(verificationId);if (state == null) {Slog.w(TAG, "Invalid verification token " + verificationId + " received");break;}final PackageVerificationResponse response = (PackageVerificationResponse) msg.obj;state.setVerifierResponse(response.callerUid, response.code);if (state.isVerificationComplete()) {mPendingVerification.remove(verificationId);final InstallArgs args = state.getInstallArgs();final Uri originUri = Uri.fromFile(args.origin.resolvedFile);int ret;if (state.isInstallAllowed()) {ret = PackageManager.INSTALL_FAILED_INTERNAL_ERROR;broadcastPackageVerified(verificationId, originUri,response.code, state.getInstallArgs().getUser());try {ret = args.copyApk(mContainerService, true);} catch (RemoteException e) {Slog.e(TAG, "Could not contact the ContainerService");}} else {ret = PackageManager.INSTALL_FAILED_VERIFICATION_FAILURE;}Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, "verification", verificationId);processPendingInstall(args, ret);mHandler.sendEmptyMessage(MCS_UNBIND);}break;}case START_INTENT_FILTER_VERIFICATIONS: {IFVerificationParams params = (IFVerificationParams) msg.obj;verifyIntentFiltersIfNeeded(params.userId, params.verifierUid,params.replacing, params.pkg);break;}case INTENT_FILTER_VERIFIED: {final int verificationId = msg.arg1;final IntentFilterVerificationState state = mIntentFilterVerificationStates.get(verificationId);if (state == null) {Slog.w(TAG, "Invalid IntentFilter verification token "+ verificationId + " received");break;}final int userId = state.getUserId();if (DEBUG_DOMAIN_VERIFICATION) Slog.d(TAG,"Processing IntentFilter verification with token:"+ verificationId + " and userId:" + userId);final IntentFilterVerificationResponse response =(IntentFilterVerificationResponse) msg.obj;state.setVerifierResponse(response.callerUid, response.code);if (DEBUG_DOMAIN_VERIFICATION) Slog.d(TAG,"IntentFilter verification with token:" + verificationId+ " and userId:" + userId+ " is settings verifier response with response code:"+ response.code);if (response.code == PackageManager.INTENT_FILTER_VERIFICATION_FAILURE) {if (DEBUG_DOMAIN_VERIFICATION) Slog.d(TAG, "Domains failing verification: "+ response.getFailedDomainsString());}if (state.isVerificationComplete()) {mIntentFilterVerifier.receiveVerificationResponse(verificationId);} else {if (DEBUG_DOMAIN_VERIFICATION) Slog.d(TAG,"IntentFilter verification with token:" + verificationId+ " was not said to be complete");}break;}}

在INIT_COPY中,成员变量mBound是在connectToService方法执行成功已经赋值为true了,所有会执行else分支,继续发一条MCS_BOUND消息,MCS_BOUND消息中会执行else if (mPendingInstalls.size() > 0)分支,在这里的if (params.startCopy())就会调用给应用赋予权限的逻辑了,params的类型为HandlerParams,它的startCopy()拷贝完成后,最后调用handleReturnCode继续处理,handleReturnCode是由子类InstallParams来实现的,它当中直接调用processPendingInstall往mHandler所在的线程上发了一条Runnable消息,Runnable中继续调用installPackageTracedLI处理,installPackageTracedLI方法又继续调用installPackageLI方法处理,installPackageLI方法在执行到15451行的try (PackageFreezer freezer = freezePackageForInstall(pkgName, installFlags, "installPackageLI"))逻辑时,因为是新安装,此处理的replace为false,执行installNewPackageLIF方法继续处理,方法注释上也写的很清楚了,是安装新应用时执行的,installNewPackageLIF方法的源码如下:

    /** Install a non-existing package.*/private void installNewPackageLIF(PackageParser.Package pkg, final int policyFlags,int scanFlags, UserHandle user, String installerPackageName, String volumeUuid,PackageInstalledInfo res) {Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "installNewPackage");// Remember this for later, in case we need to rollback this installString pkgName = pkg.packageName;if (DEBUG_INSTALL) Slog.d(TAG, "installNewPackageLI: " + pkg);synchronized(mPackages) {if (mSettings.mRenamedPackages.containsKey(pkgName)) {// A package with the same name is already installed, though// it has been renamed to an older name.  The package we// are trying to install should be installed as an update to// the existing one, but that has not been requested, so bail.res.setError(INSTALL_FAILED_ALREADY_EXISTS, "Attempt to re-install " + pkgName+ " without first uninstalling package running as "+ mSettings.mRenamedPackages.get(pkgName));return;}if (mPackages.containsKey(pkgName)) {// Don't allow installation over an existing package with the same name.res.setError(INSTALL_FAILED_ALREADY_EXISTS, "Attempt to re-install " + pkgName+ " without first uninstalling.");return;}}try {PackageParser.Package newPackage = scanPackageTracedLI(pkg, policyFlags, scanFlags,System.currentTimeMillis(), user);updateSettingsLI(newPackage, installerPackageName, null, res, user);if (res.returnCode == PackageManager.INSTALL_SUCCEEDED) {prepareAppDataAfterInstallLIF(newPackage);} else {// Remove package from internal structures, but keep around any// data that might have already existeddeletePackageLIF(pkgName, UserHandle.ALL, false, null,PackageManager.DELETE_KEEP_DATA, res.removedInfo, true, null);}} catch (PackageManagerException e) {res.setError("Package couldn't be installed in " + pkg.codePath, e);}Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);}

在这里的try模块中执行updateSettingsLI更新Settings,又调用updateSettingsInternalLI处理,接着调用updatePermissionsLPw更新应用权限,updatePermissionsLPw方法中就是直接调用updatePermissionsLPw方法处理,该方法中最后就会执行grantPermissionsLPw给应用写权限,而我们加在这里的逻辑也就生效了。

从这里看,这还只是写权限的部分逻辑,应用安装还涉及到其他很多问题,真是非常复杂,大家有研究清楚的,也请多多指教,最后把我在系统中加的日志贴出来,供大家参考。

Line 5990: 01-03 08:52:44.102  2257  2402 I System.out: stack, dalvik.system.VMStack.getThreadStackTrace(VMStack.java:-2)
    Line 5991: 01-03 08:52:44.103  2257  2402 I System.out: stack, java.lang.Thread.getStackTrace(Thread.java:1566)
    Line 5992: 01-03 08:52:44.103  2257  2402 I System.out: stack, com.android.server.pm.PackageManagerService.processPendingInstall(PackageManagerService.java:12578)
    Line 5993: 01-03 08:52:44.103  2257  2402 I System.out: stack, com.android.server.pm.PackageManagerService.-wrap33(PackageManagerService.java:-1)
    Line 5994: 01-03 08:52:44.103  2257  2402 I System.out: stack, com.android.server.pm.PackageManagerService$InstallParams.handleReturnCode(PackageManagerService.java:13384)
    Line 5995: 01-03 08:52:44.103  2257  2402 I System.out: stack, com.android.server.pm.PackageManagerService$HandlerParams.startCopy(PackageManagerService.java:12767)
    Line 5996: 01-03 08:52:44.103  2257  2402 I System.out: stack, com.android.server.pm.PackageManagerService$PackageHandler.doHandleMessage(PackageManagerService.java:1274)
    Line 5997: 01-03 08:52:44.103  2257  2402 I System.out: stack, com.android.server.pm.PackageManagerService$PackageHandler.handleMessage(PackageManagerService.java:1196)
    Line 5998: 01-03 08:52:44.103  2257  2402 I System.out: stack, android.os.Handler.dispatchMessage(Handler.java:102)
    Line 5999: 01-03 08:52:44.103  2257  2402 I System.out: stack, android.os.Looper.loop(Looper.java:154)
    Line 6000: 01-03 08:52:44.103  2257  2402 I System.out: stack, android.os.HandlerThread.run(HandlerThread.java:61)
    Line 6001: 01-03 08:52:44.104  2257  2402 I System.out: stack, com.android.server.ServiceThread.run(ServiceThread.java:46)
    Line 6100: 01-03 08:52:46.360  2257  2402 I System.out: stack, dalvik.system.VMStack.getThreadStackTrace(VMStack.java:-2)
    Line 6101: 01-03 08:52:46.361  2257  2402 I System.out: stack, java.lang.Thread.getStackTrace(Thread.java:1566)
    Line 6102: 01-03 08:52:46.361  2257  2402 I System.out: stack, com.android.server.pm.PackageManagerService.grantPermissionsLPw(PackageManagerService.java:10075)
    Line 6103: 01-03 08:52:46.361  2257  2402 I System.out: stack, com.android.server.pm.PackageManagerService.updatePermissionsLPw(PackageManagerService.java:10059)
    Line 6104: 01-03 08:52:46.361  2257  2402 I System.out: stack, com.android.server.pm.PackageManagerService.updatePermissionsLPw(PackageManagerService.java:9972)
    Line 6105: 01-03 08:52:46.361  2257  2402 I System.out: stack, com.android.server.pm.PackageManagerService.updateSettingsInternalLI(PackageManagerService.java:15044)
    Line 6106: 01-03 08:52:46.361  2257  2402 I System.out: stack, com.android.server.pm.PackageManagerService.updateSettingsLI(PackageManagerService.java:15013)
    Line 6107: 01-03 08:52:46.361  2257  2402 I System.out: stack, com.android.server.pm.PackageManagerService.installNewPackageLIF(PackageManagerService.java:14388)
    Line 6108: 01-03 08:52:46.361  2257  2402 I System.out: stack, com.android.server.pm.PackageManagerService.installPackageLI(PackageManagerService.java:15457)
    Line 6109: 01-03 08:52:46.361  2257  2402 I System.out: stack, com.android.server.pm.PackageManagerService.installPackageTracedLI(PackageManagerService.java:15105)
    Line 6110: 01-03 08:52:46.361  2257  2402 I System.out: stack, com.android.server.pm.PackageManagerService.-wrap26(PackageManagerService.java:-1)
    Line 6111: 01-03 08:52:46.361  2257  2402 I System.out: stack, com.android.server.pm.PackageManagerService$10.run(PackageManagerService.java:12596)
    Line 6112: 01-03 08:52:46.361  2257  2402 I System.out: stack, android.os.Handler.handleCallback(Handler.java:751)
    Line 6113: 01-03 08:52:46.361  2257  2402 I System.out: stack, android.os.Handler.dispatchMessage(Handler.java:95)
    Line 6114: 01-03 08:52:46.362  2257  2402 I System.out: stack, android.os.Looper.loop(Looper.java:154)
    Line 6115: 01-03 08:52:46.362  2257  2402 I System.out: stack, android.os.HandlerThread.run(HandlerThread.java:61)
    Line 6116: 01-03 08:52:46.362  2257  2402 I System.out: stack, com.android.server.ServiceThread.run(ServiceThread.java:46)

Android 7.0修改PMS逻辑添加权限白名单相关推荐

  1. Android 10.0 framework根据允许app启动白名单限制其他app启动

    目录 1.概述 2.framework根据白名单启动app的相关核心代码 3.framework根据白名单启动app的相关核心代码

  2. android 添加安装权限白名单

    点击打开链接 有些项目不允许所有APK都拥有安装权限,例如apk只能通过应用商城来安装或者升级,只允许某些特定的apk自升级,不允许pm install等.这就需要添加安装权限白名单来控制. 1.pa ...

  3. Android 10.0 PackageManagerService(二)权限扫描-[Android取经之路]

    摘要:PackageManagerService在systemReady()后,进行了/system/etc/permissions中的各种xml进行扫描,进行相应的权限存储,供以后使用 阅读本文大约 ...

  4. android webview权限申请_Android应用开发之android 6.0下webview的定位权限设置方法

    本文将带你了解Android应用开发android 6.0下webview的定位权限设置方法,希望本文对大家学Android有所帮助. 如下所示: WebView webView =   (WebVi ...

  5. Android 4.0.4-在build.prop中添加属性

    Android 4.0.4-在build.prop中添加属性 2013-10-07 16:40:56|  分类: 默认分类|举报|字号 订阅 1.在*.rc文件中用setprop添加,例如在源码and ...

  6. Android 10 添加安装白名单和卸载黑名单

    实现思路 1.提供 ContentProvider 保存我需要添加安装白名单和卸载黑名单列表 2.找到安装.卸载应用的系统核心源码, 3.查询ContentProvider 获取安装白名单列表和卸载黑 ...

  7. Android系统的特许权限白名单

    目录 一.什么是特权应用 二.Android系统的特许权限 三.特许权限白名单 1.白名单限制宏开关 2.日志打印 3.添加白名单 一.什么是特权应用 特权应用(Privileged Applicat ...

  8. Android 7 添加安装白名单

    Android 7 添加安装白名单 项目场景: 提示:某些系统只支持已经的apk 安装 例如:项目场景: 车机系统 pm.java代码: final File systemDir;final File ...

  9. zookeeper添加ip白名单

    1.连接zookeeper 进入zookeeper安装目录 bin目录下 ./zkCli.sh -server 192.168.122.76:2181 (linux环境操作指令)zkCli -serv ...

最新文章

  1. StartOS 5.0 正式版发布
  2. 再见了Spring Cloud!这个架构有点厉害,甚至干掉了Dubbo!
  3. 数据结构之二叉树(遍历、建立、深度)
  4. 如何编写企业解决方案书(转)
  5. vue-devtools介绍与安装
  6. 零基础学习Java,全方位知识点总结!
  7. [Python图像处理] 五.图像融合、加法运算及图像类型转换
  8. mysql查询大于0的标记_MySQL如何查询回答数大于0的问题并分页
  9. UILabel 详解
  10. 【转贴备忘】[教程]iPhone 實機開發 Part 1 - HelloWorld
  11. 1盒子刷webpad_拉宽带送的盒子也有春天:一招解放各种束缚限制
  12. mailto 附带附件_为什么附带项目如此重要
  13. jQuery中添加/改变/移除改变CSS样式例子
  14. Python项目实践:基本统计值计算
  15. word2vec 细节解析1
  16. 程序员面试宝典(一) - 流程概览
  17. 2#使用新安装的ubuntu,之vim必须知道的细节
  18. 分析mrp主要应用范围_MRP软件行业现状调研分析及发展趋势预测报告(2020)
  19. Netlimiter 3.0 注册码
  20. Shiro源码剖析——Subject的创建与获取(一次完整的请求执行流程)

热门文章

  1. Globally and Locally Consistent Image Completion 实验记录
  2. python遍历文本文件统计字符个数_用python获取txt文件中关键字的数量
  3. shiro+jwt登录认证anon配置无效
  4. 计算机发展的各个阶段是以什么作为标志的,计算机发展的各个阶段是以什么作为标志的?...
  5. eclipse 重命名文件、移动文件、删除等操作时出现.svntmp文件
  6. Xmind 免费安装使用教程
  7. 2018级《程序设计基础(B)II》期末上机考试( 题解)
  8. 计算hashCode通用计算公式
  9. 如何在PHP中使用Modulo运算符
  10. 英语八大句子成分之一 - 状语