Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 中級開發 >> 實現靜默安裝APK的兩種方法

實現靜默安裝APK的兩種方法

編輯:中級開發

 android把所有的Permission依據其潛在風險(屬性名為protectionLevel )劃分為四個等級,即"normal "、 "dangerous "、 "signature "、 "signatureOrSystem "。 INSTALL_PACKAGES屬於後兩者。讓我們看一下官方文檔對後兩類的描述吧。

"signature ": A permission that the system grants only if the requesting application is signed with the same certificate as the application that declared the permission. If the certificates match, the system automatically grants the permission without notifying the user or asking for the user's explicit approval.

"signatureOrSystem ": A permission that the system grantsonly to applications that are in the android system image   or   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()方法。

  1. //This code come form Sodino.Email:[email protected]
     
  2. String[] args = { "pm", "install", "-r", apkAbsolutePath };  
     
  3. String result = "";  
     
  4. ProcessBuilder processBuilder = new ProcessBuilder(args);  
     
  5. Process process = null;  
     
  6. InputStream errIs = null;  
     
  7. InputStream inIs = null;  
     
  8. try {  
     
  9.     ByteArrayOutputStream baos = new ByteArrayOutputStream();  
     
  10.     int read = -1;  
     
  11.     process = processBuilder.start();  
     
  12.     errIs = process.getErrorStream();  
     
  13.     while ((read = errIs.read()) != -1) {  
     
  14.         baos.write(read);  
     
  15.     }  
     
  16.     baos.write('\n');  
     
  17.     inIs = process.getInputStream();  
     
  18.     while ((read = inIs.read()) != -1) {  
     
  19.         baos.write(read);  
     
  20.     }  
     
  21.     byte[] data = baos.toByteArray();  
     
  22.     result = new String(data);  
     
  23. } catch (IOException e) {  
     
  24.     e.printStackTrace();  
     
  25. } catch (Exception e) {  
     
  26.     e.printStackTrace();  
     
  27. } finally {  
     
  28.     try {  
     
  29.         if (errIs != null) {  
     
  30.             errIs.close();  
     
  31.         }  
     
  32.         if (inIs != null) {  
     
  33.             inIs.close();  
     
  34.         }  
     
  35.     } catch (IOException e) {  
     
  36.         e.printStackTrace();  
     
  37.     }  
     
  38.     if (process != null) {  
     
  39.         process.destroy();  
     
  40.     }  
     
  41. }  
     
  42. return result;
復制代碼

代碼執行後,如果安裝成功的話獲取到的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' 直到顯示綠色菜單.

      4 .執行 "adb shell mount /dev/block/mtdblock3 /system" ,至此,可對/system進行寫操作。

      5.在PC上運行命令:adb push <your_apk_path> /system/<your_apk_name>。至此,內置成功。

      第二種方法,需要先打一個未簽名的APK包,然後用系統簽名對其進行簽名。這個方面的東西在我之前的一篇博文已說明,這兒就不重復了。[android]使用platform密鑰來給apk文件簽名的命令

      由於HTC-Legend是“原裝”的,所以靜默安裝倒是順利。但對於一些MOTO或樂Phone的手機,一般上是不支持的。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved