Android Studio搭建系統App開發環境


一.前言

  在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在你的設備上了

   

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

 

 


免責聲明!

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



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