出来混迟早是要还的。

在这一篇中https://www.cnblogs.com/sincoolvip/p/5882817.html,只是简单讲了一下获取apk包的package和launchable-activity名称,可以说是个非常不成熟的鸡肋的东西了。当时花的时间也不多,而且当时雄心壮志的还列了几步计划。

现在看一看,真是要耻笑自己,拖了这么久,今天终于补上,由于本人编程能力非常有限,无数资料都是网上搜搜搜,下来拼拼拼,按需改改改才实现的。在过程中一边熟悉掌握知识点,一边实现个体需求,其实是比较难的,要静下心来做事,

说实话做个东西会帮我一天节省网购至少200元的消费。

程序我优化了,目地是实现打开exe界面可以选择apk包和aapt执行目录,然后输出相关信息,最终的效果:

第二版:

改版后效果,使结果可以复制

这个分几步来列吧。

1、java代码实现

这里我直接帖代码吧,细节不说了。整个拿下去就可以用的,有点长啊,那是因为我只会1个java生成jar.囧~~

 package p20181214;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.awt.*;
import javax.swing.*; import java.awt.event.*;
public class YFileChooser implements ActionListener{
JFrame frame=new JFrame("文件选择器实例");
JTabbedPane tabPane=new JTabbedPane();//选项卡布局
Container con=new Container();//布局1
Container con1=new Container();//布局2
JLabel label1=new JLabel("选择aapt目录");
JLabel label2=new JLabel("选择apk文件");
JTextField text1=new JTextField();
JTextField text2=new JTextField();
JButton button1=new JButton("...");
JButton button2=new JButton("...");
JButton button3=new JButton("...");
//放结果
JLabel aapt=new JLabel("....");
JLabel apk=new JLabel("...");
JLabel page=new JLabel("...");
JLabel activity=new JLabel("...");
JFileChooser jfc=new JFileChooser();//文件选择器
YFileChooser(){
jfc.setCurrentDirectory(new File("d:\\"));//文件选择器的初始目录定为d盘
//下面两行是取得屏幕的高度和宽度
double lx=Toolkit.getDefaultToolkit().getScreenSize().getWidth();
double ly=Toolkit.getDefaultToolkit().getScreenSize().getHeight();
frame.setLocation(new Point((int)(lx/2)-150,(int)(ly/2)-150));//设定窗口出现位置
frame.setSize(500,300);//设定窗口大小
frame.setVisible(true);
frame.setContentPane(tabPane);//设置布局
//下面设定标签等的出现位置和高宽
label1.setBounds(10,10,150,20);
text1.setBounds(100,10,300,20);
button1.setBounds(410,10,60,20);//400=上一条100+300
button1.setText("选择");
label2.setBounds(10,30,150,20);
text2.setBounds(100,30,300,20);
button2.setBounds(410,30,60,20);
button2.setText("选择");
button3.setBounds(204,70,60,30);
button3.setText("获取");
aapt.setBounds(30, 126,300 , 20);
apk.setBounds(30, 144,300 , 20);
page.setBounds(7, 180,500 , 20);
activity.setBounds(7, 200,500 , 20);
button1.addActionListener(this);//添加事件处理
button2.addActionListener(this);//添加事件处理
button3.addActionListener(this);//添加事件处理
con.add(label1);
con.add(label2);
con.add(text1);
con.add(text2);
con.add(button1);
con.add(button2);
con.add(button3);
con.add(jfc);
con.add(aapt);
con.add(apk);
con.add(page);
con.add(activity);
tabPane.add("目录/文件选择",con);//添加布局1
// tabPane.add("暂无内容",con1);//添加布局2
frame.setVisible(true);//窗口可见
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//使能关闭窗口,结束程序
}
public void actionPerformed(ActionEvent e){//事件处理
/*if(e.getSource().equals(button1)){//判断触发方法的按钮是哪个
jfc.setFileSelectionMode(1);//设定只能选择到文件夹
int state=jfc.showOpenDialog(null);//此句是打开文件选择器界面的触发语句
if(state==1){
return;//撤销则返回
}
else{
File f=jfc.getSelectedFile();//f为选择到的目录
text1.setText(f.getAbsolutePath());
}
}*/
if(e.getSource().equals(button1)){//判断触发方法的按钮是哪个
jfc.setFileSelectionMode(0);//设定只能选择到文件夹
int state=jfc.showOpenDialog(null);//此句是打开文件选择器界面的触发语句
if(state==1){
return;//撤销则返回
}
else{
File f=jfc.getSelectedFile();//f为选择到的目录
text1.setText(f.getAbsolutePath());
}
}
if(e.getSource().equals(button2)){
jfc.setFileSelectionMode(0);//设定只能选择到文件
int state=jfc.showOpenDialog(null);//此句是打开文件选择器界面的触发语句
if(state==1){
return;//撤销则返回
}
else{
File f=jfc.getSelectedFile();//f为选择到的文件
text2.setText(f.getAbsolutePath());
}
}
if(e.getSource().equals(button3)) {
String aapt1=text1.getText();
String apk1=text2.getText();
System.out.println("aapt="+text1+";apk=="+apk1);
//调获取方法
//Base base=new Base();
java.util.List<String> list= runCMD(aapt1, " dump badging ", apk1);
page.setText("package:"+list.get(0));
activity.setText("activity"+list.get(1));
aapt.setText("aapt.exe目录为:"+aapt1);
apk.setText("apk目录为:"+apk1); }
}
public static List<String> runCMD(String aapt,String command,String apk){
InputStream is =null;
Process process=null;
List<String> slist=new ArrayList<String>();
try {
//process =Runtime.getRuntime().exec("cmd.exe /k "+dir+"&cd "+aapt+"& command");//执行doc命令
process =Runtime.getRuntime().exec(aapt+command +apk);
//后面的所有操作即是读取这个命令的输出结果
is = process.getInputStream();//获取执行CMD命令后的信息
BufferedReader reader =new BufferedReader(new InputStreamReader(is));
String line =null;
StringBuffer sb =new StringBuffer();
while((line = reader.readLine())!=null){
sb.append(line);
}
//截取package字符串
Pattern p =Pattern.compile("package: name(.*?)versionCode");
Matcher m =p.matcher(sb);
List<String> list=new ArrayList<String>();
while(m.find()){
list.add(m.group(1));
}
for (String str : list) {
System.out.println("package"+str);
slist.add(str);
} //截取acvitity字符串,以launchable-activity: name开头, label结尾 获取中间字符串内容
Pattern p1 =Pattern.compile("launchable-activity: name(.*?) label");
Matcher m1 =p1.matcher(sb);
List<String> list1=new ArrayList<String>();
while(m1.find()){
list1.add(m1.group(1));
}
for (String str1 : list1) {
System.out.println("activity"+str1);
slist.add(str1);
} } catch (IOException e) {
e.printStackTrace();
} finally{
try {
process.getOutputStream().close();
is.close();
} catch (IOException e) {
e.printStackTrace();
} } return slist;
}
public static void main(String[] args) {
new YFileChooser(); }
}

第二版代码

package p20181214;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.awt.*;
import javax.swing.*; import java.awt.event.*;
public class YFileChooser implements ActionListener{
JFrame frame=new JFrame("获取apk包的package和activity");
JTabbedPane tabPane=new JTabbedPane();//选项卡布局
Container con=new Container();//布局1
Container con1=new Container();//布局2
JLabel label1=new JLabel("选择aapt文件");
JLabel label2=new JLabel("选择apk文件");
JTextField text1=new JTextField();
JTextField text2=new JTextField();
JButton button1=new JButton("...");
JButton button2=new JButton("...");
JButton button3=new JButton("...");
//放结果
//JLabel aapt=new JLabel("....");
//JLabel apk=new JLabel("...");
//JLabel page=new JLabel("...");
//JLabel activity=new JLabel("...");
JTextArea page_activity=new JTextArea("");
JFileChooser jfc=new JFileChooser();//文件选择器
YFileChooser(){
jfc.setCurrentDirectory(new File("d:\\"));//文件选择器的初始目录定为d盘
//下面两行是取得屏幕的高度和宽度
double lx=Toolkit.getDefaultToolkit().getScreenSize().getWidth();
double ly=Toolkit.getDefaultToolkit().getScreenSize().getHeight();
frame.setLocation(new Point((int)(lx/2)-150,(int)(ly/2)-150));//设定窗口出现位置
frame.setSize(500,300);//设定窗口大小
frame.setVisible(true);
frame.setContentPane(tabPane);//设置布局
//下面设定标签等的出现位置和高宽
label1.setBounds(10,10,150,20);
text1.setBounds(100,10,300,20);
button1.setBounds(410,10,60,20);//400=上一条100+300
button1.setText("选择");
label2.setBounds(10,30,150,20);
text2.setBounds(100,30,300,20);
button2.setBounds(410,30,60,20);
button2.setText("选择");
button3.setBounds(204,70,60,30);
button3.setText("获取");
// aapt.setBounds(30, 126,300 , 20);
// apk.setBounds(30, 144,300 , 20);
//page.setBounds(7, 180,500 , 20);
//activity.setBounds(7, 200,500 , 20);
page_activity.setBounds(7, 126,468 , 200);
button1.addActionListener(this);//添加事件处理
button2.addActionListener(this);//添加事件处理
button3.addActionListener(this);//添加事件处理
con.add(label1);
con.add(label2);
con.add(text1);
con.add(text2);
con.add(button1);
con.add(button2);
con.add(button3);
con.add(jfc);
//con.add(aapt);
//con.add(apk);
//con.add(page);
//con.add(activity);
con.add(page_activity);
tabPane.add("文件选择",con);//添加布局1
// tabPane.add("暂无内容",con1);//添加布局2
frame.setVisible(true);//窗口可见
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//使能关闭窗口,结束程序
}
public void actionPerformed(ActionEvent e){//事件处理
/*if(e.getSource().equals(button1)){//判断触发方法的按钮是哪个
jfc.setFileSelectionMode(1);//设定只能选择到文件夹
int state=jfc.showOpenDialog(null);//此句是打开文件选择器界面的触发语句
if(state==1){
return;//撤销则返回
}
else{
File f=jfc.getSelectedFile();//f为选择到的目录
text1.setText(f.getAbsolutePath());
}
}*/
if(e.getSource().equals(button1)){//判断触发方法的按钮是哪个
jfc.setFileSelectionMode(0);//设定只能选择到文件夹
int state=jfc.showOpenDialog(null);//此句是打开文件选择器界面的触发语句
if(state==1){
return;//撤销则返回
}
else{
File f=jfc.getSelectedFile();//f为选择到的目录
text1.setText(f.getAbsolutePath());
}
}
if(e.getSource().equals(button2)){
jfc.setFileSelectionMode(0);//设定只能选择到文件
int state=jfc.showOpenDialog(null);//此句是打开文件选择器界面的触发语句
if(state==1){
return;//撤销则返回
}
else{
File f=jfc.getSelectedFile();//f为选择到的文件
text2.setText(f.getAbsolutePath());
}
}
if(e.getSource().equals(button3)) {
String aapt1=text1.getText();
String apk1=text2.getText();
System.out.println("aapt="+text1+";apk=="+apk1);
//调获取方法
//Base base=new Base();
java.util.List<String> list= runCMD(aapt1, " dump badging ", apk1);
//page.setText("package:"+list.get(0));
//activity.setText("activity"+list.get(1));
//aapt.setText("aapt.exe目录为:"+aapt1);
//apk.setText("apk目录为:"+apk1);
page_activity.append("package:"+list.get(0)+"\n");
page_activity.append("activity:"+list.get(1));
//MJTextArea testarea=new MJTextArea();
}
}
public static List<String> runCMD(String aapt,String command,String apk){
InputStream is =null;
Process process=null;
List<String> slist=new ArrayList<String>();
try {
//process =Runtime.getRuntime().exec("cmd.exe /k "+dir+"&cd "+aapt+"& command");//执行doc命令
process =Runtime.getRuntime().exec(aapt+command +apk);
//后面的所有操作即是读取这个命令的输出结果
is = process.getInputStream();//获取执行CMD命令后的信息
BufferedReader reader =new BufferedReader(new InputStreamReader(is));
String line =null;
StringBuffer sb =new StringBuffer();
while((line = reader.readLine())!=null){
sb.append(line);
}
//截取package字符串
Pattern p =Pattern.compile("package: name(.*?)versionCode");
Matcher m =p.matcher(sb);
List<String> list=new ArrayList<String>();
while(m.find()){
list.add(m.group(1));
}
for (String str : list) {
System.out.println("package"+str);
slist.add(str);
} //截取acvitity字符串,以launchable-activity: name开头, label结尾 获取中间字符串内容
Pattern p1 =Pattern.compile("launchable-activity: name(.*?) label");
Matcher m1 =p1.matcher(sb);
List<String> list1=new ArrayList<String>();
while(m1.find()){
list1.add(m1.group(1));
}
for (String str1 : list1) {
System.out.println("activity"+str1);
slist.add(str1);
} } catch (IOException e) {
e.printStackTrace();
} finally{
try {
process.getOutputStream().close();
is.close();
} catch (IOException e) {
e.printStackTrace();
} } return slist;
}
public static void main(String[] args) {
/*try {
//UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); 使用windows风格
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedLookAndFeelException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} */
new YFileChooser(); }
}

2、生成jar

右键点击要导出为jar的java文件,选择export

next下一步继续

默认下一步,继续

在下面界面选择主程序入口文件,点击Browse会自动出来,只要你的java文件有main函数就行

选择好后,Finish,大功告成,我们来手工测试一下生成的jar文件是否有效,这里忽略windows下java环境变量的配置细节

3、通过jar生成exe的可执行文件

引入exe4j工具

链接:https://pan.baidu.com/s/1I1s-duF2xtDj0pm7POT6LQ
提取码:l9nr

使用步骤

a、下载安装后打开exe4j工具,是以下这个长相

b、打开第一步默认不做啥,

上面湖州只有一个License需要填一下,不然后面执行exe后会先弹出提示:

c、选择模式,jar生成Exe,正合我意,点击下一步

d、填写应用名称和存放目录即可下一步

e、这里设置有点多,但不复杂,比较清晰直观,英文也看得非常清晰

f、要选择一下执行机器位数,我的机器是64位,如果不选择生成后的Exe执行后会报错,当然32位机器就不用勾选了。点击下一步

g、本步默认,不作任何更改,直接下一步

h、选择要生成的jar文件及执行主程序

i、选择完jar点击OK,再选择main class的值,打开选择框出来会是默认就能读取到的,选中点击OK,点击"next"

j、选择执行应用程序的jre版本,设置最低和最高版本执行范围。在此范围之外,会报错(具体报什么错没试过)

k、添加执行jre的本地路径,直接点击"next"

l、后面几步默认,不作更改,直接点击"next"

m、上步点击next的时候直接进度条进行执行了,但进度太快,没截到图,直接放结果

测试OK

桌面直接执行测试

最后分享全部源码内容:

链接:https://pan.baidu.com/s/1GoyPvhmsVIBH7kTaLTqeYQ
提取码:k1da

另外推荐一个站长工具:生成ico图标的,我就是用的这个

http://www.faviconico.org/favicon

JAVA获取apk包的package和launchable-activity名称(完善成EXE版)的更多相关文章

  1. JAVA获取apk包的package和launchable-activity名称(一)

    背景: 每次要获取apk包的package和launchable-activity名称都需要运行doc命令,感觉好浪费感情,因为经常记不住常常的路径,但又不想把aapt设置为环境变量 我这个工具分几步 ...

  2. 查看apk包名package和入口activity名称的方法

    ctrl+r 打开CMD窗口 进入sdk-aapt目录 执行命令:aapt dump badging xx.apk 内容太多?不好看,没关系,全部拷出来,ctrl+f,so easy! package ...

  3. 查看Android应用包名package和入口activity名称

    使用android自动化测试工具启动应用时,需要填写被测程序的包名和启动的Activity,以下有两种查看应用包名package和入口activity名称的方法: 方法一:使用aapt    //aa ...

  4. Android开发之查看应用包名package和入口activity名称的方法

    使用android自动化测试工具monkeyrunner启动应用时,需要填写被测程序的包名和启动的Activity,以下有两种查看应用包名package和入口activity名称的方法: 方法一:使用 ...

  5. Android获取APK包名的几种方法

    Android获取APK包名的几种方法:1.adb shell pm list package -f | findstr 关键字 #只能获取到包名,主Activity名无法获取到 2.使用aapt-- ...

  6. Java 获取APK安装程序的包名

     Java 获取APK安装程序的包名核心的两个类:  ResPackage ApkDecoder  package com.temobi.util; import java.io.File; impo ...

  7. Appium自动化测试3之获取apk包名和launcherActivity后续

    接着“Appium自动化测试3之获取apk包名和launcherActivity”章节介绍 测试脚本 1.测试脚本如下: # -*- coding:utf-8 -*- import os, time, ...

  8. 获取软件的apk包名、查看手机设备名称等

    获取软件的apk包名 1.下载aapt,这里使用的是SDK自带的aapt,找到SDK路径下面的aapt.exe,本机路径:E:\downloads\android-sdk_r23.0.2-window ...

  9. Android自动化学习笔记:获取APK包名的几种方法

    ---------------------------------------------------------------------------------------------------- ...

随机推荐

  1. AC自动机算法小结

    AC自动机,可惜不能自动AC 转载:飘过的小牛 OIer55242 简介 Aho-Corasick automation 该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一.一个常见的例子就 ...

  2. BZOJ4738 : 汽水

    二分答案$mid$,若存在一条路径满足$|ave-k|<mid$,则答案至多为$mid-1$. 若$ave\leq k$,则$\sum(w-k)\leq 0$,且$\sum(k-w-mid)&l ...

  3. linux查看服务安装目录

    linux查看服务安装目录server dir 假如我们想查看 Redis 的安装目录 如果用命令 which redis 或者 whereis redis 都找不到安装目录, 可使用以下办法: ps ...

  4. svn提交后 添加注释

    svn 提交后添加注释 第一步: 第二步: 第三步:提交就可以了. 注意:如果svn服务器管理员没有激活pre-revprop-change这个hook,会出现 需要让svn服务器管理员没有激活pre ...

  5. day6常用模块,数据库操作

    一.循环调用函数    map() 二.列表推导式和生成器 三.filter过滤器 四.os模块 五.datetime模块 六.random模块 七.写日志,导入nnlog模块 八,发邮件 九,操作数 ...

  6. 在 fragment 里面调用 findViewById

    public class CompanyListFragment  extends Fragment { private Activity activity;   private ListView c ...

  7. JS的document.anchors函数使用示例

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. 2018年东北农业大学春季校赛 E-wyh的阶乘(求n!的0的个数)

    链接:https://www.nowcoder.com/acm/contest/93/E来源:牛客网 题目描述 这个问题很简单,就是问你n的阶乘末尾有几个0? 输入描述: 输入第一行一个整数T(1&l ...

  9. 【springboot】【redis】springboot结合redis,操作List集合实现时间轴功能

    springboot结合redis,操作List集合实现时间轴功能

  10. 解析 ViewTreeObserver 源码(下)

    继上篇内容,本文介绍 ViewTreeObserver 的使用,以及体会其所涉及的观察者模式,期间会附带回顾一些基础知识.最后,我们简单聊一下 Android 的消息传递,附高清示意图,轻松捋清整个传 ...