一.前言
在Android的體系中開發普通app使用Android Studio這一利器會非常的方便。但是開發系統app可能就會有些吃力,不過經過一些配置仍然會
很簡單。我們知道系統app因為涉及到一些系統API和系統權限的原因,需要使用系統級別的簽名才行,也就是platform簽名。同時在Studio中
直接調用系統API是不可行的。使用Android Studio開發系統app,所要解決的其實也就是這兩個問題。
二.目錄
1.配置前的准備
2.在Android Studio中調用系統API
3.通過Android Studio直接運行系統APP在設備上
三.實際解決
1.配置前的准備
1.可用的Android Studio。
2.Android源碼環境,並且已經編譯過了
3.下載keytool-importkeypair https://github.com/getfatday/keytool-importkeypair
2.在Android Studio中調用系統API
1.打開Android Studio,創建一個普通的Android工程。
2.進入Android源碼環境,將out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes-full-debug.jar
拷貝的你的Android工程的libs目錄下,並且將其重命名為framework.jar,並且添加到環境變量中(在studio中右擊后選擇add as library)
3.在你的Android工程(不是app的)的build.gradle中添加如下內容:
1 gradle.projectsEvaluated { 2 tasks.withType(JavaCompile){ 3 options.compilerArgs.add('-Xbootclasspath/p:yourpath/app/libs/framework.jar') 4 } 5 }
注意這是添加在allprojects中和repositories為同級。如果配置到此的話,你在編譯app的時候就會報出數組越界的錯誤,這是因為app在打包的時候會把framework.jar也打進去,導致了方法數超過了64K。
4.在app的build.gradle中的第一行添加如下內容
compileOnly files('libs/framework.jar')
這句話的意思是以只讀的方式打開framework.jar,在打包app的時候不會將其打包進去。這就解決了方法數超過64k的問題了
5.做到第四步的時候,你會發現你調用系統API的時候仍然會報錯,而且不進行提示。這是因為Android Studio默認搜索的SDK的
優先級是高於你所引入的framework.jar的。
工程目錄結構下在app/app.iml中,將<orderEntry type="jdk" jdkName="Android API 27 Platform" jdkType="Android SDK" />
放到最后便可。
3.通過Android Studio直接運行系統app在設備上
要解決這個問題其實有兩種思路能夠解決。首先我們要明確Android源碼中的系統app之所以能使用系統的API和一些系統權限,是因為在Android.mk文件指定了簽名使用系統級別的platform。即LOCAL_CERTIFICATE := platform。而在Android Studio中直接Run的app使用的是普通的開發者簽名jks。那么第一種思路就是我們只需要將系統簽名引入到jks中便可,這也是下面要介紹的。還有一種思路,其實在Android系統中的MAC機制也就是SEAndroid,會通過簽名和包名兩種機制來為Android程序進程設置Type。所以我們可以根據這個思路,想到將我們開發的app的包名添加到SEAndroid設置Type的機制中。這樣你的app不需要成為系統app都可以使用一些系統的資源了。當然第二種思路會很復雜,所以僅僅作為一種思路。下面是第一種思路的實施方法。
1.在Android Studio中build->Generate Signed APK,之后輸入密碼別名等,生成一個你自己的新的jks文件。
2.在Android 源碼環境中,進入build/target/product/security將platform.pk8,platform.x509.pem和第一步生成的jks放在一個目錄中。
3.在linux環境中,建議為ubuntu.將keytool-importkeypair下載后,你可以將keytool-importkeypair這個可執行文件和jks等放到一個目錄中。執行
./keytool-importkeypair -k jks的文件名 -p jks的密碼 -pk8 platform.pk8 -cert platform.x509.pem -alias jks的別名
這就話可以將系統簽名引入到jks中。接下來只需要在Android Studio Run的時候對app簽名時使用這個簽名就可以了
4.在Android工程中,將如下內容添加到app的build.gradle中便可。
signingConfigs{ release { storeFile file("yourpath/SignSys.jks") storePassword 'jks的密碼' keyAlias "jks的別名" keyPassword 'jks的密碼' } debug { storeFile file("yourpath/SignSys.jks") storePassword 'jks的密碼' keyAlias "jks的別名" keyPassword 'jks的密碼' } }
需要注意的是這段內容和defaultConfigs是同級的,以及如果是在Ubuntu環境下,你的jks如果是放在home主目錄下的。請用你的/home/username代替~,不然可能會找不到jks文件。
5.為你的app打上系統app的標記。
在app的AndroidManifest.xml中添加android:sharedUserId="android.uid.system"
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="xxxxr" android:sharedUserId="android.uid.system" >
到此你就可以直接讓你的app以系統app的身份直接Run在你的設備上了