android升級安裝包--包解析錯誤

Paste_Image.png

最近在搞應(yīng)用升級的時候猩谊,7.0以下的手機(jī)都直接升級成功了锭吨。7.0的華為手機(jī)直接報這個錯誤径荔。

先分析一下包解析錯誤的各種原因

1 apk版本不兼容休讳。一般情況下當(dāng)從網(wǎng)上下載的apk程序版本比當(dāng)前設(shè)備的版本高時,就會在安裝程序時出現(xiàn)“解析包時出現(xiàn)錯誤”的警告赵哲。對此類情況的解決辦法是:就該款apk程序,查找同類對應(yīng)的但是版本應(yīng)不高于當(dāng)前設(shè)備版本的應(yīng)用程序進(jìn)行下載君丁、安裝和使用枫夺。

2 apk程序不完整。有些設(shè)備自帶的下載工具不具有斷點(diǎn)續(xù)傳功能绘闷,因而下載的程序可能發(fā)生下載不完全橡庞、程序部分先失等情況。

3 當(dāng)前設(shè)備不支持中文名稱或路徑烂斋,不支持長文件名籽腕。 解決辦法是將文件重命名赏殃,名稱只包含英文字母(但要注意".apk"的后輟名是要保留的),如更名為“abc.apk”等吧趣,更改完成后再次運(yùn)動安裝程序。

4 設(shè)備內(nèi)存不足或U盤質(zhì)量不好等因素導(dǎo)致apk程序無法正常安裝耙厚。即使存入內(nèi)存的數(shù)據(jù)容量大于實(shí)際內(nèi)存容量强挫,程序也不會報錯,但其實(shí)數(shù)據(jù)早已丟失薛躬。對于這種情況俯渤,apk程序肯定無法安裝成功。

5 指定的文件路徑不存在或指定了錯誤的路徑型宝。

6 apk安裝器可能不兼容八匠。

7 設(shè)備可能中毒。 進(jìn)行病毒的查殺趴酣,確保設(shè)備處于最佳安全運(yùn)行狀態(tài)梨树。

二、舉例我一個項(xiàng)目中的例子

我在下載安裝包的時候沒有適配好7.0的一些路徑价卤,導(dǎo)致一直包解析錯誤劝萤。

    /**
     * @描述 下載更新app
     */
    private void downLoadApk(String url) {
 
        /*okttp下載*/
        OkHttpUtils.get()
            .url(url)
            .build()
            .execute(new FileCallBack(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath(), dowmApkNames)
            {

                @Override
                public void onError(Call call, Exception e, int id) {
                    LogUtils.log("下載失敗");                    
                }

                @Override
                public void inProgress(float progress, long total, int id) {
                    super.inProgress(progress, total, id);
                    LogUtils.log("下載進(jìn)度: "+progress+"  -total: "+total+"  -id:"+id);
                }

                @Override
                public void onResponse(File response, int id) {

                    LogUtils.log("下載成功"+");
                    Intent intent = new Intent(Intent.ACTION_VIEW);
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);// 以新壓入棧

                    if (GlobalConfig.VerMoreThenM) {//7.0手機(jī)適配
                        Uri apkUri = FileProvider.getUriForFile(mContext, mContext.getPackageName() + ".provider", response);
                        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                        intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
                    }else{
                        intent.addCategory("android.intent.category.DEFAULT");
                        intent.setDataAndType(Uri.fromFile(response.getAbsoluteFile()),
                                "application/vnd.android.package-archive");

                    }

                    mContext.startActivity(intent);
                  

                }
            });
    }
三、 以下是收集到的一些相關(guān)的說法

(一)原文

開始懷疑是android的版本問題慎璧,后來看了一下在華為Mate8上面也能正常安裝床嫌,華為Mate8和華為P9都是android6.0
華為P9 用的是 EMUI 4.1版本跨释,但是華為Mate8用的是EMUI4.0, 初步懷疑是EMUI升級后的問題

05-14 19:51:04.094: E/HwCertificationManager(1004): read cert error:read certification file error!
05-14 19:51:04.094: E/HwCertificationManager(1004): read cert failed
05-14 19:51:04.094: E/HwCertificationManager(1004): checkHwCertification parse error
05-14 19:51:04.095: E/installd(534): Couldn't opendir /data/data/com.shb.assistant: No such file or directory
05-14 19:51:04.096: W/PackageManager(1004): Package couldn't be installed in /data/app/com.shb.assistant-1
05-14 19:51:04.096: W/PackageManager(1004): com.android.server.pm.PackageManagerException: hwcertification parse error
05-14 19:51:04.096: W/PackageManager(1004):     at com.android.server.pm.HwPackageManagerService.checkCertificationInner(HwPackageManagerService.java:3042)
05-14 19:51:04.096: W/PackageManager(1004):     at com.android.server.pm.HwPackageManagerService.checkHwCertification(HwPackageManagerService.java:3024)
05-14 19:51:04.096: W/PackageManager(1004):     at com.android.server.pm.PackageManagerService.scanPackageLI(PackageManagerService.java:6941)
05-14 19:51:04.096: W/PackageManager(1004):     at com.android.server.pm.PackageManagerService.scanPackageLI(PackageManagerService.java:6930)
05-14 19:51:04.096: W/PackageManager(1004):     at com.android.server.pm.PackageManagerService.installNewPackageLI(PackageManagerService.java:12494)
05-14 19:51:04.096: W/PackageManager(1004):     at com.android.server.pm.PackageManagerService.installPackageLI(PackageManagerService.java:13215)
05-14 19:51:04.096: W/PackageManager(1004):     at com.android.server.pm.PackageManagerService.-wrap29(PackageManagerService.java)
05-14 19:51:04.096: W/PackageManager(1004):     at com.android.server.pm.PackageManagerService$10.run(PackageManagerService.java:10799)
05-14 19:51:04.096: W/PackageManager(1004):     at android.os.Handler.handleCallback(Handler.java:743)
05-14 19:51:04.096: W/PackageManager(1004):     at android.os.Handler.dispatchMessage(Handler.java:95)
05-14 19:51:04.096: W/PackageManager(1004):     at android.os.Looper.loop(Looper.java:150)
05-14 19:51:04.096: W/PackageManager(1004):     at android.os.HandlerThread.run(HandlerThread.java:61)
05-14 19:51:04.096: W/PackageManager(1004):     at com.android.server.ServiceThread.run(ServiceThread.java:46)
05-14 19:51:04.115: I/art(1004): Starting a blocking GC Explicit

分析應(yīng)該是安裝軟件的時候厌处,進(jìn)行了證書的檢查鳖谈,發(fā)現(xiàn)軟件不符合條件,導(dǎo)致不能安裝阔涉。
翻看一下源代碼:scanPackageLI 這個應(yīng)該是對APK里的文件進(jìn)行解析缆娃,但是華為肯定是修改了這個函數(shù),添加了一個checkHwCertification的過程瑰排。
checkHwCertification里面應(yīng)該是檢查了華為特有的東西贯要。


打開代碼 在AndroidManifest.xml 找找有有沒有什么華為比較在乎需要檢查的東西,椭住,一看果然發(fā)現(xiàn)了下個崇渗。

<!--華為角標(biāo)-->
<uses-permissionandroid:name="com.huawei.android.launcher.permission.CHANGE_BADGE"/>
<uses-permissionandroid:name="com.huawei.permission.sec.MDM"/>

把這兩個權(quán)限一刪除,軟件就可以正常安裝了京郑。
打開華為的官方文檔宅广,找到下面一段說明:
2.3 將華為證書打包到開發(fā)者應(yīng)用中
使用上面提到的“DevPack.exe”工具,將剛剛下載的華為證書打包到開發(fā)者 APK 中:
到這里原因以及很明白了些举,就是開發(fā)這沒有把證書加入到APK里面跟狱,導(dǎo)致安裝的檢查證書不通過。安裝失敗户魏。

但是華為也很不地道驶臊,之前都沒有這個過程,到P9上忽然加上這個限制绪抛,沒有任何說明资铡,直接就是軟件安裝失敗。讓廣大開發(fā)者情何以堪幢码。做android應(yīng)用開發(fā)的小伙伴真是不容易笤休,要應(yīng)付形形色色的奇葩兼容性問題。
解決方案:

1 去掉角標(biāo)功能症副,一般的應(yīng)用是無法通過華為的審核的店雅。在 AndroidManifest.xml刪除下面的權(quán)限申明:

<!--華為角標(biāo)-->
<uses-permissionandroid:name="com.huawei.android.launcher.permission.CHANGE_BADGE"/>
<uses-permissionandroid:name="com.huawei.permission.sec.MDM"/>

2 把華為的證書打包到應(yīng)用里面。

(二)第二種說法

android 7.0引入了v2的apk簽名方案贞铣,一個新的app簽名方案闹啦,它提供了更快的app安裝時間和更多針對未授權(quán) APK 文件更改的保護(hù)。默認(rèn)情況下辕坝,android studio 2.2和android gradle 插件2.2窍奋,他們都能使用v2和傳統(tǒng)的簽名方式來簽名你的應(yīng)用程序。

雖然我們推薦使用v2的apk簽名方案,這個新方案不是強(qiáng)制的琳袄。當(dāng)使用v2的簽名方案時江场,如果你的應(yīng)用程序不能正確的構(gòu)建,你就可以放棄這個新方案窖逗。禁用過程會導(dǎo)致 Android Studio 2.2 和 Android Gradle 2.2 插件只能夠使用傳統(tǒng)簽名方案來簽署你的應(yīng)用程序址否。對于只使用傳統(tǒng)方式來簽名,打開build.gradle文件碎紊,在你的釋放版本的簽名配置中添加v2SigningEnabled false佑附。

警告:如果你使用v2來簽名你的應(yīng)用程序,并對應(yīng)用進(jìn)一步修改仗考,則app簽名將無效音同。因?yàn)檫@個原因,請在使用v2簽名之前秃嗜,使用zipalign工具瘟斜,而不是之后使用。

關(guān)于更多信息痪寻,請閱讀介紹如何在 Android Studio 中簽名一個app,以及如何使用 Android Gradle 插件來為簽名app配置build文件虽惭。

signingConfigs {

release {

  storeFilefile("keystore")

  storePassword"keystore的密碼"

  keyAlias"keyAlias"

  keyPassword"keystore的密碼"
  // 作用是只使用舊版簽名橡类,禁用V2版簽名模式
  v2SigningEnabled false 

}
三、參考

Android7.0適配心得
Android7.0 對于開發(fā)者來說的35條重要新功能
":"引發(fā)的血案

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末芽唇,一起剝皮案震驚了整個濱河市顾画,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌匆笤,老刑警劉巖研侣,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異炮捧,居然都是意外死亡庶诡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門咆课,熙熙樓的掌柜王于貴愁眉苦臉地迎上來末誓,“玉大人,你說我怎么就攤上這事书蚪±瑁” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵殊校,是天一觀的道長晴玖。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么呕屎? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任让簿,我火速辦了婚禮,結(jié)果婚禮上榨惰,老公的妹妹穿的比我還像新娘拜英。我一直安慰自己,他們只是感情好琅催,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布居凶。 她就那樣靜靜地躺著,像睡著了一般藤抡。 火紅的嫁衣襯著肌膚如雪侠碧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天缠黍,我揣著相機(jī)與錄音弄兜,去河邊找鬼。 笑死瓷式,一個胖子當(dāng)著我的面吹牛替饿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播贸典,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼视卢,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了廊驼?” 一聲冷哼從身側(cè)響起据过,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎妒挎,沒想到半個月后绳锅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡酝掩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年鳞芙,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片庸队。...
    茶點(diǎn)故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡积蜻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出彻消,到底是詐尸還是另有隱情竿拆,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布宾尚,位于F島的核電站丙笋,受9級特大地震影響谢澈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜御板,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一锥忿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧怠肋,春花似錦敬鬓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至杈抢,卻和暖如春数尿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背惶楼。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工右蹦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人歼捐。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓何陆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親豹储。 傳聞我的和親對象是個殘疾皇子甲献,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,871評論 25 707
  • 花落曉煙迷,亂云往復(fù)回颂翼。問東風(fēng)老去何為?不見寒江催日短慨灭,暗回首朦乏,遠(yuǎn)峰低。 殘燭破幽思氧骤,鴉啼夜漏遲呻疹。但樽前醉語誰知?...
    圓月閱讀 284評論 2 4
  • 身邊的朋友分分離離太多對筹陵,我說刽锤,各位在這樣老娘我不再相信耐情了;大家笑話我說還像長不大的寶寶朦佩,耐情與現(xiàn)實(shí)兩...
    發(fā)瘋的二貨閱讀 463評論 0 0
  • 五十 生活恰似 糖葫蘆 酸酸甜甜 五十一 快樂似一面鏡子 我在里面 你在外面 五十二 朋友如詩 以春秋為證 時間做...
    蕭路遙閱讀 230評論 0 0
  • 簡悅直播教練恬源閱讀 176評論 0 1