精华内容
下载资源
问答
  • Android查看包名和获取包名

    万次阅读 2018-11-30 17:22:06
    查看包名,打开 app 的 gradle 便可以看到了;如下图: 获取包名,版本信息及VersionName名称: try { //包名 String pkName = this.getPackageName(); //versionName String versionNa...

    查看包名,打开 app 的 gradle 便可以看到了;如下图:

    获取包名,版本信息及VersionName名称:

            try {
                //包名
                String pkName = this.getPackageName();
                //versionName 
                String versionName = this.getPackageManager().getPackageInfo(
                        pkName, 0).versionName;
                //versionCode 
                int versionCode = this.getPackageManager()
                        .getPackageInfo(pkName, 0).versionCode;
                return pkName + "   " + versionName + "  " + versionCode;
            } catch (Exception e) {
            }

    OK了~~~~~~~

    展开全文
  • idea 更改包名操作

    万次阅读 2019-08-16 16:14:13
    idea 更改包名操作更改前先更新项目更改包名更改包名之后右键由于更改包名引起的其他文件改动在Local Changes中提交即可 更改前先更新项目 更改包名 选中需要更改的目录右键鼠标选择 更改包名之后右键 更新完...

    更改前先更新项目

    更改包名

    选中需要更改的目录右键鼠标选择

    更改包名之后右键


    更新完目录后提交目录到svn

    由于更改包名引起的其他文件改动在Local Changes中提交即可



    **注:**提交完成之后如需更改其他模块包名需再次更新整体项目并重复以上步骤

    展开全文
  • Android Studio:多包名打包

    千次阅读 2017-06-14 19:08:55
    简单的说就是挂羊头卖狗肉,名字不同但是功能相同,大家都知道应用市场时根据包名来区别是否是同一app的,这个时候就必须要改包名了,于是蛋疼之旅开始了。正文这种东西网上有很多的资料,整体的流程是这样:首先,...

    前言

    最近有点小忙,博客都落下了,今天赶紧写点东西补上。

    前几天商务找我,想要一个马甲包,什么是马甲包?简单的说就是挂羊头卖狗肉,名字不同但是功能相同,大家都知道应用市场时根据包名来区别是否是同一app的,这个时候就必须要改包名了,于是蛋疼之旅开始了。

    正文

    这种东西网上有很多的资料,整体的流程是这样:

    首先,配置我们的gradle文件:

    // 此处设置不同包名的apk信息
        productFlavors {
            // app生产环境配置
            app {
                applicationId 'com.lzp.multipackagedemo'
                manifestPlaceholders = [app_name: "app", app_icon: "@mipmap/ic_launcher"]
            }
    
            // 马甲包的配置信息
            app1 {
                applicationId 'com.lzp.multipackagedemo1'
                manifestPlaceholders = [app_name: "app1", app_icon: "@mipmap/ic_launcher"]
            }
        }
    
        // lint检查,防止打包因为一些警告而停止
        lintOptions {
            checkReleaseBuilds false
            abortOnError false
        }

    简单说明一下:

    applicationId 即可认为是我们的包名
    manifestPlaceholders 中定义了两个变量,app_name和app_icon,是为了设置不同的图标和app的名称。因为我偷懒了,图标和名称是否会发生变化,大家就自己去亲自实验一下吧。

    设置完了之后,我们就要用到上面的信息,打开AndroidManifest.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.lzp.multipackagedemo">
    
        <application
            android:allowBackup="true"
            android:icon="${app_icon}"
            android:label="${app_name}"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>

    我们在application中设置了icon和lable信息,引用刚才在gradle中定义的变量,有些人会问,用同样的方法修改packageName不行吗?这个真的不行,修改了之后,系统会提示你,无法使用你定义的变量,希望你通过设置applicationId来设置包名,而且你配置的Activity,Service等信息,都无法找到对象的类,这就是gradle中applicationId的作用。

    ok,如果设置成功,在gradle窗口会出现你的不同包名的命令:

    这里写图片描述

    为了方便,我修改了MainActivity中的代码,直接显示当前的包名:

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            TextView textView = (TextView) findViewById(R.id.textView);
            textView.setText(getPackageName());
        }
    }

    打包安装!!!

    这里写图片描述

    app已经安装成功了,并且名字也跟我们设置的一样,看一样里面的内容:

    这里写图片描述
    这里写图片描述

    包名也的确不同。

    扩展

    你以为这样就结束了???不可能,到底包名是不是改变了,我亲眼看看怎么行,打开反编译工具(大家自己去下载吧,遍地都是),看我的截图:

    这里写图片描述

    哎呀我擦,包名实际上并没有发生变化,所以我们可以推测,applicationId实际上是修改了class文件中的包名,所以我们getPackageName()就发生了变化,系统也是通过getPackcgeName()来获取包名的,这样达到了区别app的目的,不得不说,这种方法确实太鸡贼了,但是我喜欢。

    顺便提一嘴,只能release版本才能区别安装,我就栽在了这个上面。

    总结

    ok,今天就这样简单,之后再准备一些长点的内容,继续努力!

    补充:使用了第三方库的朋友请注意,因为修改了包名,你的所有第三方(登录,分享,支付等等)都没法办法正常使用,记得重新申请。

    展开全文
  • 完整版java读取apk、ipa包名、版本名、版本号等信息

    万次阅读 热门讨论 2016-05-06 11:14:28
    有时候,我们上传apk或者是ipa文件的时候,是需要读取到里面的一些信息的,比如软件的包名,以及其版本信息等。在网上搜索了一下资料 , 找了很多版本,对于apk文件的版本号,一直读取不到,在这里,笔者自己总结了...

    有时候,我们上传apk或者是ipa文件的时候,是需要读取到里面的一些信息的,比如软件的包名,以及其版本信息等。在网上搜索了一下资料 , 找了很多版本,对于apk文件的版本号,一直读取不到,在这里,笔者自己总结了,读取apk、ipa文件的一些代码,大家可以参考下,去其糟粕,取其精华。以便适用于自己的需求。

    如果大家希望解析到图标的话,可以看我后面写的博文
    博文地址请戳 :

    Java解析apk、ipa图标,包名,应用名称,版本号

    下面会提供源码给大家,我用的开发工具是eclipse,直接导入就可以,jar包也是我已经下载好的,大家可以免积分拿去。本来里面是有2个apk、2个ipa文件提供测试的,但是由于文件太大,上传不了源码,所以就删除了一个最大的ipa包

    apk jar包地址:java解析apk所需jar包下载
    ipa jar包地址:java解析ipa所需jar包下载

    首先看一下我的项目目录
    这里写图片描述

    下面请看代码

    package com.zsl.cn;
    
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.InputStream;
    import java.util.Enumeration;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipFile;
    import java.util.zip.ZipInputStream;
    
    import org.apkinfo.api.util.AXmlResourceParser;
    import org.apkinfo.api.util.TypedValue;
    import org.apkinfo.api.util.XmlPullParser;
    
    import com.dd.plist.NSDictionary;
    import com.dd.plist.NSString;
    import com.dd.plist.PropertyListParser;
    /**
     * 
     * @author ZSL
     *
     */
    public final class ReadUtil {
    	/**
    	 * 读取apk
    	 * @param apkUrl
    	 * @return
    	 */
    	public static Map<String,Object> readAPK(String apkUrl){
    		ZipFile zipFile;
    		Map<String,Object> map = new HashMap<String, Object>();
    		try {
    			zipFile = new ZipFile(apkUrl);
    			Enumeration<?> enumeration = zipFile.entries();
    			ZipEntry zipEntry = null;
    			while (enumeration.hasMoreElements()) {
    				zipEntry = (ZipEntry) enumeration.nextElement();
    				if (zipEntry.isDirectory()) {
    
    				} else {
    					if ("androidmanifest.xml".equals(zipEntry.getName().toLowerCase())) {
    						AXmlResourceParser parser = new AXmlResourceParser();
    						parser.open(zipFile.getInputStream(zipEntry));
    						while (true) {
    							int type = parser.next();
    							if (type == XmlPullParser.END_DOCUMENT) {
    								break;
    							}
    							String name = parser.getName();
    							if(null != name && name.toLowerCase().equals("manifest")){
    								for (int i = 0; i != parser.getAttributeCount(); i++) {
    									if ("versionName".equals(parser.getAttributeName(i))) {
    										String versionName = getAttributeValue(parser, i);
    										if(null == versionName){
    											versionName = "";
    										}
    										map.put("versionName", versionName);
    									} else if ("package".equals(parser.getAttributeName(i))) {
    										String packageName = getAttributeValue(parser, i);
    										if(null == packageName){
    											packageName = "";
    										}
    										map.put("package", packageName);
    									} else if("versionCode".equals(parser.getAttributeName(i))){
    										String versionCode = getAttributeValue(parser, i);
    										if(null == versionCode){
    											versionCode = "";
    										}
    										map.put("versionCode", versionCode);
    									}
    								}
    								break;
    							}
    						}
    					}
    					
    				}
    			}
    			zipFile.close();
    		} catch (Exception e) {
    			map.put("code", "fail");
    			map.put("error","读取apk失败");
    		}
    		return map;
    	}
    	
    	private static String getAttributeValue(AXmlResourceParser parser, int index) {
    		int type = parser.getAttributeValueType(index);
    		int data = parser.getAttributeValueData(index);
    		if (type == TypedValue.TYPE_STRING) {
    			return parser.getAttributeValue(index);
    		}
    		if (type == TypedValue.TYPE_ATTRIBUTE) {
    			return String.format("?%s%08X", getPackage(data), data);
    		}
    		if (type == TypedValue.TYPE_REFERENCE) {
    			return String.format("@%s%08X", getPackage(data), data);
    		}
    		if (type == TypedValue.TYPE_FLOAT) {
    			return String.valueOf(Float.intBitsToFloat(data));
    		}
    		if (type == TypedValue.TYPE_INT_HEX) {
    			return String.format("0x%08X", data);
    		}
    		if (type == TypedValue.TYPE_INT_BOOLEAN) {
    			return data != 0 ? "true" : "false";
    		}
    		if (type == TypedValue.TYPE_DIMENSION) {
    			return Float.toString(complexToFloat(data)) + DIMENSION_UNITS[data & TypedValue.COMPLEX_UNIT_MASK];
    		}
    		if (type == TypedValue.TYPE_FRACTION) {
    			return Float.toString(complexToFloat(data)) + FRACTION_UNITS[data & TypedValue.COMPLEX_UNIT_MASK];
    		}
    		if (type >= TypedValue.TYPE_FIRST_COLOR_INT && type <= TypedValue.TYPE_LAST_COLOR_INT) {
    			return String.format("#%08X", data);
    		}
    		if (type >= TypedValue.TYPE_FIRST_INT && type <= TypedValue.TYPE_LAST_INT) {
    			return String.valueOf(data);
    		}
    		return String.format("<0x%X, type 0x%02X>", data, type);
    	}
    
    	private static String getPackage(int id) {
    		if (id >>> 24 == 1) {
    			return "android:";
    		}
    		return "";
    	}
    
    	// / ILLEGAL STUFF, DONT LOOK :)
    	public static float complexToFloat(int complex) {
    		return (float) (complex & 0xFFFFFF00) * RADIX_MULTS[(complex >> 4) & 3];
    	}
    
    	private static final float RADIX_MULTS[] = 
    	{
    		 0.00390625F, 3.051758E-005F, 
    		 1.192093E-007F, 4.656613E-010F 
    	 };
    	private static final String DIMENSION_UNITS[] = { "px", "dip", "sp", "pt", "in", "mm", "", "" };
    	private static final String FRACTION_UNITS[] = { "%", "%p", "", "", "", "", "", "" };
    	
    	/**
    	 * 读取ipa
    	 */
    	public static Map<String,Object> readIPA(String ipaURL){
    		Map<String,Object> map = new HashMap<String,Object>();
    		try {
    			File file = new File(ipaURL);
                InputStream is = new FileInputStream(file);
                InputStream is2 = new FileInputStream(file);
                ZipInputStream zipIns = new ZipInputStream(is);
                ZipInputStream zipIns2 = new ZipInputStream(is2);
                ZipEntry ze;
                ZipEntry ze2;
                InputStream infoIs = null;
                NSDictionary rootDict = null;
                String icon = null;
                while ((ze = zipIns.getNextEntry()) != null) {
                    if (!ze.isDirectory()) {
                        String name = ze.getName();
                        if (null != name &&
                         name.toLowerCase().contains(".app/info.plist")) {
                            ByteArrayOutputStream _copy = new 
    			                        ByteArrayOutputStream();
                            int chunk = 0;
                            byte[] data = new byte[1024];
                            while(-1!=(chunk=zipIns.read(data))){
                                _copy.write(data, 0, chunk);
                            }
                            infoIs = new ByteArrayInputStream(_copy.toByteArray());
                            rootDict = (NSDictionary) PropertyListParser.parse(infoIs);
                            
                            //我们可以根据info.plist结构获取任意我们需要的东西
                            //比如下面我获取图标名称,图标的目录结构请下面图片
                            //获取图标名称
                            NSDictionary iconDict = (NSDictionary) rootDict.get("CFBundleIcons");
                             
                            while (null != iconDict) {
                				if(iconDict.containsKey("CFBundlePrimaryIcon")){
    			            	NSDictionary CFBundlePrimaryIcon = (NSDictionary)iconDict.get("CFBundlePrimaryIcon"); 
                					if(CFBundlePrimaryIcon.containsKey("CFBundleIconFiles")){
    	            				NSArray CFBundleIconFiles =(NSArray)CFBundlePrimaryIcon.get("CFBundleIconFiles"); 
                					icon = CFBundleIconFiles.getArray()[0].toString();
                						if(icon.contains(".png")){
                							icon = icon.replace(".png", "");
                						}
                						System.out.println("获取icon名称:" + icon);
                						break;
                					}
                				}
                			}
                            break;
                        }
                    }
                }
               
               //根据图标名称下载图标文件到指定位置
                while ((ze2 = zipIns2.getNextEntry()) != null) {
                    if (!ze2.isDirectory()) {
                        String name = ze2.getName();
                        System.out.println(name);
                        if(name.contains(icon.trim())){
                        	System.out.println(11111);
                        	FileOutputStream fos = new FileOutputStream(new File("E:\\python\\img\\icon.png"));
    	                       int chunk = 0;
    	                       byte[] data = new byte[1024];
    	                       while(-1!=(chunk=zipIns2.read(data))){
    	                    	   fos.write(data, 0, chunk);
    	                       }
    	                       fos.close();
                        	break;
                        }
                    }
                }
    	         
                
                //如果想要查看有哪些key ,可以把下面注释放开
    //            for (String keyName : rootDict.allKeys()) {
    //				System.out.println(keyName + ":" + rootDict.get(keyName).toString());
    //			  }
               
               
                // 应用包名
        		NSString parameters = (NSString) rootDict.get("CFBundleIdentifier");
        		map.put("package", parameters.toString());
        		// 应用版本名
        		parameters = (NSString) rootDict.objectForKey("CFBundleShortVersionString");
        		map.put("versionName", parameters.toString());
        		//应用版本号
        		parameters = (NSString) rootDict.get("CFBundleVersion");
        		map.put("versionCode", parameters.toString());
        		
                /
    			infoIs.close();
    	        is.close();
                zipIns.close();
                
            } catch (Exception e) {
            	map.put("code", "fail");
                map.put("error","读取ipa文件失败");
            }
            return map;
    	}
    	
    	
    	public static void main(String[] args) {
    		System.out.println("======apk=========");
    		String apkUrl = "src/shenmiaotaowang_966.apk";
    		Map<String,Object> mapApk = ReadUtil.readAPK(apkUrl);
    		for (String key : mapApk.keySet()) {
    			System.out.println(key + ":" + mapApk.get(key));
    		}
    		System.out.println("======ipa==========");
    		String ipaUrl = "src/IM.ipa";
    		Map<String,Object> mapIpa = ReadUtil.readIPA(ipaUrl);
    		for (String key : mapIpa.keySet()) {
    			System.out.println(key + ":" + mapIpa.get(key));
    		}
    	}
    }
    
    

    这里写图片描述

    下面附上源码一份:java读取apk、ipa源码完整版

    总结:对于ipa文件的解析,我们可以根据info.plist文件结构进行解析,获取我们需要的值,如果我们key对应的是dict ,那么我们就用NSDictionary来获取,如果是key下面是array,那么我们就用NSArray来获取,这时获取到的是一个数组。
    这里写图片描述
    这里写图片描述
    这里写图片描述




    我们可以看到上面解析到的图片是黑色的,这个确实是这样子的,在window或者linux下都是黑色的,只有在mac下才是正常的,应该是ios开发者压缩的结果。不过不要担心,可以看后面的文章,怎么把图片反编译成正常图片。




    补充:

    1. 2016-9-14补充获取ipa图标,并下载到指定位置

    如果大家希望解析到图标的话,可以看我后面写的博文
    博文地址请戳 :

    Java解析apk、ipa图标,包名,应用名称,版本号







    展开全文
  • Java包名的命名规则

    万次阅读 多人点赞 2019-04-21 22:54:12
    包名为indi.发起者名.项目名.模块名*.*.\* pers :独自完成,公开,版权主要属于个人。 包名为pers.个人名.项目名.模块名*.*.* priv : 独自完成,非公开,版权属于个人。 包名为priv.个人名.项目名.模...
  • Maven - 指定打包时的包名

    万次阅读 2018-07-02 16:59:01
    Maven - 指定打包时的包名 &lt;build&gt; &lt;finalName&gt;包名&lt;/finalName&gt; &lt;/build&gt;
  • 如何更改打包的war包名

    千次阅读 2018-07-28 15:22:17
     有时我们会要求有固定的war包名,war包部署在服务器上需要包名来进行url访问,有的公司需要有意义的包名(url),下面我们就来说说如何改包名 1 在pom.xml里修改package,如下图  只修改这个还不可以 2 在...
  • Android 多包名打包应用

    千次阅读 2016-10-20 18:28:46
    Android 多包名打包应用 简介: 公司的新需求:同一份代码打出另一个包名的apk,即包名不同、名称不同的两个apk。 我经过多方渠道发现大致有一下三种方法: 通过ant打多包名应用 建立多个与“main”同级的...
  • Maven自定义打包的包名

    千次阅读 2019-05-26 18:31:42
    默认Maven的包名为: <build> <finalName>${project.artifactId}-${project.version}</finalName> </build> 自定义包名如: <build> <finalName>${project.artifactI...
  • 1.导出项目 AS -> File ->Export to Zip File 2.Android Studio 打开项目,修改包名 ...3.修改全部包名相关,替换成新包名 4.创建新的打包key : new.jks 5.检查 引入的第三方SDK,到...
  • maven打包自定义包名

    万次阅读 2016-05-23 13:26:12
    在pom中添加finalname ROOT 包名为ROOT 则访问不需要contextpath
  • 查看安卓app包名的5种方法

    万次阅读 多人点赞 2019-09-02 14:07:03
    启动需要获取包名的应用 方法二: adb shell pm list packages -3 查看所有包名 方法三: 安卓系统中:设置——应用——正在运行 查看 方法四: 安卓系统中:文件管理器访问目录/data/data下,文件夹即...
  • 包名不对,请检查包名是否与开放平台填写一致”,接下来就用两个实验来验证,并找到相关的解决办法。 实验 实验一 步骤 微信正常分享原始签名的应用(使微信缓存一些数据) 使用更换签名的app进行分享,查看...
  • Android Studio修改包名和路径rename package,rename directory
  • Java 有包名的类调用没有包名的类

    千次阅读 2015-05-22 17:58:41
    在java中怎样在有名包中引用无名包中的类除非都是没有包名而且在同一个文件夹下的类才能互相引用 不符合这个条件的必须有包名才能被引用
  • Android重命名包名

    千次阅读 2016-08-18 14:07:42
    工程写的差不多了才发现原来用的包名还是自己尝试性的进行写代码的时候用到的。但apk的发布,google map api的申请等等方面都需要用到一个比较规范的包名。这就涉及到修改包名的问题。 包名一开始是这样的 ...
  • Java文件夹作为了一级的包名导致所有类的包名报错。 解决方法: 这是因为idea目录结构混乱导致的,这里把src文件夹作为了资源根目录,真正的资源根目录应该是java文件夹。 点击file, ...
  • as修改包名

    千次阅读 2017-11-13 17:19:20
    之前修改包名的时候,顺序总是不对,修改包名之后,各个类中引用地址都需要改变,很麻烦。特意拿出一些时间,整理一下这边,记录一下。  1.首先 ,修改包名 ,可以先根据自己的需要更改包名的层级排序,再修改包名...
  • 常用应用市场包名:com.tencent.android.qqdownloader 腾讯应用宝com.dragon.android.pandaspace 91手机助手com.hiapk.marketpho 安智应用商店com.yingyonghui.market 应用汇com.tencent.qqpimsecure QQ手机管家...
  • 多渠道打包,生成不同包名的包

    万次阅读 2016-04-21 22:57:19
    来对多渠道打包,并生成不同的包名的知识点做个总结。需要生成不同包名的原因是为了运营的ASO。 方法: 1.直接建立渠道的文件夹,修改Manifest里面的包名 2.利用占位符 当然上面两种方法各有优劣,最后说一下他们的...
  • 分享一下在集成友盟分享时一个坑(RN) 关于集成友盟分享的方法我就不多说,跟着文档solo完全ok ... 一如既往的loading(友盟...在我确认微信平台上设置的包名和项目包名一样的情况下,我懵逼了,网上各种找,什么a...
  • java有包名的类访问没有包名的类

    千次阅读 2018-07-05 18:05:30
    今天遇见一个很有意思的问题,java中有包名的类如何访问没有包名的类(默认包),使用import等方法都不可以,后来查阅得知在java 1.4版本之后就不再支持导入默认包中的类和接口。但是在默认包中又能创建类,主要是...
  • Golang的包名

    千次阅读 2018-06-25 16:49:10
    Golang的包名 (金庆的专栏 2018.6) 摘自: https://talks.golang.org/2014/organizeio.slide#1 The name of a package Keep package names short and meaningful. Don’t use underscores, they make package ...
  • 我们外星人源码网 正式推出了app版本,我们的app是使用flutter开发的今天就分享一下我们遇到的问题:一直提示 包名不对,请检查包名是否与开放平台填写一致 修改过包名和签名后,还是一直这个提示, 最后发现 微信 会...
  • 应用的包名

    千次阅读 2016-12-20 17:50:20
    包名(Package name)是应用的唯一标识,即:包名必须唯一,一个包名代表一个应用,不允许两个应用使用同样的包名包名主要用于系统识别应用,几乎不会被用户看到。 二、包名的规则可以包含大写字母、小写字母、...
  • idea 修改包名

    千次阅读 2018-12-16 12:09:37
    老大让我们在网上找源码,修改,在修改代码包名后,运行报错。原来以为idea会自动把包名变更,其实不然,idea修改只修改上面package部分,下面的import部分不会跟着改变,需要删除后重新导入,我们就一个个的删,...
  • 利用Gradle实现多包名打包

    千次阅读 2016-02-05 00:30:56
    利用Gradle实现多包名打包
  • 由于导入项目的文件很多,但是又不想挨个修改包名,这里我想到了一个方法虽然也不是相当的方便,但如果文件很多还是值得一试:如果你想修改demo包下所有文件的包名,可以在demo包外创建一个java文件,然后进入java...
  • Android 查看app包名

    万次阅读 2019-05-31 13:01:03
    1.1,使用aapt的dump badging命令查看app包名 a,使用cmd命令行中cd切换到aapt所在的目录,如果已经为aapt配置了环境变量,可以跳过! b,输入aapt dump badging C:\Users\Administrator\Desktop\adbc.apk...
  • Gradle分渠道/包名/应用名打包Apk

    千次阅读 2015-08-12 18:01:57
    Gradle分渠道/包名/应用名打包Apk实际应用开发中,我们会遇到多渠道打包的情况,这是属于比较常见的,但更复杂的需求,如指定渠道使用指定包名, 甚至指定应用名、图标来打包APK, 这种情况下,通常情况下是去手动...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 186,558
精华内容 74,623
关键字:

包名