Android Studio搭建系統(tǒng)APP開發(fā)環(huán)境

前言

在Android的體系中開發(fā)普通app使用Android Studio這一利器會(huì)非常的方便。但是開發(fā)系統(tǒng)app可能就會(huì)有些吃力,不過經(jīng)過一些配置仍然會(huì)很簡(jiǎn)單。我們知道系統(tǒng)app因?yàn)樯婕暗揭恍┫到y(tǒng)API和系統(tǒng)權(quán)限的原因,需要使用系統(tǒng)級(jí)別的簽名才行,也就是platform簽名。同時(shí)在Studio中直接調(diào)用系統(tǒng)API是不可行的。使用Android Studio開發(fā)系統(tǒng)app,所要解決的其實(shí)也就是這兩個(gè)問題。


目錄

  1. 配置前的準(zhǔn)備
  2. 在Android Studio中調(diào)用系統(tǒng)API
  3. 通過Android Studio直接運(yùn)行系統(tǒng)APP在設(shè)備上

實(shí)際解決

  1. 配置前的準(zhǔn)備
    1. 可用的Android Studio
    2. Android源碼環(huán)境,并且已經(jīng)編譯過了
    3. 下載keytool-importkeypair
  2. 在Android Studio中調(diào)用系統(tǒng)API
    1. 打開Android Studio,創(chuàng)建一個(gè)普通的Android工程。

    2. 進(jìn)入Android源碼環(huán)境,將out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes-full-debug.jar拷貝的你的Android工程的libs目錄下,并且將其重命名為framework.jar,并且添加到環(huán)境變量中,(在android studio中,選中framework.jar圖標(biāo),右擊后選擇add as library)

    3. 在你的Android工程(不是app的)的build.gradle中添加如下內(nèi)容:

      allprojects {
          …
          gradle.projectsEvaluated {
              tasks.withType(JavaCompile){
                  options.compilerArgs.add('-Xbootclasspath/p:yourpath/app/src/main/libs/framework.jar')
              }
          }
      }
      

      注意這是添加在allprojects中和repositories為同級(jí)。如果配置到此的話,你在編譯app的時(shí)候就會(huì)報(bào)出數(shù)組越界的錯(cuò)誤,這是因?yàn)閍pp在打包的時(shí)候會(huì)把framework.jar也打進(jìn)去,導(dǎo)致了方法數(shù)超過了64K。

    4. 在app的build.gradle中的第一行添加如下內(nèi)容

      compileOnly files('libs/framework.jar')
      

      這句話的意思是以只讀的方式打開framework.jar,在打包app的時(shí)候不會(huì)將其打包進(jìn)去。這就解決了方法數(shù)超過64k的問題了

    5. 做到第四步的時(shí)候,你會(huì)發(fā)現(xiàn)你調(diào)用系統(tǒng)API的時(shí)候仍然會(huì)報(bào)錯(cuò),而且不進(jìn)行提示。這是因?yàn)锳ndroid Studio默認(rèn)搜索的SDK的優(yōu)先級(jí)是高于你所引入的framework.jar的。工程目錄結(jié)構(gòu)下在app/app.iml中,將放到最后便可。

  3. 通過Android Studio直接運(yùn)行系統(tǒng)app在設(shè)備上
    要解決這個(gè)問題其實(shí)有兩種思路能夠解決。首先我們要明確Android源碼中的系統(tǒng)app之所以能使用系統(tǒng)的API和一些系統(tǒng)權(quán)限,是因?yàn)樵贏ndroid.mk文件指定了簽名使用系統(tǒng)級(jí)別的platform。即LOCAL_CERTIFICATE := platform。而在Android Studio中直接Run的app使用的是普通的開發(fā)者簽名jks。那么第一種思路就是我們只需要將系統(tǒng)簽名引入到j(luò)ks中便可,這也是下面要介紹的。還有一種思路,其實(shí)在Android系統(tǒng)中的MAC機(jī)制也就是SEAndroid,會(huì)通過簽名和包名兩種機(jī)制來(lái)為Android程序進(jìn)程設(shè)置Type。所以我們可以根據(jù)這個(gè)思路,想到將我們開發(fā)的app的包名添加到SEAndroid設(shè)置Type的機(jī)制中。這樣你的app不需要成為系統(tǒng)app都可以使用一些系統(tǒng)的資源了。當(dāng)然第二種思路會(huì)很復(fù)雜,所以僅僅作為一種思路。下面是第一種思路的實(shí)施方法。
    1. 在Android Studio中build->Generate Signed APK,之后輸入密碼別名等,生成一個(gè)你自己的新的jks文件。

    2. 在Android 源碼環(huán)境中,進(jìn)入build/target/product/security將platform.pk8,platform.x509.pem和第一步生成的jks放在一個(gè)目錄中。

    3. 在linux環(huán)境中,建議為ubuntu.將keytool-importkeypair下載后,你可以將keytool-importkeypair這個(gè)可執(zhí)行文件和jks等放到一個(gè)目錄中。執(zhí)行./keytool-importkeypair -k jks的文件名 -p jks的密碼 -pk8 platform.pk8 -cert platform.x509.pem -alias jks的別名這就話可以將系統(tǒng)簽名引入到j(luò)ks中。接下來(lái)只需要在Android Studio Run的時(shí)候?qū)pp簽名時(shí)使用這個(gè)簽名就可以了

    4. 在Android工程中,將如下內(nèi)容添加到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的密碼'
          }
      }
      

      需要注意的是這段內(nèi)容和defaultConfigs是同級(jí)的,以及如果是在Ubuntu環(huán)境下,你的jks如果是放在home主目錄下的。請(qǐng)用你的/home/username代替~,不然可能會(huì)找不到j(luò)ks文件。

    5. 為你的app打上系統(tǒng)app的標(biāo)記。
      在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以系統(tǒng)app的身份直接Run在你的設(shè)備上了


Android Studio配置使用自定義SDK

AndroidStudio項(xiàng)目需要調(diào)用的API是我們自己framework增加的API時(shí),由于默認(rèn)使用的官方SDK.因此會(huì)找不到對(duì)應(yīng)的API。解決方案是: 替換AndroidStudio SDK中的SDK為我們系統(tǒng)編譯出來(lái)的SDK

  1. 在我們系統(tǒng)源碼linux中執(zhí)行make sdk 生成android.jar文件。路徑:repo/out/target/common/obj/PACKAGING/android_jar_intermediates/android.jar
  2. 將linux中android.jar替換掉AndroidStudio SDK中sdk\platforms\android-24\android.jar文件
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容