当前位置: 代码迷 >> 综合 >> 2021-11-04 AndroidR 第三方应用添加系统签名方法加测试app源码
  详细解决方案

2021-11-04 AndroidR 第三方应用添加系统签名方法加测试app源码

热度:67   发布时间:2023-11-27 11:31:37.0

一,AndroidR 第三方应用添加系统签名方法,我这里是MTK平台上测试。

二、网上介绍的方法有几种,我这里就只介绍一个我实际操作成功的,用signapk.jar 对apk签名。

       1、  apk要想获得系统级app的权限需要在AndroidManifest.xml中的manifest节点中加入  android:sharedUserId="android.uid.system"

       2、  找到源码中的signapk.jar包(./out/host/linux-x86/framework/signapk.jar

或是./prebuilts/sdk/tools/lib/signapk.jar)

       3、  在源码中拷贝 platform.x509.pem、platform.pk8(位于../build/target/product/security)

不同平台的位置不同,需要正确路径下的platform.x509.pem、platform.pk8,否则签名会失败。

我的这个sdk这两个文件的路径是device/mediatek/security,我先前都以为是/build/target/product/security,真是害苦我了。

       4、   把signapk.jar  platform.x509.pem、platform.pk8和需要签名的apk放在一个文件下,使用命令:

       java -Djava.library.path="../../work/apls/androidsdk/prebuilts/sdk/tools/linux/lib64/" -jar signapk.jar platform.x509.pem platform.pk8 app-release-unsigned.apk app-release-signed.apk

       5、我这里是在ubuntu下执行的效果图,在ubuntu下执行需要带-Djava.library.path,不然会报错Caused by: java.lang.IllegalArgumentException: Failed to load any of the given libraries: [conscrypt_openjdk_jni-linux-x86_64。

       6、或者把prebuilts/sdk/tools/linux/lib64/libconscrypt_openjdk_jni.so 文件copy到目录下面,然后执行java -Djava.library.path=.  -jar signapk.jar platform.x509.pem platform.pk8 app-debug.apk app-release-signed.apk

 

       7、在window下运行

 三、搞一个app来验证一下是不是签名后获得系统app的权限,下面的这个app写系统时间和写settings里面的值,这两者都是需要系统权限的app才可以。

    1、src\main\AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.giada.myapplication"android:sharedUserId="android.uid.system"><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.MyApplication"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application><uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"></uses-permission><uses-permission android:name="android.permission.INSTALL_PACKAGES" />
</manifest>

    2、build.gradle ,注意的是 targetSdkVersion 这个值能高于30,30以上签名之后无法安装

会报这样一个错:

 

plugins {id 'com.android.application'
}android {compileSdkVersion 31buildToolsVersion "30.0.3"defaultConfig {applicationId "com.giada.myapplication"minSdkVersion 25targetSdkVersion 29versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}
}dependencies {implementation 'androidx.appcompat:appcompat:1.1.0'implementation 'com.google.android.material:material:1.1.0'implementation 'androidx.constraintlayout:constraintlayout:1.1.3'testImplementation 'junit:junit:4.+'androidTestImplementation 'androidx.test.ext:junit:1.1.1'androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}

    3、src\main\res\layout\activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:gravity="center"android:orientation="horizontal"><TextViewandroid:id="@+id/itext"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello World!"/><Buttonandroid:id="@+id/ibutton"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="write new value"android:onClick="write_settings_database"/></LinearLayout>

    4、src\main\java\com\giada\myapplication\MainActivity.java

package com.giada.myapplication;import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.SystemClock;
import android.provider.Settings;
import android.database.ContentObserver;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;import java.util.Calendar;public class MainActivity extends Activity {private TextView tv_time;private int i=0;private static  String TAG="settingdatebasedemo";ChangeContentObserver mChangeContentObserver = null;ChangeSContentObserver mChangeSContentObserver = null;// 如果第三方应用是写不到Setting 数据库的,必须需要系统权限@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tv_time = (TextView) findViewById(R.id.itext);mChangeContentObserver = new ChangeContentObserver();mChangeSContentObserver= new ChangeSContentObserver();getContentResolver().registerContentObserver(Settings.Global.getUriFor("global_test"), true, mChangeContentObserver);getContentResolver().registerContentObserver(Settings.System.getUriFor("volume_ring_speaker"), true, mChangeSContentObserver);}      public void write_settings_database(View v){i+=12;Calendar c = Calendar.getInstance();tv_time.setText("time: "+SystemClock.currentThreadTimeMillis());c.set(Calendar.HOUR_OF_DAY, 13);c.set(Calendar.MINUTE, 29);long when = c.getTimeInMillis();if (when / 1000 < Integer.MAX_VALUE) {Log.d(TAG,"set time");tv_time.append("\nset time when: "+when);SystemClock.setCurrentTimeMillis(when);}SetGlobalData(this.getApplicationContext(),"global_test", i);//getContentResolver().notifyChange(Settings.Global.getUriFor("haiyue"),null);//这个方法也是要在有上下文的地方执行,一般是在自定义的Provider中执行,第一个是url对象,第二个参数是null//getContext().getContentResolver().notifyChange(URI,null);//数据进行增删查成功后,都执行一下上面这个方法即可。tv_time.setText(String.valueOf(GetGlobalData(this.getApplicationContext(),"global_test")));}class ChangeSContentObserver extends ContentObserver {public ChangeSContentObserver (Handler handler) {super(handler);}public ChangeSContentObserver () {// TODO Auto-generated constructor stubsuper(new Handler());}@Overridepublic void onChange(boolean selfChange) {super.onChange(selfChange);Toast.makeText(MainActivity.this,"i:volume_ring_speaker value has changed!", Toast.LENGTH_LONG).show();Log.d(TAG, "ChangeSContentObserver -->volume_ring_speaker value changed(" + selfChange + ") ");}}    /** 监听值变化*/class ChangeContentObserver extends ContentObserver {public ChangeContentObserver (Handler handler) {super(handler);}public ChangeContentObserver () {// TODO Auto-generated constructor stubsuper(new Handler());}@Overridepublic void onChange(boolean selfChange) {super.onChange(selfChange);Toast.makeText(MainActivity.this,"i:global_test value has changed!", Toast.LENGTH_LONG).show();Log.d(TAG, "ChangeContentObserver --> onChange(" + selfChange + ") ");}}//Setting 数据库中写值   this.getApplicationContext()public static void SetGlobalData(Context cxt,String name,int value) {try {boolean rtv=false;Log.i(TAG,"SetGlobalData rtv="+rtv);rtv=Settings.Global.putInt(cxt.getContentResolver(), name, value);Log.i(TAG,"SetGlobalData rtv="+rtv);} catch (Exception e) {if (e != null) {Log.i(TAG, "setRecorderRear(Context," + value + ")> " + e.getMessage());}}}//Setting 数据库中读取值public static int GetGlobalData(Context cxt,String name) {//  Log.i("TAG",getdata() )try {return Settings.Global.getInt(cxt.getContentResolver(), name, -1);} catch (Exception e) {if (e != null) {Log.i(TAG, "getRecorderRear(Context)> " + e.getMessage());}}return 0;}@Overrideprotected void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();getContentResolver().unregisterContentObserver(mChangeContentObserver);}
}

    5、然后在android studio 左下方设置编译成release apk。

     6、编译出来的apk按上面的步骤签名。

     7、执行效果如下,点击button之后系统系统会变化,settings里面的值也可以写成功,说明签名的apk是系统级别的app了,恭喜您!

    8、用 keytool -printcert -jarfile 命令查看apk的签名信息

     9、adb shell pm dump packages 查看app是不是已经系统签名过了

 

有价值的参考文章

Android给第三方应用添加系统签名的两种方式_pshiping2014的博客-CSDN博客

APK签名提示Exception in thread “main“ java.lang.ExceptionInInitializerError错误-物联网技术文章-傲云电气网

乐固、360加固在android 11 上报错,无法安装 - 简书

Android Studio编译release版本_tanzl_814的博客-CSDN博客_android studio 编译release