记录jdk的命令行使用记录
javac
1.java命令行编译多个源文件
javac -d . Example1.java Example2.java
Example1是主类,要用到Exmaple2
执行:java com.example.Example1,执行时要加上完整包名
1.1java文件编译和打包为jar文件
下载了jmp123的文件,是代码源文件,树形解构的代码叶子目录有3个,每个下面都有java源文件,这种情况如何使用
javac命令进行打包。以下是3种方法,二和三未测试。
(1)分别编译
javac -d . jmp123/decoder/*.java
javac -d . jmp123/demo/*.java
javac -d . jmp123/output/*.java
(2)一起编译
javac -d . jmp123/decoder/*.java jmp123/demo/*.java jmp123/output/*.java
(3)将所有需要编译的java源文件路径放入一个文本文件,并命名,如1.txt
javac -d . @1.txt
2.java命令行编译使用外部jar包
javac -cp jdom.jar -d . IFlow.java NetworkUtil.java
执行:java -classpath jdom.jar; com.bu.qs.IFlow ;注意空格和分号;
3.java将类文件打成jar包
jar -cvf class.jar com\test\unityforandroid\*
这里的命令路径是基于Windows的,如果在Linux,Mac使用需要使用
/
分隔路径。
class.jar表示生成的jar名字
*表示所有的class文件
3.5使用jar命令将项目class文件打包为可执行的jar包
Linux Ubuntu20.04
- 准备一个Manifest文件MANIFEST.MF,内容如下,这里包名为game,主类名为RunGame,具体内容根据实际情况修改
Manifest-Version: 1.0
Main-Class: game.RunGame
- 执行命令
jar -cvfm ok.jar OkGame/src/META-INF/MANIFEST.MF -C . game/ -C . *
-C参数特殊说明:-C参数后面需要指定两个参数,param1 param2;其中param1表示当前打包时的当前工作目录,param2参数需要添加的资源。如上命令就是将com/javartisan/ 与当前Main.*资源放到jar中;
参考,如果有资源,可以复制到和jar相同的目录即可正常运行。
3.6jar包引入后运行出现错误提示
com/brackeen/sound/SoundManager has been compiled by a more recent version of the
Java Runtime (class file version 55.0), this version of the Java Runtime
only recognizes class file versions up to 52.0
由于安装的java jdk目前是11,运行是环境是jre8,看这个意思jre不支持运行jdk11编译出来的class文件。
这种情况得怎么办呢?
咨询某一言后,
(1)方案1
提示使用javac -target 8 xxx.java
进行编译
结果提示
警告: 目标发行版 8 与默认的源发行版 11 冲突
此方案不可行。
(2)方案2
使用安装了jdk8的Windows 7系统进行编译,编译通过,然后打包jar类库,引入项目后正常执行。
针对错误提示的class file version55和52这两个数字,使用GHex查看class文件对比了一下
重点看第八个字节,37和34代表的就是class file version,这里是16进制对应的就是55和52
jdk11编译的class
jdk8编译class
4.警告:编码 GBK 的不可映射字符
由于JDK是国际版的,在编译的时候,如果我们没有用-encoding参数指定我们的JAVA源程序的编码格式,则javac.exe首先获得我们操作系统默认采用的编码格式,也即在编译java程序时,若我们不指定源程序文件的编码格式,JDK首先获得操作系统的file.encoding参数(它保存的就是操作系统默认的编码格式,如WIN2k,它的值为GBK),然后JDK就把我们的java源程序从file.encoding编码格式转化为JAVA内部默认的UNICODE格式放入内存中。然后,javac把转换后的unicode格式的文件进行编译成.class类文件,此时.class文件是UNICODE编码的,它暂放在内存中,紧接着,JDK将此以UNICODE编码的编译后的class文件保存到我们的操作系统中形成我们见到的.class文件。对我们来说,我们最终获得的.class文件是内容以UNICODE编码格式保存的类文件,它内部包含我们源程序中的中文字符串,只不过此时它己经由file.encoding格式转化为UNICODE格式了。当我们不加设置就编译时,相当于使用了参数:javac -encoding gbk XX.java,当然就会出现不兼容的情况。
解决办法是:应该使用-encoding参数指明编码方式:javac -encoding UTF-8 XX.java
【参考自他人blog,感谢】
adb(android debug bridge)
I.ADB启动与关闭app
adb shell am start com.youtube.film/.pad.SplashActivity
adb shell am force-stop com.youtube.film
II.ADB安装卸载apk
xxx为举例,根据实际情况变通
adb install -r xxx.apk
-r是覆盖安装
adb install -t xxx.apk
debug签名需要-t参数安装
adb uninstall xxx
根据包名卸载app
III.adb logcat抓日志用法
有时候连接usb调试后,日志显示一下就消失了,最后有一个EOF类似的提示,目测是日志缓存满了,目前不是很确定。
adb logcat -G 3m
如果日志时有时无,不能稳定输出log,执行下
adb logcat -v time >~/log.txt
保存logcat日志到文件(迷茫的命令)
IV.adb查看设备的Android系统版本号和api level
adb shell getprop ro.build.version.release
adb shell getprop ro.build.version.sdk
V.根据包名查找启动activity
adb shell dumpsys package com.youtube.film
查找启动页面activity【
Activity Resolver Table:
Schemes:
youtube:
9e6fd2 com.youtube.film/.activity.UnitActivity filter 1731e69
Action: "android.intent.action.VIEW"
Action: "android.intent.action.MAIN"
Category: "android.intent.category.DEFAULT"
Category: "android.intent.category.BROWSABLE"
Category: "android.intent.category.LAUNCHER"
Scheme: "youtube"
Authority: "youtube.film.com": -1
AutoVerify=true
。。。
】
VI.查找前台运行的app当前activity页面
Windows
adb shell dumpsys window | findstr mCurrentFocus
Mac/Linux
adb shell dumpsys window | grep mCurrentFocus
参考
https://blog.csdn.net/wangluonanhai/article/details/122584545
VII.
根据V命令的执行结果,制定命令,结果字符串中要包含’/‘和’filter’,命令如下
adb shell dumpsys package com.yougtube.film | grep \/ |grep filter
这个命令如果在Windows中执行,将grep变为findstr即可
一般执行完VII命令,第一行结果就包含我们想要的app启动页面了,再执行如下命令即可启动app。
adb shell am start com.yougtube.film/.MainActivity
IX.adb修改Android系统时间
adb shell
date "2023-03-10"
date "17:41:09"
实际测试发现日期和时间需要分别设置否则不管用。