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

出來混早晚是要還的。html

在這一篇中http://www.javashuo.com/article/p-susgjasg-cy.html,只是簡單講了一下獲取apk包的package和launchable-activity名稱,能夠說是個很是不成熟的雞肋的東西了。當時花的時間也很少,並且當時雄心壯志的還列了幾步計劃。java

如今看一看,真是要恥笑本身,拖了這麼久,今天終於補上,因爲本人編程能力很是有限,無數資料都是網上搜搜搜,下來拼拼拼,按需改改改才實現的。在過程當中一邊熟悉掌握知識點,一邊實現個體需求,實際上是比較難的,要靜下心來作事,編程

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

程序我優化了,目地是實現打開exe界面能夠選擇apk包和aapt執行目錄,而後輸出相關信息,最終的效果:app

第二版:函數

改版後效果,使結果能夠複製工具

 

這個分幾步來列吧。

一、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 }

第二版代碼

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();
       
    }
}

 

二、生成jar

右鍵點擊要導出爲jar的java文件,選擇export

next下一步繼續

默認下一步,繼續

 

在下面界面選擇主程序入口文件,點擊Browse會自動出來,只要你的java文件有main函數就行

選擇好後,Finish,大功告成,咱們來手工測試一下生成的jar文件是否有效,這裏忽略windows下java環境變量的配置細節

三、經過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

相關文章
相關標籤/搜索