【轉】Android 將自己的應用改為系統應用


所謂系統程序就是system/app目錄中的程序,普通應用轉換成系統程序后有穩定、減少內存(DATA)空間占用、恢復出廠設置后不會消失、修改系統時間、調用隱藏方法、系統關機重啟、靜默安裝升級卸載應用等等等等優點,想知道怎么操作?接下來我們介紹三種方法。

第一種:使用ADB命令將app安裝在system/app目錄下

參考:android 將自己的應用改為系統應用

這種方法的原理就是:

1、把apk文件移動到system/app目錄,
2、.so文件移動到system/lib目錄。
3、修改相應的權限

操作步驟:

1. 將你的手機數據線,插上,把你的設備設置為允許usb調試
2. 打開命令終端cmd
3. 輸入命令 adb shell
4. 確定能進入系統
這里寫圖片描述

5. 輸入命令 mount
這里寫圖片描述

6. 因為system默認是只讀文件夾,所以根據上面的提示輸入下面命令,使其變為可讀寫
mount -o remount /dev/block/nandd /system (圖)
這里寫圖片描述

再出輸入 mount 查看system和上面的不一樣了,說明正確

這里寫圖片描述

7. 輸入 exit 退出android系統終端

8. 解壓你的apk文件,進入查看lib/armeabi文件夾下有沒有 .so文件,如果沒有這種庫文件的話,直接跳到第10步,(因為有些apk文件是要調用動態鏈接庫的,你不拷貝的話,就沒有辦法運行!會報錯)如果有的話, 將這些*.so文件都拷貝到/system/lib文件夾下:

命令:adb push libiReader_txtparser.so system/lib
這里寫圖片描述

9、拷貝完了之后呢,要給這些庫文件添加權限,看看別的庫文件權限是幾

chmod 644 xxxxx.so
  • 1
  • 1

這里寫圖片描述

10. 將你的apk文件拷貝進入/system/app(該文件夾里存放着所以系統級別的apk),圖中我是將iReader.apk拷貝過去的

這里寫圖片描述

11. 再次進入android終端 adb shell
12. 進入system/app文件夾 cd system/app
13. 查看其他apk的權限 ll 能看出區別

這里寫圖片描述

14. 修改iReader.apk權限使其和其他的一樣 chmod 644 iReader.apk
這里寫圖片描述

15. 搞定這些之后,重啟設備 reboot
16. 看看系統里面是不是安裝好了該應用,點擊一下,看是否正常運行,可以的話,再檢測是否無法卸載!

第二種:借助工具把app轉為系統應用(原理和方法一一樣)

轉載:安卓進階教程:怎樣把應用轉換成系統程序

RE管理器轉換和LINK2SD都可以實現,任選其一即可

使用RE管理器轉換

1、首先我們把需要轉換的程序在電腦上用壓縮軟件打開 ,看有沒有lib這個目錄。如果有,再把lib目錄打開,直到出現以.so結尾的文件,把文件都拖出來備用。

這里寫圖片描述這里寫圖片描述

2、把需要轉換的應用(apk文件)連同剛拖出的.so文件(如果有),放到手機內存卡,
3、用RE管理器復制到system目錄,把權限更改如圖,
4、把更改權限后的apk文件移動到system/app目錄,.so文件移動到system/lib目錄。
5、完成后重啟手機,應用就轉換成系統程序了。

使用LINK2SD轉換

這里寫圖片描述這里寫圖片描述

如果感覺以上方法麻煩,也可借助工具來操作,LINK2SD、鈦備份等軟件都可以把普通程序轉換為系統程序,以LINK2SD為例,打開LINK2SD,找到需要軟件的程序,點擊,再點操作,選擇轉換系統應用,接着會有個確認窗口,確認后,重啟手機程序就轉換好了。

第三種:使用signapk打包成系統應用

參考:
android之使用signapk打包成系統應用,獲取系統權限
使用platform密鑰來給apk文件簽名的命令
Android安全開發之通用簽名風險
關於android:sharedUserId=”android.uid.system”這個系統級權限
安裝APK 時, 提示” 共享用戶權限不完整” , 不能安裝成功, 如何解決?
https://github.com/android/platform_build/tree/master/target/product/security

為了更好地理解下面介紹的兩種方法的原理,先來學習幾個概念:

Android應用簽名機制

Android系統要求安裝的應用必須用數字證書進行簽名后才能安裝,並且簽名證書的私鑰由應用開發者保存。簽名證書的生成也由開發者自己生成。在應用安裝時會校驗包名(package name)和簽名,如果系統中已經存在了一個相同的包名和簽名的應用,將會用新安裝的應用替換舊的;如果包名相同但是簽名不同,則會安裝失敗。

為什么需要數字簽名?

數字簽名是防止要保護的內容被篡改,用非對稱加密算法。先對要保護的內容進行消息摘要,用私鑰對消息摘要進行加密,生成數字簽名,將數字簽名和要保護的內容一起分發出去。 內容接收者用公鑰對數字簽名解密得到發送者給的消息摘要A,內容接收者對接收到的內容進行用相同的消息摘要算法處理得到消息摘要B,對比A和B是否相同,來判定傳送的內容是否被篡改。 正常的APK文件是個ZIP壓縮文件,除了應用的可執行文件、資源文件,還包括這些可執行文件、資源文件的摘要信息,數字證書的公鑰信息等。並且通過這些簽名信息可以確定APP和其開發者的關系。

進行簽名需要的工具有哪些?

對apk進行簽名需要用到簽名證書和簽名工具。Android系統要求對APP進行簽名的數字證書可以由開發者自己生成。簽名工具有jarsigner和signapk。jarsigner是Java本身自帶的一個工具,他也可以對jar進行簽名的;而signapk是專門為了Android應用程序apk進行簽名的工具。二者的區別是:jarsigner工具簽名時使用的是keystore簽名文件,signapk工具簽名時使用的是pk8,x509.pem文件。

簽名后的文件都有哪些?

應用簽名完后在應用的META-INF目錄下會有三個文件:

CERT.RSA、CERT.SF和MANIFEST.MF。

MANIFEST.MF中保存了所有其他文件的SHA1摘要並base64編碼后的值。

CERT.SF文件 是對MANIFEST.MF文件中的每項中的每行加上“rn”后,再次SHA1摘要並base64編碼后的值(這是為了防止通過篡改文件和其在MANIFEST.MF中對應的SHA1摘要值來篡改APK,要對MANIFEST的內容再進行一次數字摘要)。

CERT.RSA 文件:包含了簽名證書的公鑰信息和發布機構信息。

對安裝包的校驗過程在源碼的frameworks/base/core/java/android/content/pm/PackageParser.java類中可以看到

什么是通用簽名?

搭建好Android開發環境后(使用Eclipse或Android Studio),對APK簽名的默認密鑰存在debug.keystore文件中。在linux和Mac上debug.keystore文件位置是在~/.android路徑下,在windows目錄下文件位置是C:\user\用戶名.android路徑下。

除了debug.keystore外,在AOSP發布的Android源碼中,還有以下幾個證書是公開的,任何人都可以獲取,在源碼的build/target/product/security目錄中:

這里寫圖片描述

這幾個證書的作用:

testkey

Generic default key for packages that do not otherwise specify a key.

platform

Test key for packages that are part of the core platform.

shared

Test key for things that are shared in the home/contacts process.

media

Test key for packages that are part of the media/download system.

verity

Test Key for verifiedboot system imagein Android Lollipop. Sign boot.img,sign verity metadata in system.img.

通用簽名風險:

(1)如果攻擊者的應用包名與目標應用相同,又使用了相同的密鑰對應用進行簽名,攻擊者的應用就可以替換掉目標應用;

(2)另外目標應用的自定義權限android:protectionlevel為“signature”或者“signatureOrSystem”時,保護就形同虛設;

(3)如果設備使用的是第三方ROM,而第三方ROM的系統也是用AOSP默認的簽名,那么使用如果使用系統級簽名文件簽名過的應用,權限就得到了提升。

具體的實現方法:

第一種是需要在Android系統源碼的環境下用make來編譯:

  1. 在應用程序的AndroidManifest.xml中的manifest節點中加入android:sharedUserId=”android.uid.system”這個屬性。
  2. 修改Android.mk文件,加入LOCAL_CERTIFICATE := platform這一行
  3. 使用mm命令來編譯,生成的apk就有修改系統時間的權限了。

第二種:

下面着重介紹一個這個方法:

1. 加入android:sharedUserId=”android.uid.system”這個屬性。

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.jant.addview" android:sharedUserId="android.uid.system" > <application  ...(省略若干代碼) </application> </manifest>

2. 使用自己的簽名文件,生成apk

3. 使用通用簽名來重新給apk文件簽名。

3.1 .准備好platform.pk8、platform.x509.pem和簽名工具signapk.jar(3個文件的下載地址),還有自己的apk,放在同一個文件夾下。

3.2 在cmd下進入到該文件夾后,使用如下命令:
這里寫圖片描述

3.3 回車后我們的文件夾下已經多了一個new.apk文件了,這就將我們的應用打包成系統應用


你也可以在github中去下載,但是下載的是SignApk.java,需要進行一些處理,如下

1.1.進入\build\target\product\security,找到【platform.pk8】和【platform.x509.pem】系統密鑰。
1.2.進入\build\tools\signapk找到SignApk.java,運行 javac編譯成SignApk.class
1.3.執行命令java com.android.signapk.SignApk platform.x509.pem platform.pk8 input.apk output.apk

最后解釋一下原理

首先加入android:sharedUserId=”android.uid.system”這個屬性。通過Shared User id,擁有同一個User id的多個APK可以配置成運行在同一個進程中。那么把程序的UID配成android.uid.system,也就是要讓程序運行在系統進程中,也就是系統應用。

只是加入UID還不夠,如果這時候安裝APK的話發現無法安裝,提示簽名不符,原因是程序想要運行在系統進程中還要有目標系統的platform key,就是上面第二個方法提到的platform.pk8和platform.x509.pem兩個文件。用這兩個key簽名后apk才真正可以放入系統進程中。第一個方法中加入LOCAL_CERTIFICATE := platform其實就是用這兩個key來簽名。

這也有一個問題,就是這樣生成的程序只有在原始的Android系統或者是自己編譯的系統中才可以用,因為這樣的系統才可以拿到platform.pk8和platform.x509.pem兩個文件。要是別家公司做的Android上連安裝都安裝不了。試試原始的Android中的key來簽名,程序在模擬器上運行OK,不過放到小米四上安裝uibl,如下圖,這樣也是保護了系統的安全。

這里寫圖片描述

最后還說下,這個android:sharedUserId屬性不只可以把apk放到系統進程中,也可以配置多個APK運行在一個進程中,這樣可以共享數據,應該會很有用的。
你在Manifest.xml里聲明使用了shareuserid 或者一些特殊permission,比如你shareuserid到uid.system,就必須使用系統platform簽名來簽你的apk,否則是不能安裝的,同理share到其他用戶id或者其他process上也是得用跟那個process運行的apk一樣的簽名
一般簽名肯定是廠商私有的,你肯定是沒辦法了,除非機器燒的是開發版本(eng)

檢驗app是否已經是系統應用

查看應用的進程屬性,如果是system用戶組,說明已經是系統應用。

 

這里寫圖片描述

 

from:https://blog.csdn.net/m0_37135879/article/details/81134472?tdsourcetag=s_pcqq_aiomsg


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM