一.前言

  在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中添加如下内容:  

       gradle.projectsEvaluated {
    tasks.withType(JavaCompile){
    options.compilerArgs.add('-Xbootclasspath/p:yourpath/app/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中,将<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在你的设备上了

   

 

 

Android Studio搭建系统App开发环境的更多相关文章

  1. 干货分享:在Windows下使用Visual Studio搭建C语言开发环境

    前言:本文将教大家如何使用 VIsual Studio Code 搭建 C 语言开发环境,包括使用 VS Code 如何编译和调试 C 语言程序,需要 用到的工具有 Visual Studio Cod ...

  2. Android studio ocr初级app开发问题汇总(含工程代码)

    博客第一篇文章,稍作修改,增加文字介绍 开发目的 最近由于某些需求,需要在Android手机端实现OCR功能,大致为通过手机照相,识别出相片中的中文信息字段.但是由于新手光环+流程不熟悉,遇到了各种各 ...

  3. Android Studio 2.2 NDK开发环境搭建

    转载请标明出处:http://blog.csdn.net/shensky711/article/details/52763192 本文出自: [HansChen的博客] Android应用程序使用ND ...

  4. 全志A33 lichee 搭建Qt App开发环境编写helloworld

    开发平台 * 芯灵思SinlinxA33开发板 淘宝店铺: https://sinlinx.taobao.com/ 嵌入式linux 开发板交流 QQ:641395230 Step 1 在虚拟机(Ce ...

  5. Android开发新手学习总结(一)——使用Android Studio搭建Android集成开发环境

    [新手连载]一:使用Android Studio搭建Android集成开发环境http://bbs.itcast.cn/forum.php?mod=viewthread&tid=87055&a ...

  6. 使用Android Studio搭建Android集成开发环境

    有很长一段时间没有更新博客了,最近实在是太忙了,没有时间去总结,现在终于可以有时间去总结一些Android上面的东西了,很久以前写过这篇关于使用Android Studio搭建Android集成开发环 ...

  7. Android开发学习总结(二)——使用Android Studio搭建Android集成开发环境

    有很长一段时间没有更新博客了,最近实在是太忙了,没有时间去总结,现在终于可以有时间去总结一些Android上面的东西了,很久以前写过这篇关于使用Android Studio搭建Android集成开发环 ...

  8. 使用Android Studio搭建Android开发环境

    一.Android Studio简单介绍 2013年GoogleI/O大会首次发布了Android Studio IDE(Android平台集成开发环境).它基于Intellij IDEA开发环境,旨 ...

  9. 基于Android Studio搭建Android应用开发环境

    备注:电脑是windows xp系统 1.     安装JDK和环境变量设置 JDK是java development kit,Java JDK下载地址 http://www.oracle.com/t ...

随机推荐

  1. 20175224 2018-2019-2 《Java程序设计》第五周学习总结

    教材学习内容总结 第六章:接口与实现 接口:关键字interface来定义一个接口.分为接口声明,接口体. interface Printable { final int MAX=100; void ...

  2. hive表分区操作

    1.修复表分区命令 msck repair table table_name; 2.添加表分区操作 alter table table_name add partition(month_id='201 ...

  3. 软件测试:第二次作业(JUnit单元测试方法)

    一.JUnit是什么? JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework).JUnit测试是程序员测试, ...

  4. 第二次靶场练习:cookie注入

    cookie注入 本文章目的是对相关的黑客内容进一步了解,如有人违反相关的法律法规,本人概不负责 一.学习目的: 利用手工注入网站 利用sqlmab注入 二.附件说明 靶场网址:http://120. ...

  5. mysql的sql执行计划

    实际项目开发中,由于我们不知道实际查询的时候数据库里发生了什么事情,数据库软件是怎样扫描表.怎样使用索引的,因此,我们能感知到的就只有 sql语句运行的时间,在数据规模不大时,查询是瞬间的,因此,在写 ...

  6. python定时脚本判断服务器内存

    经常我们会发现服务器跑着跑着内存使用率达到了百分之八九十,或者有时候直接挂掉,在我们还没定位是哪块代码有问题导致内存占用很大的时候,可以先写个定时脚本,当服务器内存使用率达到一定值的时候,就重启一起服 ...

  7. IDEA 编译时 报 “常量字符串过长” 解决办法

    从eclipse 工具转到 IDEA 工具的时候,出现了一些问题,在这里记录一下,以便之后使用到,废话不多说. 在编译项目时,出现错误为:"常量字符串过长" ,我当时想这个问题需要 ...

  8. 判断库中为字符串格式的时间是否为最近三个月(Java)

    今天分享一个问题,就是标题中提到的问题,今天在调用一个接口的时候,发现调用到的数据的时间格式为字符串类型,我有点蒙圈,于是,我就百度解决了这个问题,同时在这里记录一下,为了之后不再蒙圈::: 首先需要 ...

  9. hibrnate缓存

    缓存: 是计算机领域的概念,它介于应用程序和永久性数据存储源之间. 缓存: 一般人的理解是在内存中的一块空间,可以将二级缓存配置到硬盘.用白话来说,就是一个存储数据的容器.我们关注的是,哪些数据需要被 ...

  10. PTA L2-4 关于堆的判断

    先上题面 链接 https://pintia.cn/problem-sets/994805046380707840/problems/994805064676261888 首先,题目描述的很清楚,这是 ...