插件化基础知识之二———成也PackageMnager,败也PackageManager

Android11及以上APP无法获取到所有安装包的问题 在创建应用时,请务必考虑您的应用打算访问的已在设备上安装的一组其他应用。如果您的应用以 Android 11(API 级别 30)或更高版本为目标平台,在默认情况下,系统会自动让部分应用对您的应用可见,但会过滤掉其他应用。本指南将介绍如何让上述其他应用对您的应用可见。 如果您的应用以 Android 11 或更高版本为目标平台,并且需要与应用(自动可见的应用除外)交互,请在您应用的清单文件中添加 元素。在 元素中,按软件包名称、按 intent 签名或按 Provi... 阅读详情

前言:

引起对PackageManager的思考的是:插件化实现对未安装的apk进行启动,那么,未安装的apk与已安装的apk有什么区别?这些区别又是谁造成的呢?谈及这个问题时,我们不得不面对PM。

内容目录:

(1).PackageManager的作用

(2).PM的本质以及来源

(3).PM的安装流程以及安装本质

(4)备注

1.PackageManager的作用

1.安装和卸载应用

2.获取关于应用的各种信息,比如Application的名称,四大组件的信息。

之所以有这种功能,是在安装app时,首先读取了AndroidManifest中的各个节点信息。

3.获取系统中各种分类应用(比如已安装应用,最近使用的应用等)

4.权限的获取与处理

具体的方法如下:

https://blog.youkuaiyun.com/da_caoyuan/article/details/52908797

2.PM的本质以及来源

(1).PackageManager的获取可以从Activity直接获取:

PackageManager packageManager = getPackageManager();

(2)进入后是ContextWrapper的调用,实际上,ContextWrapper只是Context的包装类,而实现类是ContexImpl.

  public PackageManager getPackageManager() {
        if (mPackageManager != null) {
            return mPackageManager;
        }

        IPackageManager pm = ActivityThread.getPackageManager();
        if (pm != null) {
            // Doesn't matter if we make more than one instance.
            return (mPackageManager = new ApplicationPackageManager(this, pm));
        }

        return null;
    }

(3)PackageManger是ApplicationPackageManager,而ApplicationPackageManager实际上只是一个包装类,用来包装IPackageManager。而IPackageManger是AIDL通信的接口,对应于PackageManagerService。

  //通过这两个方法可以看出,实际上的实现都是mPM
private int installExistingPackageAsUser(String packageName, int installReason, int userId)
            throws NameNotFoundException {
        try {
            int res = mPM.installExistingPackageAsUser(packageName, userId, 0 /*installFlags*/,
                    installReason);
            if (res == INSTALL_FAILED_INVALID_URI) {
                throw new NameNotFoundException("Package " + packageName + " doesn't exist");
            }
            return res;
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    @Override
    public void verifyPendingInstall(int id, int response) {
        try {
            mPM.verifyPendingInstall(id, response);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }

    }

(4)接下来,咱们来看牛13的ActivityThread(它的牛逼,看过应用冷启动流程的同学应该知悉,不知道的同学可以查查资料)。

//ServiceManager是对SystemService进行管理的类,“package”对应于PackageManagerService,关于
ServiceManager可以看下源码
public static IPackageManager getPackageManager() {
        if (sPackageManager != null) {
            //Slog.v("PackageManager", "returning cur default = " + sPackageManager);
            return sPackageManager;
        }
        IBinder b = ServiceManager.getService("package");
        //Slog.v("PackageManager", "default service binder = " + b);
        sPackageManager = IPackageManager.Stub.asInterface(b);
        //Slog.v("PackageManager", "default service = " + sPackageManager);
        return sPackageManager;
    }

(4.1)关于ServiceManager.getService,实际上在系统启动时,启动系统服务,会将AM等各个服务添加到服务管理类中。


/**
     * Returns a reference to a service with the given name.
     *
     * @param name the name of the service to get
     * @return a reference to the service, or <code>null</code> if the service doesn't exist
     */
    public static IBinder getService(String name) {
        try {
            IBinder service = sCache.get(name);
            if (service != null) {
                return service;
            } else {
                return Binder.allowBlocking(rawGetService(name));
            }
        } catch (RemoteException e) {
            Log.e(TAG, "error in getService", e);
        }
        return null;
    }

4.备注

(1).系统源码的在线查看,用的是Android社区源码查看

http://www.androidos.net.cn/

Unity3D-PackageManagerModules:一个工具包,用于为“包管理器”窗口创建模块 包管理器模块 用于为“程序包管理器”窗口创建模块的工具箱。 安装 该软件包可在。 您可以通过安装它。 openupm add net.tnrd.packagemanagermodules 通过从创建的进行 用法 创建一个模块 要创建模块,您需要创建一个实现IPackageManagerModule接口的类。 这些类会自动被拾取并添加到模块菜单中,该菜单位于“程序包管理器”窗口的顶部 识别码 模块的标识符应该唯一,并且只能用于一个软件包。 我建议为此使用。 显示名称 模块的显示名称是将在模块菜单中显示的名称。 如果计划创建多个模块,则可以使用/(正斜杠)将它们分组在一起 例如Foo/Bar 立即下载

相关推荐

SynoPackages:使用Mods Packager构建的各种Synology软件包

这是包含压缩的Synology软件包的“软件包文件夹”列表。 我出于自己的目的创建了这些文件: 通过修改现有的Synology软件包(例如:“ MODS SSPKS”,它是Julien Del-Piccolo的Simple SPK Server的修改) 或通过创建自己的软件包(例如:“ MODS软件包管理器”,该软件包可帮助将软件包从一个卷移动到另一个卷) 或打包现有应用程序(例如:“ MODS Server Monitor是用于在Synology上部署Php Server Monitor的软件包) 可以使用“ Mods Packager”打开的那些“ Package Folders”,以重建SPK文件(Synology Packages)。 简短地说:运行“ Mods Packager”并通过使用菜单“文件”>“打开”或将文件夹拖放到Mods Packager的主UI上,打开任

群晖NAS跨存储空间移动套件(应用)

之前一篇文章《群晖NAS跨存储空间移动共享文件夹(NAS新增磁盘)》我们介绍了如何在NAS槽位新增磁盘,并构建新的磁盘阵列,最后再将部分共享文件夹移动到新的磁盘空间即可。弄完这一系列操作之后,考虑到原来的存储空间太小,于是打算将所有的套件(应用)安装目录由原来的存储空间移动到新的磁盘空间来。于是几经折腾,终于将所有的应用都移动到了新的存储空间来。

跳小闹成长记 2万+

游戏封包抓取实战:雷电模拟器+ProxyDroid+查尔斯3.93+WPE全流程解析

本文详细解析了使用雷电模拟器、ProxyDroid、查尔斯3.93和WPE进行游戏封包抓取的全流程实战。通过环境搭建、代理配置与工具协同,手把手教你抓取HTTP/HTTPS及原始Socket数据,涵盖从流量转向、证书安装到数据分析和常见问题排查,是学习游戏网络协议分析与安全测试的实用指南。

u8v9w0x1y的博客 445

MODS Package Manager白屏处理

原因:https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js 无法加载,可能可以通过翻墙可以解决。 另一种方法,打开终端,编辑 /volumeX/@appstore/MODS_PackageManager/ui/mvpkg.php文件 volumeX中的X表示的是package manager的安装的存储空间 比如我是安装在存储空间5,这里就是volume5, 将https://ajax.googleapis.com/ajax/lib

qq_17311873的博客 2009

【OpenClaw 故障排查完全指南】

OpenClaw 故障排查指南摘要 本指南针对OpenClaw 2026.2.26版本常见问题提供解决方案,适用于Windows/Linux/macOS平台。 核心问题及修复方案: 飞书插件连接失败:删除冲突插件或重装OpenClaw Ollama认证错误:设置环境变量OLLAMA_API_KEY="ollama-local" 配置警告:可安全忽略的安全扫描提示 端口占用:查找并终止占用18789端口的进程 插件重复加载:清理重复插件目录 快速修复: 提供一键修复PowerShell脚本

weixin_37572294的博客 1万+

利用Python爬虫获取淘宝商品评论:实战案例分析

在数字化时代,数据的价值日益凸显,尤其是对于电商平台而言,商品评论作为用户反馈的重要载体,蕴含着丰富的信息。本文将详细介绍如何利用Python爬虫技术获取淘宝商品评论,包括代码示例和关键步骤解析。

2401_87849335的博客 2835

PackageManager解析

PackageManager:管理应用程序包功能: 安装,卸载应用 查询permission相关信息 查询Application相关信息(application,activity,receiver,service,provider及相应属性等) 查询已安装应用 增加,删除permission 清除用户数据、缓存,代码段等 使用方法:在Android中,为应用包的安装,删除各种操作服务的,是Packa

扣子Coze大师班 1万+

探索如何利用CST和ADS进行DDR的SIPI联合仿真

本文系统介绍了CST和ADS两款工具进行DDR信号完整性/电源完整性(SI/PI)联合仿真的方法。CST采用工作室协同方式,通过PCB布局导入、材料设置、模型分配等步骤,重点分析了电源阻抗优化和信号波形质量。ADS则利用SIPro、PIPro等专用工具,突出系统级验证和自动化优化功能。两者各有优势:CST擅长3D结构精确建模,ADS更适于快速系统验证。文章建议可根据项目需求混合使用两种工具,并提供了模型简化、频带选择等实用技巧。通过对比分析,为工程师选择仿真工具提供了决策参考。

一只豌豆象的博客 1150

Android PackageManager 基本使用

PackageManager管理类,它的主要职责是管理应用程序包,通过PackageManager获取的应用程序信息来自AndroidManifest.xml。

特立独行的博客 2961

NSIS教程(8): 基于第三方界面库的安装包界面

前面的几篇文章介绍了NSIS的传统界面的安装包和现代界面的安装包的制作方法,也提到了NSIS支持自定义页面(即使用page custom)的特性,自定义页面需要用户自己创建对话框、控件、添加控件响应等等,虽然NSIS提供了nsDialogs.nsh来支持这些功能,但使用起来还是不太方便(需要专门了解这个插件诸多用法),而且不够灵活,所以本文介绍一种终极的自定义界面的安装包解决方案,即完全使用第三方

while(1) { smile(); } 9万+

大数据领域数据服务的数据分析工具推荐

你有没有过这样的经历?——领导说“帮我分析一下上个月的销量”,你打开Excel却发现数据有100万行,电脑直接卡死;或者想实时知道“现在直播间的观众在买什么”,却不知道用什么工具处理每秒10万条的点击数据。本文的目的:帮你解决“选什么工具做什么事”的问题,覆盖大数据服务的全流程(采集→存储→处理→分析→可视化),推荐高频、实用、易上手的工具,并讲清楚它们的“适用场景”和“优缺点”。范围。

大数据洞察的博客 1931

Android PackageManager详解

Android系统为我们提供了很多服务管理的类,包括ActivityManager、PowerManager(电源管理)、AudioManager(音频管理)等。除此之外,还提供了一个PackageManger管理类,它的主要职责是管理应用程序包。 通过PackageManager,我们就可以获取应用程序信息。   提到PackageManager,就得提一下AndroidManifest.XML文件了。AndroidManifest.xml是Android应用程序中最重要的文件之一。它是Android.

看美丽风晴 9905

多层环境室内定位系统综述总结

本文是一篇发表于2025年《IEEE Access》期刊的综述论文,由埃及开罗美国大学与卡塔尔卡内基梅隆大学团队合作完成,聚焦多层环境室内定位系统的核心挑战、技术方案及未来方向,填补了该领域缺乏全面综述的空白。

程序员石磊 445

Android崩溃处理

我们写程序的时候都希望能写出一个没有任何Bug的程序,期望在任何情况下都不会发生程序崩溃。但没有一个程序员能保证自己写的程序绝对不会出现异常崩溃。特别是当你用户数达到一定数量级后,你也更容易发现应用不同情况下的崩溃。   对于还没发布的应用程序,我们可以通过测试、分析Log的方法来收集崩溃信息。但对已经发布的程序,我们不可能让用户去查看崩溃信息然后再反馈给开发者。所以,设计一个对于小白用户都

u010112537的专栏 741

【C语言】字符常量详解

字符常量是C语言中处理字符数据的重要工具。通过单引号括起一个字符,我们可以方便地使用字符常量进行字符判断、字符运算和字符串处理等操作。理解字符常量的表示方法、使用场景和ASCII码对应关系,对于编写高效的C语言程序至关重要。

LuckiBit 5018

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Android随笔之——PackageManager详解

一、PackageManager的功能:   1、安装,卸载应用  2、查询permission相关信息  3、查询Application相关信息(application,activity,receiver,service,provider及相应属性等)  4、查询已安装应用  5、增加,删除permission  6、清除用户数据、缓存,代码段等        二、Pack

jonemill的专栏 839

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

PackageManager详解

一、PackageManager的功能:   1、安装,卸载应用  2、查询permission相关信息  3、查询Application相关信息(application,activity,receiver,service,provider及相应属性等)  4、查询已安装应用  5、增加,删除permission  6、清除用户数据、缓存,代码段等        二、Pa

qq_26817313的博客 1152

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

实习杂记(32):getApplicationInfo或者getPackageManger出错

发生这种错误原因第一个是:binder通信 getPackageManger  是通过binder通信的,最大通信是1M,而且这个binder通信是系统整个的, 也就是当前整个手机APP所有应用同一个时刻,或者同一个时间内 进行通信   超过了IM, 就会报:RuntimeException  和  RomatoException      这里大家想的办法是同步,不能一

wust小吴 8098

Android获取应用程序信息——PackageManager的基本使用

在我们实际开发中,我们常需要获取应用的一些信息来使用,比如获取应用程序基本信息、获取permission是否注册等。这些信息获取都借助于Android给我们提供的PackageManager进行获取,这里我们就总结下PackageManager的基本用法。 首先看下我们常见的Manifest配置图: 通过上图可以看出,Android给我们的每个节点提供了对应的信息存储实体类,所以这

钝悟需要时间的打磨,顿悟需要时间的积累 3万+

静态代码块里,如何拿到PackageManager?

近期遇到一个场景, 静态代码块里,无法拿到context,context.getPackageManager只在运行时适用,而静态代码块里无法做到,那么如何拿到PackageManager? 例如: static { if(判断条件) { //执行静态方法; } } 从NfcAdapater里边找到了启发。 package android.nfc; /** * Represents the ..

u013398960的博客 919

ApplicationHelper 项目常见问题解决方案

ApplicationHelper 项目常见问题解决方案 1. 项目基础介绍和主要编程语言 ApplicationHelper 是一个开源项目,旨在帮助开发者快速解耦 Android 项目中的 Application 类逻辑。通过该库,开发者可以轻松地管理 Application 中的初始化操作,使得代码更加简洁和易于维护。项目主要使用 Java 编程语言开发。 2. 新手使用时需要注意的3个问题...

gitblog_01018的博客 373

context.getPackageManager().getApplicationInfo()异常处理

context.getPackageManager().getApplicationInfo(packageName, PackageManager.GET_UNINSTALLED_PACKAGES);异常处理 1.检测是否已安装了指定包名的第三方app 通过上面代码可以去判断当前设备是否已经安装了该包名的第三方app。如果不抛异常,说明这设备已经安装了。如果未安装,就一定会抛异常。 但是,发现,在android11以及更高版本的手机中,即使已经安装了该包名的app,也仍然会抛异常: android.co

guan2android的博客 5615

探索 Synology 包新境界:Vletroye的SynoPackages

探索 Synology 包新境界:Vletroye的SynoPackages 在开源软件的浩瀚宇宙中,有一个宝藏项目专门为Synology NAS爱好者和管理员打造——【SynoPackages**】。这不仅仅是一个普通的工具集合,而是通往自定义与优化Synology设备的强大钥匙。 项目介绍 SynoPackages是一个独特的项目,它包含了精心编排的“包文件夹”,这些是为了满足高级用户和开发者...

gitblog_00044的博客 1001

PackageManager--获取应用程序信息,权限管理获取应用

android.content.pm包里的类都是管理应用程序的。   获取已安装应用程序信息 通过Activity的getPackageManager()方法可以得到PackageManager的对象 1.PackageManager 的getInstalledPackages(int flags)方法可以得到所有安装在机器上的程序的包信息类对象ListPackageInfo>,Packa

liu149339750的专栏 2万+

分析 Package manager has died

这是今天遇到的一个issue,由于Binder造成的。虽然比较简单,还是保持记录下吧。先来开看一下Crash log:E/HpnsService(24810): HPNS Version is 5.0java.lang.RuntimeException: Package manager has died E/HpnsService(24810): at android.app.Applicati...

XXOOYC的专栏 1万+
上一篇: JVM入门看着一篇就够了
下一篇: JVM的内存管理及应用
FullStackDeveloper
博客等级 码龄11年 23粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值