• apk获得Android系统权限的方法


    想写一个重启系统的apk(reboot.apk),因为没有权限,所以编译出来的apk无法达到效果。

    网上查到的方法讲的不太清楚,至少我是这么觉得,因为我照着做,试了好多次才成功。下面是我尝试过并成功的两个方法,总结如下。

    方法1:通过将项目作为一个模块,放到Android系统源码中进行编译~~~

    步骤如下:

    1. 在应用程序的AndroidManifest.xml中的manifest节点中加入"android:sharedUserId="android.uid.system"这个属性。

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
      ……
    android:sharedUserId="android.uid.system" >  <!--添加该属性-->
        
    <uses-permission android:name="android.permission.SHUTDOWN"/> <!--添加该权限-->
    ……
    </manifest>
    ps:android:sharedUserId="android.uid.system" 将app提升到系统权限,需要到源码中编译;还有关机权限:android.permission.SHUTDOWN
     

    2.编译apk

    (1)将应用程序的src文件、res文件和AndroidManifest.xml文件拷贝到Android系统源码package/apps目录下

    (2)编写一个Android.mk文件(最简单的方法就是拷贝其他模块中的Android.mk文件),修改Android.mk文件,加入LOCAL_CERTIFICATE := platform这一行

    Android.mk:

    LOCAL_PATH:= $(call my-dir)
    include $(CLEAR_VARS)
    
    LOCAL_MODULE_TAGS := optional
    
    LOCAL_SRC_FILES := $(call all-java-files-under, src)
    
    LOCAL_PACKAGE_NAME := 你的项目名
    LOCAL_CERTIFICATE := platform    #添加这一句
    
    include $(BUILD_PACKAGE) 

    (3)mm 编译,生成apk

    总结:其实就是把应用程序当作系统应用进行编译~~这样之后就会有系统权限了。

    方法2:这个办法麻烦点,不过不用跑到源码环境下用make来编译:

    步骤:

    1. 同上,加入android:sharedUserId="android.uid.system"这个属性。

    2. 使用eclipse编译出apk文件,但是这个apk文件是不能用的。

    3. 用压缩软件打开apk文件,删掉META-INF目录下的CERT.SF和CERT.RSA两个文件。

    4. 使用目标系统的platform密钥来重新给apk文件签名。这步比较麻烦,

    (4.1)首先找到密钥文件。是"build/target/product/security"路径下的platform.pk8和platform.x509.pem两个文件。

    (4.2)然后用Android提供的Signapk工具(即signapk.jar)来签名。signapk的源代码是在"build/tools/signapk"下。

    (4.3)进入"build/tools/signapk"目录下(接下来一直在该目录下进行以下指令) 

    1.javac Signapk.java  //编译生成SignApk$SignatureOutputStream.class和SignApk.class文件,将这两个文件拷贝到新创建的com/android/signapk目录下。
    2.jar cvfm signapk.jar SignApk.mf com //JAR命令使用中有解释
    3.将reboot.apk、platform.pk8、platform.x509.pem文件复制到"build/tools/signapk"目录下,然后执行下面指令。
    4.java -jar signapk.jar platform.x509.pem platform.pk8 reboot.apk reboot_signed.apk //生成了reboot_signed.apk,这个就是最终想要的apk了

    ps1:如果源码全编译过,那就已经生成了signapk.jar文件,可以直接拷贝过来,路径在/out/host/linux-x86/framework/signapk.jar。当然,要是没有环境全编译源码,但又需要signapk.jar文件,就可以通过以上方法来获得。打包生成signapk.jar文件可以重用,不用每次都重新打包。

    ps2:key,就是上面第二个方法提到的platform.pk8和platform.x509.pem两个文件。用这两个key签名后apk才真正可以放入系统进程中。第一个方法中加入LOCAL_CERTIFICATE := platform其实就是用这两个key来签名。这也有一个问题,就是这样生成的程序只有在原始的Android系统或者是自己编译的系统中才可以用,因为这样的系统才可以拿到 platform.pk8和platform.x509.pem两个文件。要是别家公司做的Android上连安装都安装不了。

     
    continue my dream...
  • 相关阅读:
    设计模式
    包装类
    php 闭包的理解
    is_null empty isset等的判定
    PHP基础一 $this ,static 和 self的区别
    lumen安装踩过得坑
    composer的使用和安装
    使用submine来写c++
    php 和 thinkphp中的常量一览
    路径问题 ./ / ../ 空 的区别
  • 原文地址:https://www.cnblogs.com/chenbin7/p/2854768.html
Copyright © 2020-2023  润新知