懒人的技术笔记

做一个好设计,写一手好程序,经营一个好产品。

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

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

这种获取系统签名的方法如下:
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!

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lincyang/article/details/50898763
文章标签: 系统签名 sign
个人分类: Android
所属专栏: Android实战技巧
想对作者说点什么? 我来说一句

安卓app签名获取工具

2015年06月22日 281KB 下载

没有更多推荐了,返回首页

不良信息举报

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

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭