Android PackageInstaller 安装和卸载

应用的安装方式:adb install或者下载安装

过程分析请参考老罗的blog,这里记录一下第三方应用程序安装apk的过程。

安装的过程主要是调用PackageInstaller这个App,源代码的位置在package/app/PackageInstaller

AndroidManifest.xml如下,

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.android.packageinstaller">

    <original-package android:name="com.android.packageinstaller" />

    <uses-permission android:name="android.permission.INSTALL_PACKAGES" />
    <uses-permission android:name="android.permission.DELETE_PACKAGES" />
    <uses-permission android:name="android.permission.CLEAR_APP_CACHE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.CLEAR_APP_USER_DATA" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.MANAGE_USERS" />
    <application android:label="@string/app_name"
            android:allowBackup="false"
            android:theme="@android:style/Theme.DeviceDefault.DialogWhenLarge.NoActionBar">
        <activity android:name=".PackageInstallerActivity"
                android:configChanges="orientation|keyboardHidden|screenSize"
                android:excludeFromRecents="true">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <action android:name="android.intent.action.INSTALL_PACKAGE" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:scheme="file" />
                <data android:mimeType="application/vnd.android.package-archive" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.INSTALL_PACKAGE" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:scheme="file" />
                <data android:scheme="package" />
            </intent-filter>
        </activity>
        <activity android:name=".InstallAppProgress"
                android:configChanges="orientation|keyboardHidden|screenSize">
        </activity>
        <activity android:name=".UninstallerActivity"
                android:configChanges="orientation|keyboardHidden|screenSize"
                android:excludeFromRecents="true"
                android:theme="@android:style/Theme.DeviceDefault.Dialog.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.DELETE" />
                <action android:name="android.intent.action.UNINSTALL_PACKAGE" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:scheme="package" />
            </intent-filter>
        </activity>
        <activity android:name=".UninstallAppProgress"
                android:configChanges="orientation|keyboardHidden|screenSize">
        </activity>
        <!--
        <receiver android:name=".RemoveReceiver">
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_FULLY_REMOVED" />
                <data android:scheme="package" />
            </intent-filter>
        </receiver>
        -->
    </application>
</manifest> 

安装和卸载APP主要用到了PackageInstallerActivity和UninstallActivity。

安装一个应用程序的过程如下:

String fileName = Environment.getExternalStorageDirectory() + "/myApp.apk";   
Intent intent = new Intent(Intent.ACTION_VIEW);   
intent.setDataAndType(Uri.fromFile(new File(fileName)), "application/vnd.android.package-archive");   
startActivity(intent); 

卸载一个应用程序的过程如下:

Uri packageURI = Uri.parse("package:com.android.myapp");   
Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI);   
startActivity(uninstallIntent);  

默认是不支持非市场安装的,这里可判断一下:

int result = Settings.Secure.getInt(getContentResolver(),
 Settings.Secure.INSTALL_NON_MARKET_APPS, 0);   
if (result == 0) {   
// show some dialog here   
// ...   
// and may be show application settings dialog manually   
Intent intent = new Intent();   
intent.setAction(Settings.ACTION_APPLICATION_SETTINGS);   
startActivity(intent);   
} 

    原文作者:aiai373824745
    原文地址: https://blog.csdn.net/aiai373824745/article/details/12995275
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞