赞
踩
本文基于qcom msm8909 android5.1平台,因为客户需求以及实际使用,主板接入的显示屏有各种尺寸,这样对屏幕的显示造成了极大的影响,因此着手开发了一个设置功能,主要针对屏幕分辨率和density等参数的设置。
首先想到的是调试过程中,在android4.3之后,官方引入了一个wm的命令工具(wm工具简介及使用),但在开发过程中,遇到个很蛋痛的问题,问题现象如下:
笔者采用jni的方式使用C popen函数执行wm 相关命令,这里解释下为什么引用popen函数,不是也可以用system,exec族么?原因是我们可以通过popen得到执行命令的结果。
但当所有代码噼里啪啦噼里啪啦的写完之后,运行发现:卧槽,为啥wm + 子命令 可以完美的执行,但wm+子命令+参数却毫无反应,jni执行下去,你真的没看错,毛反应都没有,然后我没办法,将jni中C 代码独立出来,单独编译成可执行程序放入系统中,执行,卧槽,没问题啊,完美执行啊,这TM是啥情况?搞了一天,脑子越搞越昏,完全不知道问题何在?(最终问题也没找到,有人知道的希望指导指导)
那么,时间比较紧,此路不同,当寻他路,笔记就开始一路百度,谷歌,突然,发现个比较闪眼的字眼--反射,脑子里闪过,反射是什么?(这里解释下,笔者涉及的知识面毕竟广,但都不精,而且从业经验还比较少,希望各路大佬不要鄙视)。
于是乎,又开始百度,谷歌,但是,问题又TM来了,我按照网上的教程,叫aidl文件导入工程,TM的简直是各种奇葩错误,无从下手啊,在挣扎了几个小时候,又放弃了,继续开始寻求他路,但寻路核心还是绕着反射这两个字以及我想要反射获取的方法的类。
终于,皇天不负有心人,突然找到个博客,这个博客也许对我没太大帮助,但,他告诉我,我可以在我得android工程中,使用系统隐藏的API,哈哈哈哈哈哈哈哈哈,既然可以这样,那TM就好办了啊。
博客地址:android模拟按键问题总结[使用IWindowManager.injectKeyEvent方法]_xudongdong99的博客-CSDN博客_android injectkeyevent
导入源码编译的jar,以供自己的android项目使用隐藏系统API:
out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar
将class.jar 导入 android项目
导入后发现报错了:Error:Execution failed for task ':app:transformDexArchiveWithExternalLibsDexMergerForDebug':unable to merge dex
这个应该是某些包名冲突了,但我表示很懒,不想一个个找是哪个冲突了啊,于是乎,百度到个救命稻草:
然后,编译,哦豁,过了,nice!
既然可以使用系统隐藏的API,那我何不参照wm命令是怎么实现的呢?
找到wm命令的源码位置:vi frameworks/base/cmds/wm/
打开src/com/android/commands/wm/Wm.java
先分析下源码内容:分析内容
通过分析得到,原来他就用了这个aidl里面的方法:IWindowManager
所用部分方法:
wm size :getInitialDisplaySize,getBaseDisplaySize,setForcedDisplaySize,clearForcedDisplaySize
wm density:getInitialDisplayDensity,getBaseDisplayDensity,setForcedDisplayDensity,clearForcedDisplayDensity
其余的大家可以阅读源码自己分析下。
这样,我参照该源码实现,移植到我的项目工程中,然后编译,哦豁,完美,可以运行了,nice!
移植步骤可参考如下:
这样,就可以根据需要去调用IWindowManager里面的接口的方法了,简直是美滋滋。
哈哈哈哈哈哈,高兴之余,老天又开了个玩笑,滴滴,运行后执行修改操作,艹,报错了!!!
logcat 一看,去你大爷的,还好,问题不大,权限问题,哈哈哈,源码再手,不怕你权限问题。
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />权限报错
具体找不到log了,就是这个权限报错,那么,兵来将挡水来土掩啊,怕甚,搞个系统签名,NND,签名过后,install,run
nice,成功设置,完美!!!
Ps:同样的方法我应用到qcom msm8953 android7.1 平台上,遇到了一些其他问题,这里记录下。
1.导入android7.1 的 classes.jar,出现如下错误
解决办法:参考AndroidStudio 编译报错 DexArchiveBuilderException_T9的第三个三角的博客-CSDN博客
gradle.properties 中 添加
android.enableD8 = true
2:IWindowManager中部分方法找不到
解决办法:相比android5.1,部分方法有点变动,阅读参考android7.1 WM源码,作相应的调整
3:给app应用系统签名打包出错
解决方法:
参考解决平台apk签名错误:no conscrypt_openjdk_jni in java.library.path_Hellolefty的博客-CSDN博客
解决方法:将以下所有文件放入同一个文件夹命名为sign
1、在Android系统源码中的\build\target\product\security目录下找到 platform.x509.pem 和platform.pk8两个文件;
2、在out/host/Linux-x86/framework目录下找到signapk.jar文件
3、找到 libconscrypt_openjdk_jni库
若是Linux系统
拷贝prebuilts/sdk/tools/linux/lib64/libconscrypt_openjdk_jni.so
若是mac系统
拷贝prebuilts/sdk/tools/darwin/lib64/libconscrypt_openjdk_jni.dylib
4、需要进行系统签名的app.apk
5、进入sign目录执行如下命令即可完成签名:
java -Djava.library.path=. -jar signapk.jar platform.x509.pem platform.pk8 app.apk app_sign.apk
【此做法在linux系统里才有效】java -Djava.library.path=. -jar signapk.jar platform.x509.pem platform.pk8 app-release.apk new.apk
文中语气词什么的比较多,还望各位看官莫要鄙视,有问题请多多指教,感谢!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。