Android Studio搭建系统App开发环境

**

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

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值