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
  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,并且添加到环境变量中,(在android studio中,选中framework.jar图标,右击后选择add as library)

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

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

      注意这是添加在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中,将放到最后便可。

  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在你的设备上了


Android Studio配置使用自定义SDK

AndroidStudio项目需要调用的API是我们自己framework增加的API时,由于默认使用的官方SDK.因此会找不到对应的API。解决方案是: 替换AndroidStudio SDK中的SDK为我们系统编译出来的SDK

  1. 在我们系统源码linux中执行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文件
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容