Android _rk3399硬件控制说明(nanopcT4)

我的资源里面有下面所有的资源下载链接https://download.csdn.net/download/qq_33593411/12165182
nanopcT4核心soc芯片是rk3399,使用Android控制硬件应用的权限必须是系统权限,一种方式是将APP放到的放到Android源码中编译,另一种需要对APK进行签名才能让app拥有system权限.
由于我们做apk需要调试所以本次主要针对APK进行系统签名获取system权限.虽然过程比较繁琐但是一劳永逸.
备注:源码下载地址
BSP source code download link: https://gitlab.com/friendlyelec/rk3399-android-8.1
BSP source code location on the network disk: sources/rk3399-android-8.1.git-YYYYMMDD.tgz
Latest ROM download link: http://download.friendlyarm.com/NanoPC-T4
一、 获得系统签名证书。
a) 我们在进行Android开发的时候,如果开发的是系统应用,都需要系统的签名才能正常运行。而系统应用一般是把代码统一放到系统代码库中跟随系统一起编译。而如果我们想用Android Studio单独开发某个应用而使用系统签名的时候,有两种开发的方式,一种是编译完成后,使用SignApk.jar来进行签名,另外一种是把系统的 platform.x509.pemplatform.pk8 转换成为Android Studio常用的 .keystore文件,编译时候自动签名。Android系统签名证书的目录一般在源码根目录下具体路径是:build/target/product/security。但是在我们的rk3399-android-8.1源码中没有上述目录,经过寻找找到了类似的目录,这个目录的确是存放系统证书的目录而且有使用说明。如图1.a1 具体链接:https://gitlab.com/friendlyelec/rk3399-android-8.1/-/tree/master/build/make/target/product/security。我们可以将整个目录下载下来.具体做法如图1.a2
在这里插入图片描述
图1.a1
在这里插入图片描述
图1.a2
b) 将文件下载下来后我们需要提取出platform.pk8和platform.x509.pem 这两个文件并将其生成.keystore文件具体生成方法(使用Ubuntu系统能运行 windows下git-bash模拟LINUX命令无法生成需要的文件):
i. 新建文件夹并打开终端如下图:
在这里插入图片描述

	ii.	生成shared.priv.pem 使用命令: 

openssl pkcs8 -in platform.pk8 -inform DER -outform PEM -out shared.priv.pem -nocrypt
在这里插入图片描述
iii. 生成PC12文件:依然在本菜单里面的终端进行; 其中name依据个人爱好起的名字,中途需要输入密码一般使用:android(理论上可以自定义密码但是暂时没试)下面是命令
openssl pkcs12 -export -in platform.x509.pem -inkey shared.priv.pem -out shared.pk12 -name androiddebugkey
在这里插入图片描述
iv. 检查本机keytool是否可用:使用keytool生成 .keystore文件用于android studio项目中,其中keytool是java/bin里面的一个工具,由于Ubuntu系统没有安装jdk,我的电脑win7系统jdk版本1.8.0_201具体操作:
检查本电脑是否安装了java(理论上都安装着呢,因为我们都有android studio)
在这里插入图片描述
在这里插入图片描述

添加环境变量使用目的是使用keytool
在这里插入图片描述
测试功能正常显示一下则正常
在这里插入图片描述

v.	keytool生成 .keystore文件:将Linux系统里面的文件拷贝回本系统中并使用此命令生成.keystore文件

keytool -importkeystore -deststorepass android -destkeypass android -destkeystore debug.keystore -srckeystore shared.pk12 -srcstoretype PKCS12 -srcstorepass android -alias androiddebugkey

在这里插入图片描述
在这里插入图片描述
vi. 应用信息,查看授权文件的信息
在这里插入图片描述

vii.	写一段程序来提取我们APP里面的SHA1值看一下是否和我们的秘钥一样

Log.i("信息", getCertificateSHA1Fingerprint(this));//这样把他打印出来

//这个是获取SHA1的方法
public static String getCertificateSHA1Fingerprint(Context context) {
//获取包管理器
PackageManager pm = context.getPackageManager();
//获取当前要获取SHA1值的包名,也可以用其他的包名,但需要注意,
//在用其他包名的前提是,此方法传递的参数Context应该是对应包的上下文。
String packageName = context.getPackageName();
//返回包括在包中的签名信息
int flags = PackageManager.GET_SIGNATURES;
PackageInfo packageInfo = null;
try {
//获得包的所有内容信息类
packageInfo = pm.getPackageInfo(packageName, flags);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
//签名信息
Signature[] signatures = packageInfo.signatures;
byte[] cert = signatures[0].toByteArray();
//将签名转换为字节数组流
InputStream input = new ByteArrayInputStream(cert);
//证书工厂类,这个类实现了出厂合格证算法的功能
CertificateFactory cf = null;
try {
cf = CertificateFactory.getInstance(“X509”);
} catch (Exception e) {
e.printStackTrace();
}
//X509证书,X.509是一种非常通用的证书格式
X509Certificate c = null;
try {
c = (X509Certificate) cf.generateCertificate(input);
} catch (Exception e) {
e.printStackTrace();
}
String hexString = null;
try {
//加密算法的类,这里的参数可以使MD4,MD5等加密算法
MessageDigest md = MessageDigest.getInstance(“SHA1”);
//获得公钥
byte[] publicKey = md.digest(c.getEncoded());
//字节到十六进制的格式转换
hexString = byte2HexFormatted(publicKey);
} catch (NoSuchAlgorithmException e1) {
e1.printStackTrace();
} catch (CertificateEncodingException e) {
e.printStackTrace();
}
return hexString;
}
//这里是将获取到得编码进行16进制转换
private static String byte2HexFormatted(byte[] arr) {
StringBuilder str = new StringBuilder(arr.length * 2);
for (int i = 0; i < arr.length; i++) {
String h = Integer.toHexString(arr[i]);
int l = h.length();
if (l == 1)
h = “0” + h;
if (l > 2)
h = h.substring(l - 2, l);
str.append(h.toUpperCase());
if (i < (arr.length - 1))
str.append(’:’);
}
return str.toString();
}

致此我们的.keystore文件已经生成了,~! 为了找这个文件真的很难,如果不这样做我们必须得做完APP然后将.apk文件在源码中编译,我们调试一次周期会大大加长后果很难想象.当时我都有点对这个开发板失去信心了,都想换回使用QT来做应用(因为只要是QT权限改成root生成的应用也是系统应用),但是想想安卓的占有率这么大所以又放弃了QT。

二、 配置android studio
a) 将证书文件加入到android studio
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
b) 在应用程序的AndroidManifest.xml中的manifest节点中加入以下属性:android:sharedUserId="android.uid.system 做好后是这样的
在这里插入图片描述
c) 在应用加入1-b-vii代码编译并传入nanopcT4开发板得到应用的SHA1
在这里插入图片描述

三、 我们拿到了系统证书,然后又将系统证书匹配给了android studio,这时我们就可以调用系统文件来控制nanopcT4的硬件了,但是官网给的是eclipse SDK的配置。android studio有些地方需要注意,我就是因为目录没有弄好,要么加载不了 .so库。废了半天劲找解决了加载.so库了然后系统又报错No implementation found for %$##%^& 意思是 ”找不到方法的实现”。最后将目录格式调整了才正式能用了。具体过程如下
a) 使用git将文件复制过来

在这里插入图片描述
b) 将git到的java文件放到android根目录-src->main->java->com->(新建friendlyarm.FriendlyThings)里面: (务必使用指定目录样式否则无法运行会报出No implementation found for **%$##%^&这样的故障)
在这里插入图片描述
c) 指定JNI库的路径挺且添加.so文件(必须指定此路径如果不指定这个路径会在调用HardwareControler这个库是加载System.loadLibrary(“friendlyarm-things”)失败)
在这里插入图片描述
d) 添加.mk文件
在这里插入图片描述

    到这里基本上已经配置完了加入代码尝试一下是否有报错

private HardwareControler ss;

//在初始化时加入此代码导出文件 设置GPIO为输出
ss.exportGPIOPin(50);//导出GPIO
ss.setGPIODirection(50, GPIOEnum.OUT); //改变GPIO的方向

//添加一个按钮调用此方法让指示灯亮
HardwareControler.setGPIOValue(50,GPIOEnum.HIGH); //向引脚输出高电平或低电平
Log.i(“信息”,“当前引脚状态:”+HardwareControler.getGPIOValue(50)); //获得引脚的输入(当前的值)

//再添加一个按钮调用此方法让指示灯灭
HardwareControler.setGPIOValue(50,GPIOEnum.LOW); //向引脚输出高电平或低电平
Log.i(“信息”,“当前引脚状态:”+HardwareControler.getGPIOValue(50)); //获得引脚的输入(当前的值)

不出意外的话我们配置完毕了,那我们可以尽情发挥了.
其实如果必须要在内核里面编译硬件代码,可能我就放弃使用android改用Linux+QT拖拖拽拽就能做一个项目.但是做了几天的android开发,我感觉到了java的强大,android强大. (我不懂java。至今天我只看过几集视频,书买了还在路上没邮到家呢),虽然Linux是android的爹但是在某些方面android还是很有优势的就比如说占有率。
作者:张腾飞

发布了3 篇原创文章 · 获赞 1 · 访问量 79

猜你喜欢

转载自blog.csdn.net/qq_33593411/article/details/104361733
今日推荐