前言
在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è)問題。
目錄
- 配置前的準(zhǔn)備
- 在Android Studio中調(diào)用系統(tǒng)API
- 通過Android Studio直接運(yùn)行系統(tǒng)APP在設(shè)備上
實(shí)際解決
- 配置前的準(zhǔn)備
- 可用的Android Studio
- Android源碼環(huán)境,并且已經(jīng)編譯過了
- 下載keytool-importkeypair
- 在Android Studio中調(diào)用系統(tǒng)API
打開Android Studio,創(chuàng)建一個(gè)普通的Android工程。
進(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)
-
在你的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。
-
在app的build.gradle中的第一行添加如下內(nèi)容
compileOnly files('libs/framework.jar')這句話的意思是以只讀的方式打開framework.jar,在打包app的時(shí)候不會(huì)將其打包進(jìn)去。這就解決了方法數(shù)超過64k的問題了
做到第四步的時(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中,將放到最后便可。
- 通過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í)施方法。在Android Studio中build->Generate Signed APK,之后輸入密碼別名等,生成一個(gè)你自己的新的jks文件。
在Android 源碼環(huán)境中,進(jìn)入build/target/product/security將platform.pk8,platform.x509.pem和第一步生成的jks放在一個(gè)目錄中。
在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è)簽名就可以了
-
在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文件。
-
為你的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
- 在我們系統(tǒng)源碼linux中執(zhí)行make sdk 生成android.jar文件。路徑:repo/out/target/common/obj/PACKAGING/android_jar_intermediates/android.jar
- 將linux中android.jar替換掉AndroidStudio SDK中sdk\platforms\android-24\android.jar文件