下載安裝APK(兼容Android7.0)

2021-02-14 老於的筆記

我們使用手機的時候經常會看到應用程式提示升級,大部分應用內部都需要實現升級提醒和應用程式文件(APK文件)下載。

一般寫法都差不多,比如在啟動app的時候,通過api接口獲得伺服器最新的版本號,然後和本地的版本號比較,來判斷是否需要彈出提示框下載,當然也可以通過推送的自定義消息來實現。

我們這裡主要討論的是應用程式下載,並在通知欄提醒下載完成。
實現過程大致分為三步:

創建一個service

在service啟動的時候創建一個廣播接受者,用於接受下載完成的廣播

當BroadcastReceiver接受到下載完成的廣播時,開始執行安裝。

主要通過系統提供的DownloadManager進行下載,DownloadManager下載完成會發送廣播,具體使用看下面完整的代碼。下面創建新的文件DownloadService.java






上面代碼使用了RxPermissions第三方庫動態申請權限,需要在app/build.gradle文件中進行配置


記得要配置服務


最後在MainActivity中添加按鈕,執行操作。運行結果:


當下載的時候,會有通知欄進度條提示。下載完成會提示安裝。不過當前程序如果在Android7.0上就會報錯。下面是報錯的日誌:


Caused by: android.os.FileUriExposedException

這是由於Android7.0執行了「StrictMode API 政策禁」的原因,不過小夥伴們不用擔心,可以用FileProvider來解決這一問題,

現在我們就來一步一步的解決這個問題。

Android 7.0錯誤原因

隨著Android版本越來越高,Android對隱私的保護力度也越來越大。

比如:Android6.0引入的動態權限控制(Runtime Permissions),Android7.0又引入「私有目錄被限制訪問」,「StrictMode API 政策」。

這些更改在為用戶帶來更加安全的作業系統的同時也為開發者帶來了一些新的任務。如何讓你的APP能夠適應這些改變而不是crash,是擺在每一位Android開發者身上的責任。

「私有目錄被限制訪問「 是指在Android7.0中為了提高私有文件的安全性,面向 Android N 或更高版本的應用私有目錄將被限制訪問。這點類似iOS的沙盒機制。

" StrictMode API 政策" 是指禁止向你的應用外公開 file:// URI。 如果一項包含文件 file:// URI類型 的 Intent 離開你的應用,應用失敗,並出現 FileUriExposedException 異常。

上面用到的代碼中的Uri.fromFile 其實就是生成一個file://URL。


一旦我們通過這種辦法打開其它程序(這裡打開系統包安裝器)就認為file:// URI類型的 Intent 離開你的應用。這樣程序就會發生異常。

接下來就用FileProvider來解決這一問題。

使用FileProvider

使用FileProvider的大致步驟如下:

第一步:
在AndroidManifest.xml清單文件中註冊provider,因為provider也是Android四大組件之一,可以簡單把它理解為向外提供數據的組件,這種組件在實際開發中用的頻率並不高,四大組件都可以在清單文件中進行配置。


注意:

exported:要求必須為false,為true則會報安全異常。

grantUriPermissions:true,表示授予 URI 臨時訪問權限。

authorities 組件標識,按照江湖規矩,都以包名開頭,避免和其它應用發生衝突。

第二步:指定共享的目錄
上面配置文件中 android:resource="@xml/file_paths" 指的是當前組件引用 res/xml/file_paths.xml 這個文件。

我們需要在資源(res)目錄下創建一個xml目錄,然後創建一個名為「file_paths」(名字可以隨便起,只要和在manifest註冊的provider所引用的resource保持一致即可)的資源文件,內容如下:


<files-path/>代表的根目錄: Context.getFilesDir()

<external-path/>代表的根目錄: Environment.getExternalStorageDirectory()

<cache-path/>代表的根目錄: getCacheDir()

上述代碼中path="",是有特殊意義的,它代碼根目錄,也就是說你可以向其它的應用共享根目錄及其子目錄下任何一個文件了。

如果你將path設為path="pictures",那麼它代表著根目錄下的pictures目錄(eg:/storage/emulated/0/pictures),如果你向其它應用分享pictures目錄範圍之外的文件是不行的。

第三步:使用FileProvider
上述準備工作做完之後,現在我們就可以使用FileProvider了。
我們需要將上述安裝APK代碼修改為如下


上述代碼中主要有兩處改變:

將之前Uri改成了有FileProvider創建一個content類型的Uri。

添加了

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)來對目標應用臨時授權該Uri所代表的文件。

上述代碼通過FileProvider的Uri getUriForFile (Context context, String authority, File file)靜態方法來獲取Uri
該方法中authority參數就是清單文件中註冊provider時填寫的authority
android:authorities="com.yll520wcf.test.fileprovider"。
按照上面步驟修改就可以兼容Android7.0了。

相關焦點

  • DASCTF八月挑戰賽 Android 逆向 apkrev
    下載後解壓可得一個名為 apkrev 的 apk 文件,扔到模擬器裡運行。動態調試1、使用雷電模擬器,首先確定模擬器的安卓版本,安裝 device info hw.apk ( https://www.cr173.com/soft/845060.html )查看相關信息:
  • 在VMware中安裝android-x86-9.0-r2
    -- M.hanny Sabbagh(作者)2019-11-15,android x86項目發布了pie-x86的第一個穩定版本r1。2020-03-25,發布了第二個穩定版。本文介紹在VMware虛擬機中安裝安卓pie-x86第二個穩定版本r2,第一個穩定版安裝類似。一、在Windows+VMware中安裝android x861.
  • Android Studio 下載安裝教程
    使用apkanalyzer對預構建APK進行分析和調試     (8)強大的布局編輯器     (9)支持Koltin編碼和Lua編碼(通過NDK開發)若未安裝JAVA包(JDK),請先按照該篇文章連結安裝配置JDK:JDK1.8安裝流程及其環境變量配置二、進入官網
  • Android兼容性測試CTS之環境搭建
    首先從http://source.android.com/compatibility/downloads.html(網絡需要能進google)處下載最新的兼容性測試用例集合,並解壓。如圖1所示。
  • Appium+python自動化22-Android夜神模擬器
    夜神模擬器可以說是android模擬器裡面的一個神器。 一、環境安裝1.官網下載地址:[https://www.yeshen.com/](https://www.yeshen.com/)2.夜神安卓模擬器(夜神模擬器),是全新一代的安卓模擬器,與傳統安卓模擬器相比,**基於android4.4.2**,兼容X86/AMD,在性能、穩定性、兼容性等方面有著巨大優勢3.安裝時候選擇指定的文件夾路徑
  • 聽說你在搞Android 10.0 適配,看這篇就妥了!
    地址:https://juejin.im/post/5cad5b7ce51d456e5a0728b0真機當滿足以下每個條件時,將開啟兼容模式,即不開啟Q設備中的存儲權限改動:應用targetSDK<=P。應用安裝在從 Android P 升級到 Android Q 的設備上。但是當應用重新安裝(更新)時,不會重新開啟兼容模式,存儲權限改動將生效。
  • Android 模擬器 Root 和 SuperSU 安裝
    使用 Android 8.1 是為了安裝 Xposed 最新版本Ubuntu 20.04.1 LTS。使用的作業系統版本SuperSU 2.8.2。最新的 SuperSU 軟體的版本安裝 SuperSU 時首先需要獲得 root 權限,如果直接創建默認模擬器虛擬設備,並且直接安裝 Supersuer.apk 是不行的,可參考如下詳細步驟來進行安裝。
  • ExaGear模擬器(安卓PC模擬器)安裝教程
    修改版:連結:https://pan.baidu.com/s/1etv8OFn0dIQATHbcLD7xoQ 密碼:t194ED2.0.6修改版(安卓8用):連結:cat=1(閱讀原文快速進入)壞鏈反饋請留言安裝方法:    手動安裝教程(通用):①下載apk模擬器和模擬器數據包②安裝apk模擬器③把模擬數據包裡com.eltechs.et
  • Android三方應用實現靜默安裝
    App的靜默安裝和卸載 Android系統本身提供了安裝卸載功能,但是api接口是@hide的,不是公開的接口,所以在應用級別是無法實現靜默安裝和卸載的,要實現靜默安裝和卸載需要是系統應用,要有系統籤名和相應的權限。
  • Android應用程式(APK)的編譯打包過程
    首先,我們假定你的系統(什麼系統都行,不限於Linux還是Windows系統,當然,我在這裡默認使用Linux系統來舉例子,但在 Windows中幾乎沒有什麼差別)已經安裝了JDK和Android SDK。
  • Android真機或模擬器激活Xposed框架的方法
    (6).用IDA打開Xposed安裝包裡的app_process文件,將代碼裡面的路徑字符串「/data/data/de.robv.android.xposed.installer/bin/XposedBridge.jar」修改為「/system/framework/XposedBridge.jar」(也可以通過修改原始碼編譯生成),然後將Xposed安裝包裡面的app_process
  • Android 8.0 自適應圖標
    在 Android 7.1(API級別25)及更早版本中,啟動器圖標大小為 48 x 48 dp。必須使用以下準則來調整圖標圖層的大小:我驗證了,不是這些尺寸也是可以的,但我們還是嚴格按照這個準則來吧。
  • Android逆向之旅---動態方式破解apk終極篇(如何破解加固apk)
    好了,解決了這兩個問題,下面就開始操作了:第一步:運行設備中的android_server命令,使用adb forward進行埠轉發這裡的android_server工具可以去ida安裝目錄中dbgsrv文件夾中找到
  • Python 3.7.0軟體下載和安裝教程|兼容WIN10
    Python 3.7.0(32/64位)下載連結:http://www.zhanshaoyi.com/8755.html
  • Anbox:在 Linux 上運行 Android 應用程式的簡單方式 | Linux 中國
    因此,我們需要手動下載每個應用程式(APK),並使用 Android 調試橋(ADB)安裝它。ADB 工具在大多數的發行版的軟體倉庫是輕易可獲得的,我們可以容易地安裝它。對於 Debian/Ubuntu 系統,使用 APT-GET 命令 或 APT 命令 來安裝 ADB。
  • 對 Android 未來的發展十分重要的技術 | App Bundles
    這樣顯得apk更小了,而且就像遊戲邏輯一樣,高級副本的地圖新手沒機會進入,就不必要下載這部分內容,有的用戶可能很久都不會用到部分功能,就可以放在dynamic feature module,等要用的時候再下載。下面是Dynamic Delivery示意效果圖:
  • 【MOD3.3】崩壞3 跨端/改服 安裝包 V3.3.0
    崩壞3新版本v3.3.0客戶端改服例行更新完成!    有此需求的艦長們到下方的下載地址中    安裝新的客戶端安裝包就可以繼續玩改服的崩壞3了~   艦長們可以根據自己的需求選擇安裝包與安裝方式喲。
  • 體驗 iPhone 安裝 Android 系統
    系統,不過暫時只支持 iPhone 7、iPhone 7 Plus、iPod Touch 7G。查看 setup.sh 腳本代碼,可以找到鏡像文件的下載連接是:http://assets.checkra.in/downloads/sandcastle/88b1089d97fe72ab77af8253ab7c312f8e789d49209234239be2408c3ad89a34/nand.gz,保存的目錄是:/tmp/mnt/nand.gz,文件大小有 470MB。
  • Android逆向之旅---動態方式破解apk前奏篇(Eclipse動態調試smail源碼)
    第一步:使用apktool來破解apkjava -jar apktool_2.0.0rc4.jar d -d AliCraceme_1.apk -o out當然還有其他方式,比如aapt查看apk的內容方式,或者是安裝apk之後用adb dumpsys activity top 命令查看都是可以的。
  • Android中adb的使用
    還可以進行很多手機操作,如安裝軟體、系統升級、運行shell命令等等。其實簡而言說,adb就是連接Android手機與PC端的橋梁,可以讓用戶在電腦上對手機進行全面的操作。哦,對了打開adb有兩種方式:1通過DOS下cd到C:\android-sdk\platform-tools目錄;2直接在C:\android-sdk\platform-tools目錄下點擊adb.exe圖標。接下來介紹adb的一些基本命令:1.