怎么apk静默升级安装apk到系统区/system/app目录下

Android系统分区理解及分区目录细解_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Android系统分区理解及分区目录细解
上传于||暂无简介
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
你可能喜欢下次自动登录
现在的位置:
& 综合 & 正文
[Android]实现静默安装APK的两种方法
Android上的静默安装似乎是个很诱人的功能,好多人都问这个问题。今天分享下实现静默安装的两种方法,但当看完这篇后,仍会让一些人失望滴。
Android把所有的Permission依据其潜在风险(属性名为
)划分为四个等级,即
INSTALL_PACKAGES属于后两者。让我们看一下官方文档对后两类的描述吧。
that are signed with the same certificates as those in the system image. Please avoid using this option, as thesignature
protection level should be sufficient for most needs and works regardless of exactly where applications are installed. The "signatureOrSystem " permission is used for
certain special situations where multiple vendors have applications built into a system image and need to share specific features explicitly because they are being built together.
所以,这儿介绍的两种方法各自需要的苛刻条件如下:
1.内置到ROM。即APK包的安装位置是/system/app下。
2.使用APK的目标安装系统同样的签名。
好了,先不管这些苛刻的条件,下面讲下如何编写直接安装APK的,这儿使用pm install &apk_path&命令,而不是繁杂的未公开的PackageManager.install()方法。
String[] args = { "pm", "install", "-r", apkAbsolutePath };
String result = "";
ProcessBuilder processBuilder = new ProcessBuilder(args);
Process process = null;
InputStream errIs = null;
InputStream inIs = null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int read = -1;
process = processBuilder.start();
errIs = process.getErrorStream();
while ((read = errIs.read()) != -1) {
baos.write(read);
baos.write('/n');
inIs = process.getInputStream();
while ((read = inIs.read()) != -1) {
baos.write(read);
byte[] data = baos.toByteArray();
result = new String(data);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (errIs != null) {
errIs.close();
if (inIs != null) {
inIs.close();
} catch (IOException e) {
e.printStackTrace();
if (process != null) {
process.destroy();
String[] args = { "pm", "install", "-r", apkAbsolutePath };
String result = "";
ProcessBuilder processBuilder = new ProcessBuilder(args);
Process process =
InputStream errIs =
InputStream inIs =
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int read = -1;
process = processBuilder.start();
errIs = process.getErrorStream();
while ((read = errIs.read()) != -1) {
baos.write(read);
baos.write('/n');
inIs = process.getInputStream();
while ((read = inIs.read()) != -1) {
baos.write(read);
byte[] data = baos.toByteArray();
result = new String(data);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (errIs != null) {
errIs.close();
if (inIs != null) {
inIs.close();
} catch (IOException e) {
e.printStackTrace();
if (process != null) {
process.destroy();
代码执行后,如果安装成功的话获取到的result值是“
pkg: /data/local/tmp/Calculator.apk
/nSuccess”,如果是失败的话,则没有结尾的“Success”。
安装代码有了,现在开始介绍第一种方法,将你自己的APK内置到ROM中。前提是,你这手机已经刷机过并且保留了recovery-windows.bat/recover-linux.sh
针对HTC-Legend的具体操作步骤为:
1.USB连接你的设备然后在命令行输入 "adb reboot recovery"
,机子重启,启动后将显示一个红色的三角形和箭头图标
2 .(在PC下)进入到你的刷机文件夹然后运行
'./recover-linux.sh' ,屏幕将显示绿色的菜单
3 .如果得到的结果是
"error:device not found" ,运行 "./adb-linux kill-server"
后再一次运行 './recovery-linux.sh' 直到显示绿色菜单.
"adb shell mount /dev/block/mtdblock3 /system" ,至此,可对/system进行写操作。
5.在PC上运行命令:adb push &your_apk_path& /system/&your_apk_name&。至此,内置成功。
第二种方法,需要先打一个未签名的APK包,然后用系统签名对其进行签名。这个方面的东西在我之前的一篇博文已说明,这儿就不重复了。
由于HTC-Legend是“原装”的,所以静默安装倒是顺利。但对于一些MOTO或乐Phone的手机,一般上是不支持的。
以上这两种方法都在AndroidManifest中声明android.permission.INSTALL_PACKAGES,有一点比较奇怪的是执行“
int result = checkCallingOrSelfPermission(Intent.ACTION_PACKAGE_INSTALL)
”,result的值为android.content.pm.PackageManager.PERMISSION_DENIED而不是PERMISSION_GRANTED。
&&&&推荐文章:
【上篇】【下篇】lhc180 的BLOG
用户名:lhc180
文章数:16
评论数:13
访问量:158613
注册日期:
阅读量:5863
阅读量:12276
阅读量:367265
阅读量:1062109
[匿名]mendou:
51CTO推荐博文
&要求在安装APK应用时不显示权限信息和安装过程。
Google的安全策略要求任何应用应该提示APK安装包的权限,对于一些内置特定厂商应用,可以跳过安装过程的信息加快安装,或者运营商强制安装。
这个功能的实现在src/package/app/PackageInstaller中,需要修改。添加静默安装的功能。又兼容正常安装。
实现的分析
在窗口中点击一个APK时,触发单击事件,PackageInstaller接收系统服务PackageManagerService传来的intent信息,传来的Intent信息中有APK的一些参数。实现的关键是区分一般APK和特定APK。
通过传给PackageManagerService的intent中添加特别的参数,PackageInstaller接收后进行判断,进行特别的隐藏安装流程。这个实现只能通过程序调用的方式安装。&
安装过程的信息窗口在PackageInstallActivity.java中实现的。安装过程的信息窗口有4个:需要实现一个PakkageInstallActivityHide.JAVA的文件,去掉下面的dialog和窗口
安装权限确认窗口:installPermissionConfirm
安装进度条:installProgress
安装结果窗口:installResult
安装错误提示对话框
文件列表大概如下:
InstallAppProgress.java&
PackageInstallerActivity.java
+PackageInstallerActivityHide.java
PackageUtil.java &
UninstallAppProgress.java
UninstallerActivity.java
+UninstallerActivityHide.java
1 在Androidmainfest.xml声明一个特定的intent:android.intent.action.VIEW.HIDE,由PackageInstallActivityHide.java来接受
注意这里的两点:
&把原先的&&android:label=&@string/app_name&&android:theme=&@android:style/Theme.Holo.DialogWhenLarge&&改成&&&android:label=&@string/app_name&,把android:theme=&@android:style/Theme.Holo.DialogWhenLarge&主题的显示放在每一个&中,兼容正常按装的UI主题不变&隐藏安装的&的主题只能是:&android:theme=&@android:style/Theme.NoDisplay&&只能是这个,没有窗口&
内容如下:
&android:label=&@string/app_name&&&&&&android:name=&.PackageInstallerHideActivity&&android:theme=&@android:style/Theme.NoDisplay&&android:configChanges=&orientation|keyboardHidden&&&&&&android:name=&android.intent.action.VIEW.HIDE&&&&android:name=&android.intent.category.DEFAULT&&&&android:scheme=&content&&&&android:scheme=&file&&&&android:mimeType=&application/vnd.android.package-archive&&&&&&&&&android:name=&.UninstallerActivityHide&&android:theme=&@android:style/Theme.NoDisplay&&android:configChanges=&orientation|keyboardHidden&&android:excludeFromRecents=&true&&&&&&android:name=&android.intent.action.VIEW&&&&android:name=&android.intent.action.DELETE.HIDE&&&&android:name=&android.intent.category.DEFAULT&&&&android:scheme=&package&&&&&&&
2 实现PakkageInstallActivityHide.java,UninstallerActivityHide.java。 只需把PakkageInstallActivity.java修改去掉dialog和对话框。
3安装程序调用者发一个上面定义的intent即可。如下例子,静默安装/sdcard/hello.apk
卸载的方法类似。
Intent&install_hide_intent&=&new&Intent(&android.intent.action.VIEW.HIDE&);&install_hide_intent&.setDataAndType(Uri.parse(&file:///sdcard/hello.apk&),&&application/vnd.android.package-archive&);&&startActivityForResult(install_hide_intent,&INSTALL_RUSULT);&
&4注意,这个方法需要PackageInstall这个apk必须与系统一起编译。这个apk在/system/app/目录下面;android.intent.action.VIEW.HIDE 这个静默安装的接口需要开放给第三方。
&本文出自 “” 博客,谢绝转载!
了这篇文章
类别:┆阅读(0)┆评论(0)
03:14:36 00:54:49 09:12:40 19:14:39 20:20:28android 实现静默安装、卸载(图) - 为程序员服务
android 实现静默安装、卸载(图)
android中应用的安装卸载,大家(用android设备的)肯定不陌生。这里就来浅谈android应用的安装、卸载的实现方式。
1.系统安装程序
android自带了一个安装程序—/system/app/PackageInstaller.apk.大多数情况下,我们手机上安装应用都是通过这个apk来安装的。代码使用也非常简单:
/*&安装apk&*/
&&&&public&static&void&installApk(Context&context,&String&fileName)&{
&&&&&&&&Intent&intent&=&new&Intent();
&&&&&&&&intent.setAction(Intent.ACTION_VIEW);
&&&&&&&&intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
&&&&&&&&intent.setDataAndType(Uri.parse(“file://”&+&fileName),
&&&&&&&&&&&&&&&&“application/vnd.android.package-archive”);
&&&&&&&&context.startActivity(intent);
&&&&/*&卸载apk&*/
&&&&public&static&void&uninstallApk(Context&context,&String&packageName)&{
&&&&&&&&Uri&uri&=&Uri.parse(“package:”&+&packageName);
&&&&&&&&Intent&intent&=&new&Intent(Intent.ACTION_DELETE,&uri);
&&&&&&&&context.startActivity(intent);
通过发一个Intent,把应用所在的路径封装整uri.之后默认启动了PackageInstaller.apk来安装程序了。 但是此种情况下,仅仅是个demo而已,很难达到开发者的需求。如: &
什么时候安装完了,卸载完了呢?
为了达到自己的需求,相信很多人都会接着来监听系统安装卸载的广播,继续接下来的代码逻辑。
2.监听系统发出的安装广播
在安装和卸载完后,android系统会发一个广播
android.intent.action.PACKAGE_ADDED(安装)
android.intent.action.PACKAGE_REMOVED(卸载)
咱们就监听这广播,来做响应的逻辑处理。实现代码:
public&class&MonitorSysReceiver&extends&BroadcastReceiver{
&&&&@Override&&
&&&&public&void&onReceive(Context&context,&Intent&intent){
&&&&&&&&//接收安装广播&
&&&&&&&&if&(intent.getAction().equals(“android.intent.action.PACKAGE_ADDED”))&{&&&
&&&&&&&&&&&&//TODO&&&&
&&&&&&&&}&&&
&&&&&&&&//接收卸载广播&&
&&&&&&&&if&(intent.getAction().equals(“android.intent.action.PACKAGE_REMOVED”))&{&&&
&&&&&&&&&&&&//TODO
AndroidMenifast.xml里配置:
&&&receiver&android:name=”.MonitorSysReceiver”&&&&
&&&&&&&&&&&&&intent-filter&&&
&&&&&&&&&&&&&&action&android:name=”android.intent.action.PACKAGE_ADDED”&/&&&
&&&&&&&&&&&&&&action&android:name=”android.intent.action.PACKAGE_REMOVED”&/&&&
&&&&&&&&&&&&&/intent-filter&&&
&&&/receiver&
到此,确实安装卸载的整体流程都知道了,但是这个效果肯定是无法达到项目的需求。 一般这种应用商店类的项目,肯定是会要自定义提示框效果的安装卸载功能,而不是调用系统的安装程序。 那咱就要想法子实现静默安装、卸载咯。 网上有很多法子,如执行adb install 或pm install -r命令安装。但我想这并不可靠。记得之前有做过一个应用来执行linux命令,是通过RunTime来执行命令的。 后来发现其实并不靠谱,还不如直接用C代码来实现。 下面这种调用系统隐藏api接口来实现静默安装卸载,是比较大众靠谱的,实现自定义的提示界面。O(∩_∩)O~
3.系统隐藏的api
隐藏api,顾名思义,普通情况下肯定是调用不到的。翻翻源码\frameworks\base\core\java\android\content\pm目录下PackageManager.java,应该发现 在注释行里有加上@hide声明。调用的安装下载接口如下:
public&abstract&void&installPackage(Uri&packageURI,
&&&&&&&&&&&&IPackageInstallObserver&observer,&int&flags,
&&&&&&&&&&&&String&installerPackageName);
&public&abstract&void&deletePackage(String&packageName,
&IPackageDeleteObserver&observer,&int&flags);
并且都是抽象方法,需要咱们实现。&
看参数里IPackageInstallObserver &observer一个aidl回调通知接口,当前目录中找到这接口:
package&android.content.
&*&API&for&installation&callbacks&from&the&Package&Manager.
oneway&interface&IPackageInstallObserver&{
&&&&void&packageInstalled(in&String&packageName,&int&returnCode);
好吧,这里有现成的干货,咱拿过来直接用呗(当然如果没有源码的那就算了,那能实现的只是demo)。具体步骤:
从源码中拷贝要使用的aidl回调接口:IPackageInstallObserver.aidl、IPackageDeleteObserver.aidl当然完全可以拷贝整个pm目录,这样就不会报错了O(∩_∩)O~。
作者项目里面用到了pm,所以把PackageManager.java以及涉及到的一些文件也拷贝过来了,不然eclipse报找不到PackageManager对象。结构如下:
(注:此处的包名android.content.pm一定要和源码目录结构一致,不然源码里编译会提示找不到aidl接口。一切朝源码编译看齐) 此处有2种方式实现: 1.直接只取IPackageDeleteObserver.aidl和IPackagerInstallObserver.aidl、IPackageMoveObserver.aidl等要使用的接口,然后通过bindService来和系统连接服务,然后直接调用接口即可(这种没有方式作者没试过,不过原理上来说应该是可行的,除非系统没有这个Service实现这个接口。有需求的可以深究下) 2.作者此处的方法是直接拷贝了源码PackageManager.java等文件过来,不过靠过来之后eclipse会提示一些接口错误,但这里作者把上面那几个.java文件都放空了,因为用不到,只是为了编译过才拷贝了那么多文件。最简单的就是直接拷贝4个文件即可: PackageManager.java IPackageDeleteObserver.aidl IPackagerInstallObserver.aidl IPackageMoveObserver.aidl 然后把PackageManager.java中报的异常的接口都注释掉即可
实现回调接口,代码如下
class&MyPakcageInstallObserver&extends&IPackageInstallObserver.Stub&{
&&&&&&&&Context&
&&&&&&&&String&appN
&&&&&&&&String&
&&&&&&&&String&
&&&&&&&&public&MyPakcageInstallObserver(Context&c,&String&appName,
&&&&&&&&&&&&&&&&&String&filename,String&packagename)&{
&&&&&&&&&&&&this.cxt&=&c;
&&&&&&&&&&&&this.appName&=&appN
&&&&&&&&&&&&this.filename&=&
&&&&&&&&&&&&this.pkname&=&
&&&&&&&&@Override
&&&&&&&&public&void&packageInstalled(String&packageName,&int&returnCode)&{
&&&&&&&&&&&&Log.i(TAG,&“returnCode&=&”&+&returnCode);//&返回1代表安装成功
&&&&&&&&&&&&&&&&&&&&&&&&if&(returnCode&==&1)&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&//TODO
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&Intent&it&=&new&Intent();
&&&&&&&&&&&&it.setAction(CustomAction.INSTALL_ACTION);
&&&&&&&&&&&&it.putExtra(“install_returnCode”,&returnCode);
&&&&&&&&&&&&it.putExtra(“install_packageName”,&packageName);
&&&&&&&&&&&&it.putExtra(“install_appName”,&appName);&cxt.sendBroadcast(it);
卸载回调接口同上。
调用PackageManager.java隐藏方法,代码如下:
&&&&&*&静默安装
&&&&public&static&void&autoInstallApk(Context&context,&String&fileName,
&&&&&&&&&&&&String&packageName,&String&APPName)&{
&&&&&&&&Log.d(TAG,&“jing&mo&an&zhuang:”&+&packageName&+&“,fileName:”&+&fileName);
&&&&&&&&File&file&=&new&File(fileName);
&&&&&&&&int&installFlags&=&0;
&&&&&&&&if&(!file.exists())
&&&&&&&&&&&&
&&&&&&&&installFlags&|=&PackageManager.INSTALL_REPLACE_EXISTING;
&&&&&&&&if&(hasSdcard())&{
&&&&&&&&&&&&installFlags&|=&PackageManager.INSTALL_EXTERNAL;
&&&&&&&&PackageManager&pm&=&context.getPackageManager();
&&&&&&&&try&{
&&&&&&&&&&&&IPackageInstallObserver&observer&=&new&MyPakcageInstallObserver(
&&&&&&&&&&&&&&&&&&&&context,&APPName,&appId,&fileName,packageName,type_name);
&&&&&&&&&&&&Log.i(TAG,&“########installFlags:”&+&installFlags+”packagename:”+packageName);
&&&&&&&&&&&&pm.installPackage(Uri.fromFile(file),&observer,&installFlags,
&&&&&&&&&&&&&&&&&&&&packageName);
&&&&&&&&}&catch&(Exception&e)&{
卸载调用同上
很多码友联系,这里经常出错,现整理参考代码如下(下面代码有些格式问题):
package&cn.
import&java.io.F
import&android.content.ContentR
import&android.content.ContentV
import&android.content.C
import&android.content.I
import&android.content.SharedP
import&android.content.pm.IPackageDeleteO
import&android.content.pm.IPackageInstallO
import&android.content.pm.IPackageMoveO
import&android.content.pm.PackageM
import&android.net.U
import&android.os.E
import&android.os.RemoteE
import&android.util.L
public&class&ApkOperateManager&{
&&&&public&static&String&TAG&=&“ApkOperateManager”;
&&&&/***安装apk&*/
&&&&public&static&void&installApk(Context&context,&String&fileName)&{
&&&&&&&&Intent&intent&=&new&Intent();
&&&&&&&&intent.setAction(Intent.ACTION_VIEW);
&&&&&&&&intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
&&&&&&&&intent.setDataAndType(Uri.parse(“file://”&+&fileName),
&&&&&&&&&&&&&&&&“application/vnd.android.package-archive”);
&&&&&&&&context.startActivity(intent);
&&&&/**卸载apk&*/
&&&&public&static&void&uninstallApk(Context&context,&String&packageName)&{
&&&&&&&&Uri&uri&=&Uri.parse(“package:”&+&packageName);
&&&&&&&&Intent&intent&=&new&Intent(Intent.ACTION_DELETE,&uri);
&&&&&&&&context.startActivity(intent);
&&&&&*&静默安装
&&&&public&static&void&installApkDefaul(Context&context,&String&fileName,
&&&&&&&&&&&&String&packageName,&String&APPName,&String&appId,&String&type_name)&{
&&&&&&&&Log.d(TAG,&“jing&mo&an&zhuang:”&+&packageName&+&“,fileName:”&+&fileName
&&&&&&&&&&&&&&&&+&“,type_name:”&+&type_name);
&&&&&&&&File&file&=&new&File(fileName);
&&&&&&&&int&installFlags&=&0;
&&&&&&&&if&(!file.exists())
&&&&&&&&&&&&
&&&&&&&&installFlags&|=&PackageManager.INSTALL_REPLACE_EXISTING;
&&&&&&&&if&(hasSdcard())&{
&&&&&&&&&&&&installFlags&|=&PackageManager.INSTALL_EXTERNAL;
&&&&&&&&PackageManager&pm&=&context.getPackageManager();
&&&&&&&&//&try&{&&try&{
&&&&&&&&&&&&IPackageInstallObserver&observer&=&new&MyPakcageInstallObserver(
&&&&&&&&&&&&&&&&&&&&context,&APPName,&appId,&fileName,&packageName,&type_name);
&&&&&&&&&&&&Log.i(TAG,&“########installFlags:”&+&installFlags&+&“packagename:”
&&&&&&&&&&&&&&&&&&&&+&packageName);
&&&&&&&&&&&&pm.installPackage(Uri.fromFile(file),&observer,&installFlags,
&&&&&&&&&&&&&&&&&&&&packageName);
&&&&&&&&}&catch&(Exception&e)&{
&&&&&&&&&&&&((MarketApplication)&context).setApp_detail_status(appId,
&&&&&&&&&&&&&&&&&&&&MarketApplication.APP_STATUS_NOTEXIT);
&&&&/*&静默卸载&*/
&&&&public&static&void&uninstallApkDefaul(Context&context,&String&action,
&&&&&&&&&&&&String&packageName)&{
&&&&&&&&PackageManager&pm&=&context.getPackageManager();
&&&&&&&&IPackageDeleteObserver&observer&=&new&MyPackageDeleteObserver(context,
&&&&&&&&&&&&&&&&action,&packageName);
&&&&&&&&pm.deletePackage(packageName,&observer,&0);
&&&&/*&静默卸载回调&*/
&&&&&&&&&&&&&private&static&class&MyPackageDeleteObserver&extends
&&&&&&&&&&&&IPackageDeleteObserver.Stub&{
&&&&&&&&Context&
&&&&&&&&String&
&&&&&&&&String&
&&&&&&&&public&MyPackageDeleteObserver(Context&c,&String&action,&String&pkname)&{
&&&&&&&&&&&&this.cxt&=&c;
&&&&&&&&&&&&this.action&=&
&&&&&&&&&&&&this.pkname&=&
&&&&&&&&@Override
public&void&packageDeleted(String&packageName,&int&returnCode)&{
&&&&&&&&&&&&Log.d(TAG,&“returnCode&=&”&+&returnCode&+&“,action:”&+&action
&&&&&&&&&&&&&&&&&&&&+&“packageName:”&+&packageName&+&“,pkname:”&+&pkname);//&返回1代表卸载成功
&&&&&&&&&&&&if&(returnCode&==&1)&{//TODO&以下是删除数据库记录,只做参考
&&&&&&&&&&&&&&&&/*SharedPreferences&installedAPPInfo&=&cxt.getSharedPreferences(
&&&&&&&&&&&&&&&&&&&&&&&&“installedAPPInfo”,&Context.MODE_WORLD_READABLE);
&&&&&&&&&&&&&&&&if&(installedAPPInfo.contains(packageName))&{
&&&&&&&&&&&&&&&&&&&&String&appId&=&installedAPPInfo.getString(packageName,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&“no&this&appId”);
&&&&&&&&&&&&&&&&&&&&((MarketApplication)&cxt.getApplicationContext())
&&&&&&&&&&&&&&&&&&&&&&&&&&&&.setApp_detail_status(appId,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&MarketApplication.APP_STATUS_NOTEXIT);
&&&&&&&&&&&&&&&&&&&&installedAPPInfo.edit().remove(packageName).commit();
&&&&&&&&&&&&&&&&&&&&ContentResolver&conResolver&=&cxt.getContentResolver();
&&&&&&&&&&&&&&&&&&&&conResolver.delete(InstalledAppInfo.CONTENT_URI,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&InstalledAppInfo.APP_PKNAME&+&”&=&”&+&“‘”&+&pkname
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&+&“‘”,&null);
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&MarketApplication&ma&=&((MarketApplication)&cxt
&&&&&&&&&&&&&&&&&&&&&&&&.getApplicationContext());
&&&&&&&&&&&&&&&&Log.e(TAG,&“###packageDeleted###111size:”
&&&&&&&&&&&&&&&&&&&&&&&&+&ma.getManagerLists().size());
&&&&&&&&&&&&&&&&ma.removeManagerItem(pkname);
&&&&&&&&&&&&&&&&ma.removeUpdateItem(pkname);
&&&&&&&&&&&&&&&&Log.e(TAG,&“##packageDeleted####22222size:”
&&&&&&&&&&&&&&&&&&&&&&&&+&ma.getManagerLists().size());*/
&&&&&&&&&&&&}
&&&&&&&&&&&&Intent&it&=&new&Intent();
&&&&&&&&&&&&it.setAction(action);
&&&&&&&&&&&&it.putExtra(“uninstall_returnCode”,&returnCode);
&&&&&&&&&&&&cxt.sendBroadcast(it);
&&&&/*&静默安装回调&*/
&&&&private&static&class&MyPakcageInstallObserver&extends
&&&&&&&&&&&&IPackageInstallObserver.Stub&{
&&&&&&&&Context&
又一个码农站点
原文地址:, 感谢原作者分享。
您可能感兴趣的代码

我要回帖

更多关于 android静默更新apk 的文章

 

随机推荐