Android Studio调用系统隐藏接口EthernetManager


google source签名文件参考:https://android.googlesource.com/platform/build/+/donut-release/target/product/security/
pem转jks来实现系统签名文件:https://blog.csdn.net/cxq234843654/article/details/51557025

 

项目需要实现以太网的管理功能,查阅源码后得知EthernetManager属于系统接口,具有@hide属性,所以在Android SDK中找不到这些接口,编译会失败。

EthernetManager接口具有系统权限,需将APP变成系统应用才可正常使用。

 

解决编译问题

一、我们先获取并编译Andorid源码,找到以下文件,解压后可以看到,classes.jar中包含所有API

$ANDROID_SOURCE/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar

二、下载BeyondCompare工具,将此classes.jar和工程中使用的android.jar比对,将用到的部分合并到android.jar中

 

解决运行问题

一、进入以下目录获取系统签名文件platform.pk8和platform.x509.pem

# ls $ADNDROID_SOURCE/build/target/product/security

platform.pk8
platform.x509.pem

二、进入以下目录找到签名工具signapk.jar

$ANDROID_SOURCE\out\host\linux-x86\framework\signapk.jar

三、通过工具给apk进行系统签名,demo.apk是你的apk,demo_signed.apk就是系统签名后的apk

java -jar signapk.jar platform.x509.pem platform.pk8  demo.apk  demo_signed.apk

 四、查看.x509.pem文件内容

openssl x509 -in platform.x509.pem -noout -text

通过pem系统签名文件生成jks格式签名文件

开发过程中先生成APK,再用signapk.jar签名太繁琐,不利于研发调试,我们想办法通过platform.pk8和platform.x509.pem生成.jks文件,然后从build.gradle引入

一、首先把private key (pkcs8) 从DER format转成PEM format

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

二、然后把private key跟public key转成pkcs12

# openssl pkcs12 -export -in platform.x509.pem -inkey platform.pem -out platform.pkcs12

三、最后用keytool把 (pkcs12) 转成jks (platform.jks)

keytool -importkeystore -srckeystore platform.pkcs12 -srcstoretype pkcs12 -srcstorepass "password" -destkeystore platform.jks -deststoretype jks -deststorepass "password"

四、查看jks信息,默认alias是1,jks文件的别名密码修改可参见help

keytool -v -list -keystore platform.jks 

 

在Android Studio中实时系统签名

一、menifest文件添加系统应用属性

android:sharedUserId="android.uid.system"

二、添加以太网以及系统接口权限

<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" />

三、build.grade自定义jsk签名文件


signingConfigs {
release {
storeFile file("$YOUR_PATH/platform.jks")
storePassword '000000'
keyAlias 'aliasname'
keyPassword '000000'
}

debug {
storeFile file("$YOUR_PATH/platform.jks")
storePassword '000000'
keyAlias 'aliasname'
keyPassword '000000'
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}

debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.debug
}
}

四、调个接口试试

mEthernetManager = (EthernetManager) context.getSystemService("ethernet");

 

posted @ 2018-04-17 14:47  老金280  阅读(3666)  评论(0编辑  收藏  举报