• android 打包系统APK 一 准备材料 1 signapk包 1)通常在源码环境的build\tools\signapk目录下,包含如下文件: 拿到上述文件之后还不能直接签名,需要将signapk编译,生成一个signapk.jar包,步骤如下: 把signapk...

    android 打包系统APK
    一 准备材料
    1 signapk包
    1)通常在源码环境的build\tools\signapk目录下,包含如下文件:
    在这里插入图片描述
    拿到上述文件之后还不能直接签名,需要将signapk编译,生成一个signapk.jar包,步骤如下:
    把signapk放到E盘(E:\signapk),命令行cd到此目录下(signapk.java代码目录)下执行:
    E:\signapk>java SignApk.java
    生成如下图的两个class文件:
    在这里插入图片描述
    2)、新建路径:E:\signapk\temp\com\android\signapk
    将刚才生成的两个class文件拷贝到此路径下:
    在这里插入图片描述
    3)、在E:\signapk下执行如下指令:E:\signapk>jar cvfm signapk.jar SignApk.mf -C temp\ .
    最终需生成signapk.jar文件,但在过程中遇到问题,可以通过直接下载signapk.jar文件(http://www.top139.com/down/signapk.jar.zip)

    2 签名文件 build/target/product/security/ platform.x509.pem、platform.pk8(需要下载安卓源码)
    二 使用Android studio 生成自己的jks文件
    具体生成.jks跳过,这里自己生成的.jks文件为 a.jks;
    三 在应用程序的项目中配置:

    androidManifest.xml中添加android:sharedUserId=“android.uid.system”



    四 生成系统签名APK文件
    1 在E盘中创建目录signapk (E:\signapk),把下载到的signapk.jar解压到该目录下:
    在这里插入图片描述

    2 系统的签名和需要打包的APK文件放到signapk同一个目录中:
    在这里插入图片描述
    3 使用cmd命令进入该目录
    执行命令:java -jar signapk.jar platform.x509.pem platform.pk8 E:\signapk\a.apk launcherApp.apk
    然后发现生成一个launcherAPP.apk文件,这就是经过系统签名的文件了。end

    展开全文
  • Android应用程序获取系统签名权限的方法  在Android应用程序开发过程中,经常会碰到要获取系统权限的问题。例如:    但是如果使用eclipse等开发工具,即使在AndroidManifest.xml中添加了这些权限,...
            在Android应用程序开发过程中,经常会碰到要获取系统权限的问题。例如:

        <uses-permission android:name="android.permission.STATUS_BAR" />
        <uses-permission android:name="android.permission.MANAGE_USB" />
        <uses-permission android:name="android.permission.SET_POINTER_SPEED" />
     
            但是如果使用eclipse等开发工具,即使在AndroidManifest.xml中添加了这些权限,一样无法获取,因为无法获取系统的签名认证。
            要获取系统签名认证有两种方法:
                1、在源码中编译
                2、手动导入系统签名
            获取了特定的系统签名,只能在特定的系统中运行,换了系统,还是不可以运行。不同厂家的系统签名会有差别。
            我们以Settings为例来看一下这两种方法。

         1、在源码中编译

            在源码中编译应用程序比较方便,不过需要在Linux环境下执行。步骤如下:
           ① 在AndroidManifest.xml文件中添加属性sharedUserId
            找到Manifest节点中加入一个属性 android:sharedUserId="android.uid.system" ,例如:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        coreApp="true"
        package="com.android.settings"
        android:sharedUserId="android.uid.system"
        android:versionCode="23"
        android:versionName="0.0.23 Build-CHT" >

           ② 修改Android.mk文件
            Android.mk文件时在Linux下用交叉编译连编译的时候才用到的,eclipse中不会自动生成,Android.mk的编写方式在这里就不再赘述。我们在Android.mk文件中添加LOCAL_CERTIFICATE := platform这一行。例如:

    LOCAL_PATH:= $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_SRC_FILES := $(call all-java-files-under, src)
    LOCAL_PACKAGE_NAME := Settings
    
    LOCAL_CERTIFICATE := platform
    
    LOCAL_PROGUARD_FLAG_FILES := proguard.flags

           ③ 把项目放到源码下,用mm命令编译。
    编译命令在这里就不再详细解释。

            2、手动添加系统签名

            手动添加系统签名较为麻烦,但不必进入Linux环境,在Windows环境下就能操作。步骤如下:
             ① 在AndroidManifest.xml文件中添加属性sharedUserId
            同前一种方法一样,找到Manifest节点中加入一个属性 android:sharedUserId="android.uid.system"。

             ② 使用eclipse导出未签名的apk
             如图所示,使用Android Tools导出未签名的apk包。

            
             
            填写好apk文件名,然后保存。
            
            如果出现以下提示,是提示你未签名程序的局限性,直接点击OK就可以了。
            

            ③ 编译signapk.jar
            如果已有此jar包,可以略过此步骤。
            signapk.jar通过编译源码中build/tools/signapk项目得到。由于本人的系统源码在Linux上,我们在Linux环境中演示编译方法,Windows环境中编译方法与此一样。
            我把源码放到了Document目录下,所以先进入到signapk目录。 
            
            然后使用javac命令编译得到SignApk$SignatureOutputStream.class和SignApk.class。
            
            
            在此目录下创建新目录com/android/signapk/,并将这两个文件复制进去。
        
            进入新建的目录,并新建SignApk.mf,写入以下一行内容:
                        Main-Class: com.android.signapk.SignApk
        
            然后执行命令 jar cvfm signapk.jar SignApk.mf com ,就得到了signapk.jar文件
        
            

            ④ 获得platform.x509.pem和platform.pk8两个文件
            这两个文件在系统源码目录 build/target/product/security/ 下,拷贝出来。这是两个文件是获取签名的关键。注意只有运行有此源码编译的系统的设备才能识别这个系统签名,其他系统不行。
            

            ⑤ 手动导入系统签名
            将 signapk.jar、platform.x509.pem、platform.pk8 和未签名的apk放到一个文件夹下。为了方便演示,我都放到E:盘根目录下。
            
            切换当前目录到文件所在目录,然后执行命令:
                    java -jar signapk.jar platform.x509.pem platform.pk8 未签名的APK文件名 签名后的APK文件名
            例如:
            
            这样就得到了签名后的APK文件。
            


    THE END
    展开全文
  • 有时候有的功能必须要有系统签名才能使用,例如调用系统自带的Surface.screenShot方法时,就必须在androidManifest.xml里声明android:sharedUserId="android.uid.system" 但是这个时候在编译生成的apk很有可能无法...

    有时候有的功能必须要有系统签名才能使用,例如调用系统自带的Surface.screenShot方法时,就必须在androidManifest.xml里声明android:sharedUserId="android.uid.system"

    但是这个时候在编译生成的apk很有可能无法安装的情况 并且报这个错误:

    INSTALL_FAILED_SHARED_USER_INCOMPATIBLE

    这个时候就必须要对APK进行签名了,如果是在linux的安卓源码环境下使用mm编译的话就不会有这个问题,不过想想也觉得对于习惯在windows下开发的人来说是相当麻烦的一件事~

    那么windows下对apk进行系统签名的方法如下,首先要进入android源码里找到下面三个文件:

    signapk.jar platform.x509.pem platform.pk8

    具体路径大家可以去百度。。我这里直接提供一个下载链接:

    http://yun.baidu.com/share/link?shareid=3118744382&uk=2215407523

     

    然后将这三个文件和你的apk放在同一目录下,进入cmd,进入你放这三个文件和apk的目录,执行命令:

    java -jar signapk.jar platform.x509.pem platform.pk8 你的apk名字.apk 你要输出的apk名字.apk

     

    当然前提是你要设置好java的环境变量哦~

    这样一来就大功告成啦~整个步骤非常简单,Eclipse编译出apk后复制到签名文件目录里然后直接用cmd执行命令,非常简洁的操作流程~

     

    转自:https://www.cnblogs.com/blairsProgrammer/p/3658216.html

    展开全文
  • 常用的系统签名方式包括在ubuntu环境下、手动签名和在AndroidStudio环境配置,三种方式中,实现最简单的是通过AndroidStudo方式,该方式的签名实现与正常的APK签名相同,唯一不同的就是签名文件是通过系统生成的。...

    在项目开发时,如果需要使应用具有系统权限,例如可以支持静默安装和卸载APK,此时就需要使用系统签名。
    常用的系统签名方式包括在ubuntu环境下、手动签名和在AndroidStudio环境配置,三种方式中,实现最简单的是通过AndroidStudo方式,该方式的签名实现与正常的APK签名相同,唯一不同的就是签名文件是通过系统生成的。
    注意,无论采用何种签名方式,如果想实现具有系统权限的应用,在APK生成时,都需要在AndroidManifest.xml中配置android:sharedUserId=“android.uid.system”,如下所示

    <manifest  xmlns:android="http://schemas.android.com/apk/res/android"
                package="com.xxxx.xxxx"
               android:sharedUserId="android.uid.system">
    
    </manifest>
    

    1. ubuntu环境编译

    该方式需要在安卓源码编译的环境下,在将APK打包至安卓系统升级包时,需要配置Android.mk文件,通过在配置LOCAL_CERTIFICATE 参数时,将其设置为PRESIGNED,如果需要改APK具有系统权限,使用系统签名,则需要设置为platform

    LOCAL_CERTIFICATE := platform 或 shared 或 media
    
    

    在设置好 Android.mk 文件后,在ubuntu环境下执行系统的编译流程。
    如果之前在ubuntu环境下已经执行好了系统的编译流程,则可以直接cd到系统的package/apps目录下,进入到需要编译的APK文件目录下执行mm指令,或在其他目录执行mmm /package/apps/APK所在的文件夹名称。

    2.手动签名

    手动系统签名与Android的APK重签名不同,重签名是之前APK已经签名完成,在实际使用时,需要更改签名文件,例如一些特殊的算法处理对于系统的包名和签名都有绑定操作,如更换则无法使用。
    手动系统签名是对于通过AndroidStudio的build生成的无签名的APK文件,进行手动系统签名操作。具体执行过程如下。

    2.1 下载SignApk.jar

    首先下载SignApk.jar包,如下图所示
    在这里插入图片描述如果本地有安卓系统的源码,可以直接在本地的build\tools\signapk目录下查找到该jar包。

    2.2 查找security文件

    拿到系统定制厂商提供的security文件,不同编译下生成的security文件内容不同,需针对该安卓系统下的编译生成的security文件,因此这也限定了该系统签名后的应用只能在该系统下运行,在其他系统下运行就不具有系统权限。
    在security文件中找到media.pk8和platform.x509.pem两个文件。

    2.3 执行系统签名操作

    将2.1中的SignApk.jar和2.2中的media.pk8和platform.x509.pem文件一起复制到包含需要签名的APK文件夹中,然后执行如下语句

    java -jar signapk.jar  platform.x509.pem platform.pk8 old.apk new.apk
    

    生成的new.apk文件就是系统签名后APK文件。
    该方式的操作,可参考安卓签名工具SignApk.jar使用教程,其已将签名的流程制作成Window下的.exe工具,只需一次配置,每次点击更换需要签名的文件即可。

    3 AndroidStudio方式

    通常对于APK的签名文件是通过AndroidStudio的New Key Store方式自定义实现,但是如果需要使用系统签名文件需要结合security文件中的media.pk8和platform.x509.pem两个文件,通过keytool-importkeypair实现,下载成功后,将media.pk8和platform.x509.pem两个文件放置在包含 keytool-importkeypair目前下,执行以下语句。

    ./keytool-importkeypair -k ./platform.keystore -p android -pk8 platform.pk8 -cert platform.x509.pem -alias platform
    

    需要注意的是:

    • 该语句的执行是在ubuntu环境下执行的
    • platform.keystore为系统签名文件
    • android为签名密码
    • platform为签名的别名(alias)

    生成系统签名后,在AndroidStudio中配置Signing签名信息,配置成功后在modle的buid.gradle中可以查看如下配置信息。

    signingConfigs {
        releaseConfig {
            keyAlias 'platform'
            keyPassword 'android'
            storeFile file('.........platform.keystore')//签名文件路径
            storePassword 'android'
        }
    }
    

    4.总结

    从以上的分析中可以看出,无论三种那种方式的实现,都离不开系统源码中的security目录下的media.pk8和platform.x509.pem两个文件,该两个文件是保证应用具有系统签名的前提,如果使用其他系统的文件,则在该系统中,无法具有系统权限。
    对比以上方法,分为具有ubuntu和没有两种环境下。

    • 具有ubuntu的编译环境:则使用第一种比较简单,第三种生成的系统签名文件,可用于其他APK的签名使用,在AndroidStudio中配置后,方便调试使用,不必每次都执行命令行来生成签名后的APK文件。
    • 不具有ubuntu的编译环境:该方式只能通过第二种方式实现,且每次调试使用时都需要替换APK生成新的系统签名后的APK,操作比较繁琐。当然在2.3中也提到,可借助其他同学制作的小工具方便签名文件的使用。

    参考
    安卓签名工具SignApk.jar使用教程
    让Android Studio支持系统签名
    keytool-importkeypair 使用

    展开全文
  • Apk签名,每一个Android开发者都不陌生。...再后来做系统应用,接触到了系统签名;而后就想了解下apk的生成机制,学习了如何用命令行进行签名。很早时以为很简单的签名,真没想到也蕴含这么丰富的知识,就想整理...

    Apk签名,每一个Android开发者都不陌生。它就是对我们的apk加了一个校验参数,防止apk被掉包。一开始做Android开发,就接触到了apk签名;后来在微信开放平台、高德地图等平台注册时,需要填写apk签名的md5值和sha256值;再后来做系统应用,接触到了系统签名;而后就想了解下apk的生成机制,学习了如何用命令行进行签名。很早时以为很简单的签名,真没想到也蕴含这么丰富的知识,就想整理一下,也分享给其它小伙伴们。

    文章结构:

    • 利用Android Studio生成签名与对apk进行签名
    • 获取签名文件的md5值和sha256值
    • 获取系统签名
    • 利用命令行生成签名与对apk进行签名

    一、利用Android Studio生成签名与对apk进行签名

    利用Android Studio(或者Eclipse)生成签名与对apk进行签名,是最常用的签名方式。本文也就从这里开始说起。

    1.生成签名

    依次选择Build——Generate Signed Bundle/APK——选择apk——点击Next,会看到Key store path下面有两个按钮(如图1)。
    图片1.png
    我们这里是要生成签名,当然选择Create New…,打开New Key Store对话框(如图2),填入指定的信息后,点击OK即可生成签名。
    图片2.png

    2.对apk进行签名

    打开Generate Signed Bundle or APK对话框后,直接选择已有的签名即可,点击Next,选择输出路径、签名版本后,点击Finish即可生成签名后的版本。

    3.Android Studio2.2之后的V1签名和V2签名

    当使用Android Studio2.2及以后版本进行签名打包时,会发现多了一个对签名版本的选择(如图3),这个V1和V2表示什么意思呢?
    图片3.png
    V1就是传统的签名方式,V2则是Android7.0之后引入的。其区别是,V1是通过ZIP条目进行验证,这样APK 签署后可进行许多修改;而V2验证压缩文件的所有字节,而不是单个 ZIP 条目,这样在签名后无法再更改。V2的好处很明显,更安全且验证更迅速。所以,推荐在生成apk时,签名方式选择V1+V2。当然,仅仅选择V1也是可以的。如果仅选择V2呢,这样生成的apk在Android7.0及之后的版本上没有问题,不过会导致7.0以下的版本无法安装,所以要避免这种方式。

    4.在gradle中配置签名信息

    我们都知道Android使用gradle来构建版本,因此我们也希望在gradle中配置好签名信息,在打包apk时更方便。
    在项目的build.gradle中,android下加入signingConfig信息。

    signingConfigs {      
      debug {          
        storeFile file("./hyydev.jks")          
        storePassword "******"         
         keyAlias "**"          
        keyPassword "******"          
        v1SigningEnabled true          
        v2SigningEnabled true      
      }      
      release {          
        storeFile file("./hyydev.jks")          
        storePassword "******"          
        keyAlias "**"          
        keyPassword "******"         
        v1SigningEnabled true          
        v2SigningEnabled true      
      }
    }
    

    5.jks与keystore

    从Eclipse开始做Android开发的小伙伴都知道,Eclipse默认生成的签名文件是keystore格式,而Android Studio生成的是jks格式。二者只是签名格式的不同,是可以进行转换的(如何转换,后续会专门介绍)。

    二、获取签名文件的md5值和sha256值

    在文章开始时,就提到了在许多开放平台注册时,需要用到apk签名的md5值和sha256值,怎么获取呢?这里提供了两种方法。

    1.用命令行获取md5值和sha256值

    keytool -v -list -keystore hyydev.jks
    

    如图4。
    图片4.png

    2.用代码获取md5值和sha256值

    除了用keytool命令获取外,也可以通过代码获取签名的md5值和sha256值。
    代码如下:

    public static String getSign(Context context, String packageName) {        
    
      String signValidString = "";      
      try {          
        @SuppressLint("PackageManagerGetSignatures")          
        PackageInfo packageInfo = context.getPackageManager().getPackageInfo(packageName, PackageManager.*GET_SIGNATURES*);          
        signValidString = *getSignValidString*(packageInfo.signatures[0].toByteArray(), "MD5");  //参数可以填"SHA1"、"SHA256"      
      } catch (Exception e) {      
      }      
      return signValidString;  
    }  
    
    private static String getSignValidString(byte[] paramArrayOfByte, String signType) throws NoSuchAlgorithmException {
    
      MessageDigest localMessageDigest = MessageDigest.*getInstance*(signType); 
      localMessageDigest.update(paramArrayOfByte);      
      return *toHexString*(localMessageDigest.digest());  //转为16进制显示,实现略去  
    }
    

    三、获取系统签名

    Android系统的签名信息不是keystore或jks格式,它默认存在build\target\product\security目录下(如图5)。如果需要获取系统签名的信息,需要在Ubuntu环境下把它转换为keystore或jks格式。
    图片5.png

    1.生成keystore签名文件

    1>.取platform.pk8 platform.x509.pem放到一个目录下
    2>.生成platform.pem

    openssl pkcs8 -in platform.pk8 -inform DER -outform PEM -out platform.pem -nocrypt
    

    3>.生成platform.p12

    openssl pkcs12 -export -in platform.x509.pem -inkey platform.pem -out platform.pk12 -name dev 
    Enter Export Password: (输入密码,比如hyydev)
    Verifying - Enter Export Password:(输入密码,比如hyydev)
    

    4>.生成hyysign.keystore

    keytool -importkeystore -deststorepass android -destkeypass hyydev -destkeystore hyysign.keystore -srckeystore platform.pk12 -srcstoretype PKCS12 -srcstorepass hyydev -alias dev
    

    2.生成jks签名文件

    与生成keystore文件类似。
    1>.取platform.pk8 platform.x509.pem放到一个目录下
    2>.生成platform.pem文件

    openssl pkcs8 -inform DER -nocrypt -in platform.pk8 -out platform.pem
    

    3>.生成platform.p12

    openssl pkcs12 -export -in platform.x509.pem -out platform.p12 -inkey platform.pem -password pass:hyydev -name hyy
    

    4>.生成hyysign.jks

    keytool -importkeystore -deststorepass hyydev -destkeystore hyysign.jks -srckeystore platform.p12 -srcstoretype PKCS12 -srcstorepass hyydev
    

    3.哪些apk的签名必须使用系统签名文件

    有些apk需要系统权限,比如实现关机指令。
    如何声明系统权限呢?
    在AndroidMainfest.xml的mainfest中加入:

    android:sharedUserId="android.uid.system"
    

    用到系统权限的apk,起签名必须使用系统签名,否则安装不上,会报错误(如图6)。
    图片6.png

    四、利用命令行生成签名与对apk进行签名

    上面所提到的签名,都是利用IDE来生成签名、进行签名,用命令行该怎么做呢?

    1.生成签名

    keytool -genkeypair -alias hyydev -keyalg RSA -validity 400 -keystore hyydev.keystore 
    

    图片7.png

    2.对未签名的apk进行签名

    jarsigner -verbose -keystore hyydev.keystore -signedjar TestSign.apk Test.apk dev
    

    3.重签名

    进行重签名时,会报错java.util.zip.ZipException: invalid entry compressed size (expected 41278 but got 42575bytes) bytes)。如何解决呢?就是要重签名的apk后缀改成zip,打开后删除里面的META-INF目录,然后重新改成apk后缀,再进行签名就可以了。

    展开全文
  • 本人现在公司需要开发一个手机助手的apk,需要系统权限,但是获取系统签名都是本平台的系统签名, 我很好奇像360这种他是怎么获取全平台的系统签名的。随便下载安装就可以,不用特别去针对平台进行签名。 有大神...
  • 有时写一个程序需要调用系统的库,...这时就需要将apk进行系统签名了。   简单常用的方法:  1,在apk的AndroidManifest.xml中的manifest节点中加入android:sharedUserId="android.uid.system"  2,运行或打包得到a
  • 1.修改AndroidManifest.xml,改变uid为android.uid.system,使之与Settings能够共享数据空间。 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.txx.test4bluetooth" ...
  • 首先工作中运行完代码,必须给apk进行系统签名,每次都是运行完了,离线进行签名,然后push进系统,比较的麻烦,所以讲使用Android studio进行系统的签名。 步骤可以参考网上例如文章链接 首先生成jks文件,...
  • 获取系统签名sha1值两种方法: 方法一解压apk通过cmd(命令行获取): 1、系统签名apk文件,解压(重命名为rar文件) 2、取出META_INFO中CERT.RSA文件。 3、cmd下执行keytool -printcert -file CERT.RSA路径。 4...
  • 有时候,我们开发的apk需要用到系统权限,需要在AndroidManifest.xml中添加共享系统进程属性:   android:sharedUserId="android.uid.system" android:sharedUserId="android.uid.shared" ...
  • android系统没有root权限是不能进行一些敏感操作的,在定制的Android系统中往往需要获取root权限来进行一些系统操作!在这种情况下我们只需要把我们的app变成系统应用就能进行这些操作。 相关资源文件获取 获取...
  • 在使用百度地图,微信分享等等第三方SDK的时候,都需要在对应的网站上注册应用信息,其中之一就是通过包名和签名生成一个MD5或者SHA1编码的字符串。 通常情况下,这些信息可以通过ADT工具或者keytool命令工具去...
  • 关于定制系统,给你的Android应用系统签名 今天来点简单的我相信很多定制系统的同学都会有一些特定功能的需求,比如修改系统时间 静默安装 执行某shell命令 这些对于正常的应用来说,是需要很多技巧性的东西来做...
  • 这件事困扰我们多时了。...这种获取系统签名的方法如下: 1、apk中需要使用android:sharedUserId=”android.uid.system” 这个属性。在Manifest文件修改,如下: <manifest xmlns:android="http://sc
  • android 系统签名

    2018-10-17 20:55:14
    获取系统权限的应用就必须要有系统签名,但是在开发一个系统的时候,为了系统的安全性,往往会去改变系统的签名。我们都知道通过platform.pk8 platform.x509.pem和signapk.jar可以对应用进行签名操作,但是这样很...
  • 在Terminal命令窗输入:进入到C盘的.android文件夹,然后输入keytool -list -v -keystore F:\Words\xxxxxxxx.jks 这个输入密钥库口令: 是签名打包的密码,不是android默认的 前提是:必须要配置JAVA的环境...
  • 最近在研究Android应用中的安全问题,貌似只有将核心代码写到JNI底层才是最安全的。通过底层来判断签名是否正确,如果正确则继续执行核心代码,否则退出程序,这样就可以防止别人恶意反编译,并进行二次打包。所以...
  • FROM:... signapk.jar与eclipse export插件默认赋予程序一个DEBUG权限的签名 signapk.jar包含有系统权限(system api, permission),而eclipse export插件默认赋予程序一个DEBUG权限的签名
  • 为什么80%的码农都做不了架构师?>>> ...
1 2 3 4 5 ... 20
收藏数 24,512
精华内容 9,804
关键字:

系统签名 获取android