1. 程式人生 > >JAVA獲取apk包的package和launchable-activity名稱(完善成EXE版)

JAVA獲取apk包的package和launchable-activity名稱(完善成EXE版)

出來混遲早是要還的。

在這一篇中https://www.cnblogs.com/sincoolvip/p/5882817.html,只是簡單講了一下獲取apk包的package和launchable-activity名稱,可以說是個非常不成熟的雞肋的東西了。當時花的時間也不多,而且當時雄心壯志的還列了幾步計劃。

現在看一看,真是要恥笑自己,拖了這麼久,今天終於補上,由於本人程式設計能力非常有限,無數資料都是網上搜搜搜,下來拼拼拼,按需改改改才實現的。在過程中一邊熟悉掌握知識點,一邊實現個體需求,其實是比較難的,要靜下心來做事,

說實話做個東西會幫我一天節省網購至少200元的消費。

程式我優化了,目地是實現開啟exe介面可以選擇apk包和aapt執行目錄,然後輸出相關資訊,最終的效果:

這個分幾步來列吧。

1、java程式碼實現

這裡我直接帖程式碼吧,細節不說了。整個拿下去就可以用的,有點長啊,那是因為我只會1個java生成jar.囧~~

  1 package p20181214;
  2 import java.io.*;
  3 import java.util.ArrayList;
  4 import java.util.List;
  5 import java.util.regex.Matcher;
  6 import java.util.regex.Pattern;
  7 import java.awt.*;
  8 import javax.swing.*;
9 10 import java.awt.event.*; 11 public class YFileChooser implements ActionListener{ 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=new JTextField(); 19 JTextField text2=new JTextField(); 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);//添加布局1 69 // 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<String> 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 List<String> runCMD(String aapt,String command,String apk){ 122 InputStream is =null; 123 Process process=null; 124 List<String> slist=new ArrayList<String>(); 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(new InputStreamReader(is)); 131 String line =null; 132 StringBuffer sb =new StringBuffer(); 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<String> list=new ArrayList<String>(); 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<String> list1=new ArrayList<String>(); 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 return slist; 173 } 174 public static void main(String[] args) { 175 new YFileChooser(); 176 177 } 178 }

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