java获取apk启动activity_JAVA获取apk包的package和launchable-activity名称(完善成EXE版)

出来混迟早是要还的。

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

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

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

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

81cd4df0685a79f9600646e1a5ff00ca.png

这个分几步来列吧。

1、java代码实现

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

1 packagep20181214;2 import java.io.*;3 importjava.util.ArrayList;4 importjava.util.List;5 importjava.util.regex.Matcher;6 importjava.util.regex.Pattern;7 import java.awt.*;8 import javax.swing.*;9

10 import java.awt.event.*;11 public class YFileChooser implementsActionListener{12 JFrame frame=new JFrame("文件选择器实例");13 JTabbedPane tabPane=new JTabbedPane();//选项卡布局

14 Container con=new Container();//布局1

15 Container con1=new Container();//布局2

16 JLabel label1=new JLabel("选择aapt目录");17 JLabel label2=new JLabel("选择apk文件");18 JTextField text1=newJTextField();19 JTextField text2=newJTextField();20 JButton button1=new JButton("...");21 JButton button2=new JButton("...");22 JButton button3=new JButton("...");23 //放结果

24 JLabel aapt=new JLabel("....");25 JLabel apk=new JLabel("...");26 JLabel page=new JLabel("...");27 JLabel activity=new JLabel("...");28 JFileChooser jfc=new JFileChooser();//文件选择器

29 YFileChooser(){30 jfc.setCurrentDirectory(new File("d:\\"));//文件选择器的初始目录定为d盘31 //下面两行是取得屏幕的高度和宽度

32 double lx=Toolkit.getDefaultToolkit().getScreenSize().getWidth();33 double ly=Toolkit.getDefaultToolkit().getScreenSize().getHeight();34 frame.setLocation(new Point((int)(lx/2)-150,(int)(ly/2)-150));//设定窗口出现位置

35 frame.setSize(500,300);//设定窗口大小

36 frame.setVisible(true);37 frame.setContentPane(tabPane);//设置布局38 //下面设定标签等的出现位置和高宽

39 label1.setBounds(10,10,150,20);40 text1.setBounds(100,10,300,20);41 button1.setBounds(410,10,60,20);//400=上一条100+300

42 button1.setText("选择");43 label2.setBounds(10,30,150,20);44 text2.setBounds(100,30,300,20);45 button2.setBounds(410,30,60,20);46 button2.setText("选择");47 button3.setBounds(204,70,60,30);48 button3.setText("获取");49 aapt.setBounds(30, 126,300 , 20);50 apk.setBounds(30, 144,300 , 20);51 page.setBounds(7, 180,500 , 20);52 activity.setBounds(7, 200,500 , 20);53 button1.addActionListener(this);//添加事件处理

54 button2.addActionListener(this);//添加事件处理

55 button3.addActionListener(this);//添加事件处理

56 con.add(label1);57 con.add(label2);58 con.add(text1);59 con.add(text2);60 con.add(button1);61 con.add(button2);62 con.add(button3);63 con.add(jfc);64 con.add(aapt);65 con.add(apk);66 con.add(page);67 con.add(activity);68 tabPane.add("目录/文件选择",con);//添加布局169 //tabPane.add("暂无内容",con1);//添加布局2

70 frame.setVisible(true);//窗口可见

71 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//使能关闭窗口,结束程序

72 }73 public void actionPerformed(ActionEvent e){

//事件处理

74 /*if(e.getSource().equals(button1)){//判断触发方法的按钮是哪个75 jfc.setFileSelectionMode(1);//设定只能选择到文件夹76 int state=jfc.showOpenDialog(null);//此句是打开文件选择器界面的触发语句77 if(state==1){78 return;//撤销则返回79 }80 else{81 File f=jfc.getSelectedFile();//f为选择到的目录82 text1.setText(f.getAbsolutePath());83 }84 }*/

85 if(e.getSource().equals(button1)){

//判断触发方法的按钮是哪个

86 jfc.setFileSelectionMode(0);//设定只能选择到文件夹

87 int state=jfc.showOpenDialog(null);//此句是打开文件选择器界面的触发语句

88 if(state==1){89 return;//撤销则返回

90 }91 else{92 File f=jfc.getSelectedFile();//f为选择到的目录

93 text1.setText(f.getAbsolutePath());94 }95 }96 if(e.getSource().equals(button2)){97 jfc.setFileSelectionMode(0);//设定只能选择到文件

98 int state=jfc.showOpenDialog(null);//此句是打开文件选择器界面的触发语句

99 if(state==1){100 return;//撤销则返回

101 }102 else{103 File f=jfc.getSelectedFile();//f为选择到的文件

104 text2.setText(f.getAbsolutePath());105 }106 }107 if(e.getSource().equals(button3)) {108 String aapt1=text1.getText();109 String apk1=text2.getText();110 System.out.println("aapt="+text1+";apk=="+apk1);111 //调获取方法112 //Base base=new Base();

113 java.util.List list= runCMD(aapt1, " dump badging ", apk1);114 page.setText("package:"+list.get(0));115 activity.setText("activity"+list.get(1));116 aapt.setText("aapt.exe目录为:"+aapt1);117 apk.setText("apk目录为:"+apk1);118

119 }120 }121 public static ListrunCMD(String aapt,String command,String apk){122 InputStream is =null;123 Process process=null;124 List slist=new ArrayList();125 try{126 //process =Runtime.getRuntime().exec("cmd.exe /k "+dir+"&cd "+aapt+"& command");//执行doc命令

127 process =Runtime.getRuntime().exec(aapt+command +apk);128 //后面的所有操作即是读取这个命令的输出结果

129 is = process.getInputStream();//获取执行CMD命令后的信息

130 BufferedReader reader =new BufferedReader(newInputStreamReader(is));131 String line =null;132 StringBuffer sb =newStringBuffer();133 while((line = reader.readLine())!=null){134 sb.append(line);135 }136 //截取package字符串

137 Pattern p =Pattern.compile("package: name(.*?)versionCode");138 Matcher m =p.matcher(sb);139 List list=new ArrayList();140 while(m.find()){141 list.add(m.group(1));142 }143 for(String str : list) {144 System.out.println("package"+str);145 slist.add(str);146 }147

148 //截取acvitity字符串,以launchable-activity: name开头, label结尾 获取中间字符串内容

149 Pattern p1 =Pattern.compile("launchable-activity: name(.*?) label");150 Matcher m1 =p1.matcher(sb);151 List list1=new ArrayList();152 while(m1.find()){153 list1.add(m1.group(1));154 }155 for(String str1 : list1) {156 System.out.println("activity"+str1);157 slist.add(str1);158 }159

160 } catch(IOException e) {161 e.printStackTrace();162 } finally{163 try{164 process.getOutputStream().close();165 is.close();166 } catch(IOException e) {167 e.printStackTrace();168 }169

170 }171

172 returnslist;173 }174 public static voidmain(String[] args) {175 newYFileChooser();176

177 }178 }

2、生成jar

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

26eeec466e9f2e0ddaade692b78e81c4.png

next下一步继续

9828d0b822f87e4cefd8a33cff3c6a47.png

默认下一步,继续

e661d4bc1e04ba4901ecd4c9495f156a.png

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

80245ad9ab6e8a25cb1e3cbb0ec8fd61.png

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

8566d8246181431fe44e02a77a7c7d7f.png

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

引入exe4j工具

链接:https://pan.baidu.com/s/1I1s-duF2xtDj0pm7POT6LQ

提取码:l9nr

使用步骤

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

63ed87989a542b55c1c06fc9b9f7d245.png

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

58898085fb487c3d67c6362261f52d79.png

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

bb8533bd93749e271130f1a582a3036d.png

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

bae2321c480828d89265c71235911d9c.png

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

4319d279da0e5f13eee5b5f1e58a22b9.png

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

67fbac90c7ee5303e524735eb510deba.png

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

c6cf1d97e1c3245525367e0b06c41fb6.png

4a3c2a40ceceff83748d7286d0619e00.png

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

f2aed5849d8e2234e17754f5cd6d99f9.png

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

3211a86b15766c16ceaf9fd75ee31697.png

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

9ea774a45eb2fd46e16ee252f5bf339d.png

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

224b12077ee204bdb76c5295bacb7f32.png

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

2d42837b15747398a25f79fbb763985f.png

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

c78caddf4d57edb4bf6d0c76440b41e3.png

572603e81b431776f7ac3a32e6d0a3ff.png

d8150c6128ab420c43e757b355c46145.png

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

c12d9c699ce8d8ec27613d13ed1c7ad3.png

测试OK

1e2c38dcd29c03abc663bed9347633e4.png

桌面直接执行测试

ce70bc5a986804dfbe1efd3d01784960.png

最后分享全部源码内容:

链接:https://pan.baidu.com/s/1GoyPvhmsVIBH7kTaLTqeYQ

提取码:k1da

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值