IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]Android实战技巧之五十:App的系统签名

    lincyang发表于 2016-03-15 18:18:11
    love 0

    这件事困扰我们多时了。
    我们一直想用非源码编译的方式解决此事,按如下步骤。

    这种获取系统签名的方法如下:
    1、apk中需要使用android:sharedUserId=”android.uid.system” 这个属性。在Manifest文件修改,如下:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.linc.systemsigndemo"
        android:sharedUserId="android.uid.system"
        >
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>

    2、将app做无签名编译(Android Studio)
    用命令行编译

    Windows: gradlew.bat assembleRelease 
    Mac/linux: ./gradlew assembleRelease

    3、对apk进行系统签名。
    1)、在android源码下build/target/product/security找到两个密钥文件platform.x509.pem platform.pk8
    2)、out/host/linux-x86/framework/signapk.jar找到系统封装工具signapk.jar
    3)、使用命令java -jar signapk.jar platform.x509.pem platform.pk8 test.apk testnew.apk

    安装时遇到的问题:

    Installation failed with message INSTALL_FAILED_SHARED_USER_INCOMPATIBLE.

    困扰了大概半个月,最后觉得还是源码编译吧。
    1、将Android Studio项目复制到源码packages/apps/路径下
    2、从其他项目如Settings复制Android.mk,做一些修改如下:

    LOCAL_PATH:= $(call my-dir)
    include $(CLEAR_VARS)
    
    LOCAL_JAVA_LIBRARIES := bouncycastle conscrypt telephony-common
    LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4 android-support-v13 jsr305
    
    LOCAL_MODULE_TAGS := optional
    
    LOCAL_SRC_FILES := \
            $(call all-java-files-under, app/src/main/java/) \
    
    LOCAL_PACKAGE_NAME := SystemSignDemo
    LOCAL_CERTIFICATE := platform
    LOCAL_PRIVILEGED_MODULE := true
    
    LOCAL_PROGUARD_FLAG_FILES := proguard.flags
    
    LOCAL_AAPT_FLAGS += -c zz_ZZ
    
    include $(BUILD_PACKAGE)
    
    # Use the folloing include to make our test apk.
    include $(call all-makefiles-under,$(LOCAL_PATH))

    3、将res文件夹和Manifest文件拷到与Android.mk同级目录(项目的根目录)
    4、编译

    mm -B

    5、成功后会生成两个文件: .odex和.apk文件
    前者是优化过的可执行程序。此时可以把apk文件当成普通的应用安装即可。

    6、如何证明已经获得系统签名
    很简单,使用SystemClock.setCurrentTimeMillis修改系统时间,将其修改为12:15,如下:

     mTvInfo.setText("time: "+SystemClock.currentThreadTimeMillis());
    
            Calendar c = Calendar.getInstance();
    
            c.set(Calendar.HOUR_OF_DAY, 12);
            c.set(Calendar.MINUTE, 15);
            long when = c.getTimeInMillis();
    
            if (when / 1000 < Integer.MAX_VALUE) {
                Log.d(TAG,"set time");
                mTvInfo.append("\nset time when: "+when);
                SystemClock.setCurrentTimeMillis(when);
            }

    Good Luck!



沪ICP备19023445号-2号
友情链接