1. 程式人生 > >android 5.0 apk 安裝失敗提示INSTALL_FAILED_INVALID_URI

android 5.0 apk 安裝失敗提示INSTALL_FAILED_INVALID_URI

在android 5.0 專案上開發的時候,進入U盤目錄,通過pm 命令安裝apk,發現安裝失敗,提示apk路徑不對。

安裝log資訊如下:

cd /mnt/usb/2D80-E3ED/APK_backup

[email protected]:/mnt/usb/2D80-E3ED/APK_backup # pm install AndyKeyTest.apk       
        pkg: AndyKeyTest.apk
Failure [INSTALL_FAILED_INVALID_URI]

logcat資訊:

01-01 08:20:49.955 D/AndroidRuntime( 2952): Calling main entry com.android.commands.pm.Pm
01-01 08:20:49.968 W/asset   ( 2734): Asset path /AndyKeyTest.apk is neither a directory nor file (type=1).
--------- beginning of system
01-01 08:20:49.968 W/DefContainer( 2734): Failed to parse package at /AndyKeyTest.apk: android.content.pm.PackageParser$PackageParserException: Failed to parse /AndyKeyTest.apk

通過log資訊及測試發現,原來在android5.0中不能直接在u盤目錄下執行pm install 安裝apk ,必須到要在pm 命令帶上apk所在路勁。更早的android版本沒有這個要求

改為在根目錄下,執行下面命令,則安裝apk成功

[email protected]:/ # pm install mnt/usb/2D80-E3ED/APK_backup/AndyKeyTest.apk 
       pkg: mnt/usb/2D80-E3ED/APK_backup/AndyKeyTest.apk
Success

針對上面的問題,查看了一下原始碼,發現android 5.0 的parsePackage功能在細節上有一些更改,所以出現上面的情況。

相關程式碼如下:

[email protected]

    /**
     * Parse only lightweight details about the package at the given location.
     * Automatically detects if the package is a monolithic style (single APK
     * file) or cluster style (directory of APKs).
     * <p>
     * This performs sanity checking on cluster style packages, such as
     * requiring identical package name and version codes, a single base APK,
     * and unique split names.
     *
     * @see PackageParser#parsePackage(File, int)
     */
    public static PackageLite parsePackageLite(File packageFile, int flags)
            throws PackageParserException {
        if (packageFile.isDirectory()) {
            return parseClusterPackageLite(packageFile, flags);
        } else {
            return parseMonolithicPackageLite(packageFile, flags);
        }
    }

[email protected]

        /**
         * Parse given package and return minimal details.
         *
         * @param packagePath absolute path to the package to be copied. Can be
         *            a single monolithic APK file or a cluster directory
         *            containing one or more APKs.
         */
        @Override
        public PackageInfoLite getMinimalPackageInfo(String packagePath, int flags,
                String abiOverride) {
            final Context context = DefaultContainerService.this;
            final boolean isForwardLocked = (flags & PackageManager.INSTALL_FORWARD_LOCK) != 0;

            PackageInfoLite ret = new PackageInfoLite();
            if (packagePath == null) {
                Slog.i(TAG, "Invalid package file " + packagePath);
                ret.recommendedInstallLocation = PackageHelper.RECOMMEND_FAILED_INVALID_APK;
                return ret;
            }

            final File packageFile = new File(packagePath);
            final PackageParser.PackageLite pkg;
            final long sizeBytes;
            try {
                pkg = PackageParser.parsePackageLite(packageFile, 0);
                sizeBytes = PackageHelper.calculateInstalledSize(pkg, isForwardLocked, abiOverride);
            } catch (PackageParserException | IOException e) {
                Slog.w(TAG, "Failed to parse package at " + packagePath + ": " + e);

                if (!packageFile.exists()) {
                    ret.recommendedInstallLocation = PackageHelper.RECOMMEND_FAILED_INVALID_URI;
                } else {
                    ret.recommendedInstallLocation = PackageHelper.RECOMMEND_FAILED_INVALID_APK;
                }

                return ret;
            }

            ret.packageName = pkg.packageName;
            ret.versionCode = pkg.versionCode;
            ret.installLocation = pkg.installLocation;
            ret.verifiers = pkg.verifiers;
            ret.recommendedInstallLocation = PackageHelper.resolveInstallLocation(context,
                    pkg.packageName, pkg.installLocation, sizeBytes, flags);
            ret.multiArch = pkg.multiArch;

            return ret;
        }



相關推薦

android 5.0 apk 安裝失敗提示INSTALL_FAILED_INVALID_URI

在android 5.0 專案上開發的時候,進入U盤目錄,通過pm 命令安裝apk,發現安裝失敗,提示apk路徑不對。 安裝log資訊如下: cd /mnt/usb/2D80-E3ED/APK_backup [email protected]:/mnt/usb/2D80-E3ED/APK_back

通過Android studio生成apk安裝失敗

自己寫了個東西虛擬機器除錯通過,想在手機測試一下,找到apk檔案,傳到手機發現如圖所示-_-||。 我日這什麼情況 讓後百度,谷歌 ---------------------------------------------------------------------

Android Studio 生成apk安裝失敗 Run app : Installation error code: -15 / INSTALL_FAILED_TEST_ONLY

寫在前面最近又在使用Windows系統了。作業系統變了,環境也變了,問題也隨之而來哦~用AS Run了一個程式碼,生成了apk進行安裝。但是不幸的事情是,我的小米手機提示,未安裝(也就是安裝失敗了)。檢視logcat 提示:Installation error code: -

安裝node-v4.5.0-x86.msi時提示node.js setup wizard ended prematurely Win7安裝nodejs失敗解決方法

文章總共3個方法,後兩個方法可安裝成功 方法1:在網上搜索node.js setup wizard ended prematurely時找到一個參考解決方法 參考地址:http://blog.csdn.net/fense_520/article/details/41109541

android 7.0分享朋友圈提示:“獲取資源失敗,僅支援分享照片至朋友圈”或者FileProvider生成的Uri無法識別

需求是把網路圖片地址是string型別,生成圖片,分享到朋友圈,遇到的問題是,7.0之前沒有問題分享朋友圈,順便切上程式碼: Intent intent = new Intent(); Uri uri = null; try { Stri

android 5.0 64bit系統載入庫檔案失敗問題淺析

最近公司的一個專案使用android 5.0 64 bit平臺,相對以前版本,除了android 5.0 有很大變動之外,64 bit系統和32 bit系統也存在很多差異性。 目前碰到的問題就是以前在32位上的so庫檔案,到64 位系統上不能載入的問題。首先來看一下相關lo

解決因第三方sdk,unity打包出來的apkandroid 5.0以下向量圖相容問題的崩潰

android一直以來,對往下低版本的相容做的就不好,而且工具流沒事還總變,搞起來真的是讓人禿頭 android 5.0 以後開始能使用向量圖功能了,也就是Android Vector,但是5.0以下沒這個功能呀,所以你在編譯的時候,需要增加一個編譯引數和靜態

android 7.0之後安裝apk

android 7.0行為變更中系統許可權的更改裡面提到: 傳遞軟體包網域外的 file:// URI 可能給接收器留下無法訪問的路徑。因此,嘗試傳遞 file:// URI 會觸發 FileUriE

Android Studio打包的APK安裝失敗問題

release及debug版本均安裝失敗,build->build APK(s)來生成apk可以安裝成功。 參考:https://stackoverflow.com/questions/25274296/adb-install-fails-with-install-

修復android 5.0 Xutils的框架問題retry error, curr request is null

top ims 訂閱 height trac ber request ext key Android 5.0手機對xUtils-2.6.13.jar請求時會出現retry error, curr request is null 情況, 修復解決方式:

Android 5.0 Lollipop介紹

seq 手勢 不包含 傾斜 pan 配色方案 lol for gles Android Lollipop介紹 Android 5.0 Lollipop,此版本為用戶提供了豐富的新功能,並為開發者新增了數以千計的 API,它進一步擴展了 Android 的應用範圍,從手機

GreenPlum 5.0安裝

dmi configure tlist xtra dbid art als isa its 基本環境: serverIP MDW 172.16.16.31 SDW1 172.16.16.34 SDW2 172.16.1

python安裝失敗提示“one or more issues caused the setup to fail . Please fix the issues and then retry setup.For more information see the log file”

ase ice body orm bubuko mat 解決方法 3.4 mage 換了項目組,換了新電腦,重裝Python時遇到提示如下圖所示: 原因:需要安裝Windows 7 Service Pack 1 直接點擊“update your

Android探究2:Android 5.0下 Dialog&AlertDialog 並不會影響Activity的生命周期

lac wid cancel test () onclick posit make div 先給出結論:Dialog和AlertDialog並不會影響到Activity的生命周期,但會影響到Activity的優先級。 核心代碼: onCreated中:

Android 5.0+高級動畫開發 矢量圖動畫 軌跡動畫 路徑變換

Android 第1章 課程介紹為了成就更多高逼格的人才,我專門整理了Android5.0以後主推的實現酷炫動畫的新技術,教你掌握實現動畫的高逼格技巧。課程中我會詳細講解每個動畫效果實現的原理和所用的技術,並帶你一步一步的實現每個動畫效果,讓你在學完本次課程後,能夠舉一反三,再也不必擔心設計MM的設計你沒法實

Android 5.0 行為變更

rmi camera rec about md5 加密 進行 評估 訪問權限 stream Android 5.0 除了提供諸多新特性和功能外,還對系統和 API 行為做出了各種變更。本文重點介紹您應該了解並在開發應用時加以考慮的一些主要變更。 如果您之前發布過 Andro

Android API 28 訪問伺服器失敗 提示CLEARTEXT

解決方法: 參考https://blog.csdn.net/castanea/article/details/81256422 在res下新建一個xml目錄 建立名為network_security_config.xml 檔案 ,該檔案內容如下: <?xml version="1.

如何解決Android 5.0中出現的警告:Service Intent must be explicit

有些時候我們使用Service的時需要採用隱私啟動的方式,但是Android 5.0一出來後,其中有個特性就是 Service Intent  must be explitict ,也就是說從Lollipop開始,service服務必須採用顯示方式啟動。

APK安裝失敗的原因和解決方案

1.  手機系統記憶體剩餘空間不足,導致安裝失敗:提示情形: a. 提示為“ADB_INSTALL_FAILED_INSUFFICIENT_STORAGE”,意為手機儲存空間不足; b. 提示為“ADB_INSTALL_FAILED_DEXOPT”,意為因手機

MySQL 5.1版本安裝失敗解決方案

  MySQL 5.1版本安裝失敗解決方案 1.首先解除安裝已經安裝過的MySQL,解除安裝最好在系統自帶的解除安裝中進行,具體方法如下:     1)點選“開始選單”---“控制面板”---“程式”,點選“程式”中的“解除安裝程式”;