2014-10-17 53 views
0

我工作植根设备。我创建了一个应用程序作为系统应用程序运行。以su用户身份从adb shell挂载/ system目录后,我已将apk文件复制到sd卡,然后复制到/ system/priv-app。清单文件看起来如下应用安装在未开始无需重新启动(根)系统/ PRIV应用内

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="abc.def.settings" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="19" /> 

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
    <uses-permission android:name="android.permission.WRITE_SETTINGS" /> 
    <uses-permission android:name="android.permission.WRITE_APN_SETTINGS" /> 
    <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" /> 
    <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
    <uses-permission android:name="android.permission.CALL_PHONE" /> 
    <uses-permission android:name="android.permission.READ_CALL_LOG" /> 
    <uses-permission android:name="android.permission.WRITE_CALL_LOG" /> 
    <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" /> 
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.STATUS_BAR" /> 
    <uses-permission android:name="android.permission.EXPAND_STATUS_BAR" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 

     <service 
      android:name="abc.def.settings.service.SystemSettingsService" > 
     </service> 

     <receiver android:name="abc.def.settings.boot.DeviceBootReceiver" > 
      <intent-filter> 
       <action android:name="android.intent.action.BOOT_COMPLETED"/> 
       <action android:name="abc.def.settings.start_after_reinstall"/> 
      </intent-filter> 
     </receiver> 
    </application> 

</manifest> 

一旦我复制的APK必须/系统/私法,应用程序,我从壳改变了权限777。该应用程序从设备启动开始非常好。但是我无法在重新启动之前启动服务。我的一个局限性是设备不应该重新启动以启动此服务。

我尝试以下,但没有一次成功。

adb shell am startservice -n abc.def.settings/.SystemSettingsService 
adb shell am startservice -n abc.def.settings/.service.SystemSettingsService 
adb shell am startservice -a abc.def.settings.start_after_reinstall 
adb shell am broadcast -a abc.def.settings.start_after_reinstall 
adb shell am broadcast -a abc.def.settings.start_after_reinstall -f 32 

有什么我失踪。提前致谢。

+0

原则上你所要做的几乎肯定是一个坏主意,但是你可能需要触发包管理器来重新扫描它在启动时的正常工作方式。不知道是否有办法做到这一点 - 可以安装别的东西*虽然包管理器会这样做。希望在让你的代码在他们的设备上横行之前,人们会长期思考并努力工作。 – 2014-10-17 17:10:43

+0

@ChrisStratton:谢谢你的回复。我正在实施的应用程序不是用于分发,而是运行在我们提供给我们出租车司机的特定设备上。这些设备只运行我们的应用程序,除了几次点击按钮之外,用户将无法控制设备的工作。远程升级应用程序版本需要上述功能。 – nagamanojv 2014-10-18 04:06:12

回答

1

我知道这是一个老问题,但我想在这里发帖回答别人谁可能想自定义ROM的或与内部或限制API的工作,现有的设备上安装自己的应用程序的缘故。为了获得我在这里提供的信息,我不得不搜索相当长的一段时间,因为信息可能很难找到。

对于priv-app APK可以正常工作,甚至完全取决于权限,它需要使用系统密钥进行签名,该密钥已用于ROM中的关键系统应用程序以及框架JAR文件(通常位于/system/framework)。

在某些情况下(例如基于联发科CPU的中文ROM等),使用的APK签名密钥是标准Android AOSP(Android开源项目)签名密钥,可以在Android源代码中找到分配。作为AOSP分配的一部分提供了4个默认密钥,每个默认密钥都是私有/公共对。他们的名字是:

media.pk8 
media.x509.pem 
platform.pk8 
platform.x509.pem 
shared.pk8 
shared.x509.pem 
testkey.pk8 
testkey.x509.pem 

如果您想将APK添加到已使用这些签名密钥的ROM中,那么您很幸运!我已经包含了一个脚本和一些链接到下面需要的文件来完成这个过程。

不过,如果你想定制从主要的制造商如三星的ROM,你会发现,你需要重新签订新的密钥所有系统APK文件,让您的应用工作中/system/priv-app目录。

您还需要修改您的ROM的框架APK,以便它们也由您的新密钥签名,并且您可以想象这个过程充满了危险,因为如果您错过了可能会导致无法使用的ROM重要的东西。这个过程不在答案的范围内,但是您可以在XDA开发人员的不同制造商中找到一些好的资源。我会链接它,但目前我的声誉太低,无法与我分享两个以上的链接。

如果您的应用使用任何只提供给签订特权系统的应用程序内部的API,这一步将是必要的你能够调用这些API。这些API包括使用反射访问的API,以及直接调用这些API。

我看到你的表现,你用你的APK至少有两个受限制的权限。这些都是:

<uses-permission android:name="android.permission.WRITE_APN_SETTINGS" /> 

<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" /> 

没有签约,这些权限几乎无用的,尤其是WRITE_SECURE_SETTINGS许可。

我写了一个小外壳脚本,在需要时为我的priv-app APK签名,这里是源代码。一旦您执行了签名过程,您还需要您的APK的zip-align。它适用于OS X/MacOS和Linux上:

#!/bin/bash 
echo Signing with Android Platform key... 
java -jar signapk.jar -w platform.x509.pem platform.pk8 <app-name-for-signing>.apk <app-signed-output>.apk 
echo Zip-Aligning... 
./zipalign -f 4 <app-signed-output>.apk <final-app-name-signed-zipaligned>.apk 
echo Done! 
echo 

你需要获得signapk.jarzipalign工具为您的平台,你可以在这里找到那些:

[CROSS-PLATFORM] APK Sign/Zipalign/Install

你”您还需要获取AOSP标准密钥,这些密钥在许多地方都可用,包括https://github.com/android/platform_build/tree/master/target/product/security

如果您想要找出哪个签名密钥用于ROM中的priv-app APK文件,您可以使用标准Java工具执行两个步骤的过程,因此请确保安装了Java SDK(任何风格) ,然后按照步骤在这样的回答:

How do I find out which keystore was used to sign an app?

如果您发现ROM是使用AOSP键,那么你只需要登录自己的APK使用相同的密钥文件,并在priv-app目录拖放为它正常工作。

相关问题