谁有这个APP的微信安装包 安卓安卓的

推特有安卓的吗?哪个大大有安装包发给呗【app吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:122,610贴子:
推特有安卓的吗?哪个大大有安装收藏
推特有安卓的吗?哪个大大有安装包发给呗
登录百度帐号获取Android手机里所有已安装的APP
最近做一个功能时有这样一个需求,就是要扫描本地所有已安装的App,来判断是否安装了某个App,如果没有安装,点击按钮就下载,如果已经安装,点击按钮就打开该App。这个里面主要的功能就是获取当前安装的所有APP的信息。所以我就写了一个demo,展示所有已安装App的图标和包名。
进入正题,先看效果图:
上面是扫描到的App的图标和包名。这个demo主要分两块,一块是扫描的到App信息列表,一块是用ListView展示出来。
在展示的时候,我们只用到了两个应用信息,一个是应用的图标,一个是应用的包名。所以我们先定义一个类来代表我们扫描到的App。public class MyAppInfo {
private String appN
public MyAppInfo(Drawable image, String appName) {
this.image =
this.appName = appN
public MyAppInfo() {
public Drawable getImage() {
public void setImage(Drawable image) {
this.image =
public String getAppName() {
return appN
public void setAppName(String appName) {
this.appName = appN
只有两个属性,两个构造方法,和系统生成的get ,set方法,没什么好说的,image放置图标,appName放置包名。定义好了放置应用信息的类,接下来再定义一个ApkTool的工具类,用来帮助我们获取当前所安装的App。
* Created by gray_dog3 on 16/3/3.
* 扫描本地安装的应用,工具类
public class ApkTool {
String TAG = "ApkTool";
public static List&MyAppInfo& mLocalInstallApps =
public static List&MyAppInfo& scanLocalInstallAppList(PackageManager packageManager) {
List&MyAppInfo& myAppInfos = new ArrayList&MyAppInfo&();
List&PackageInfo& packageInfos = packageManager.getInstalledPackages(0);
for (int i = 0; i & packageInfos.size(); i++) {
PackageInfo packageInfo = packageInfos.get(i);
//过滤掉系统app
if ((ApplicationInfo.FLAG_SYSTEM & packageInfo.applicationInfo.flags) != 0) {
MyAppInfo myAppInfo = new MyAppInfo();
myAppInfo.setAppName(packageInfo.packageName);
if (packageInfo.applicationInfo.loadIcon(packageManager) == null) {
myAppInfo.setImage(packageInfo.applicationInfo.loadIcon(packageManager));
myAppInfos.add(myAppInfo);
}catch (Exception e){
Log.e(TAG,"===============获取应用包信息失败");
return myAppI
里面就只有一个方法,根据所传的packageManager获得所有已安装的应用的包信息。然后遍历,去除没有图标的包信息,把所有图标的应用放到myAppInfos列表里。非常简单,这里注意注释掉部分,是过滤掉所有系统应用的,因为有时候我们只想知道第三方应用列表,便于管理。
最上面的mLocalInstallApps是开始留给做缓存用的,由于在扫描的时候要另外开一个线程,加缓存还牵涉到加锁,同步的问题,讲起来比较麻烦,所以暂且先不讲缓存。只讲这一个知识点。其实加上缓存代码也很简单。
好了,ApkTool写好了,我们怎么去调用呢。不上代码都是耍流氓,直接看代码:
private void initAppList(){
new Thread(){
public void run() {
super.run();
//扫描得到APP列表
final List&MyAppInfo& appInfos = ApkTool.scanLocalInstallAppList(MainActivity.this.getPackageManager());
mHandler.post(new Runnable() {
public void run() {
mAppAdapter.setData(appInfos);
}.start();
就这几行,我们在MainActivity里面写了这个方法,在onCreat()里去调用,初始化列表。开一个线程,然后在run()方法里面做我们想做的事,调用我们在ApkTool里写好的方法。返回封装好的,只有图标和包名的应用信息列表。这里解释下,因为扫描比较耗时,可能会引起ANR,所以开了一个子线程,去调用ApkTool来扫描应用信息。扫描到结果以后,我们要通知Adapter来更新UI,Android不允许在非UI线程里面更新UI的,所以这里用了Handler去post一个Runnable对象。如果对Handler不是很懂,可以去看下官方怎么讲。我后面也会写一篇相关的博客来专门讲Handler。还是先简单说下吧:(懂的跳过)
由于Android是移动设备,用户交互几乎全部通过屏幕,用户的全部注意力几乎都集中在屏幕上,屏幕交互卡顿,或者UI信息有丝毫的延迟,用户的感觉是很不爽的。所以Android把UI显示放到主线程里,并且强烈建议耗时操作放到子线程里。但是别的线程把事情做好了,总要通知UI,展示界面变化吧,比如新闻客户端里,连接网络加载信息的线程,把新闻从服务端拉过来了,如果它直接去操作界面,结束loading,显示内容,这样也不是不可以,但是,如果没有约束,UI展示的时序行就难保证了,各种事情做好了就来操作UI,那UI显示就乱掉了。所以android是拒绝的。但是UI线程也要知道事情做完了。所以UI线程就给子线程提供了一个交互的信使Handler。就是UI线程说,你想跟哥汇报什么事,先跟我的Handler说,我每隔一段时间再把我的Handler叫过来,取一件处理。我们在UI线程里new
Handler的时候也就相当于雇了一个信使,然后子线程就可以用这个信使来给UI线程传信了。在Android里我们通过Handler可以传递一些Message,也可以通过传Runnable对象,这样Runnable的run()方法里面的内容就是我们想要在UI线程里要执行的代码。
扯完了Handler细节很多,但作用就是这个,还是建议认真看下官方文档。
关于ListView部分就不多讲了,直接贴出代码:
public class MainActivity extends AppCompatActivity {
private ListView lv_app_
private AppAdapter mAppA
public Handler mHandler = new Handler();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv_app_list = (ListView) findViewById(R.id.lv_app_list);
mAppAdapter = new AppAdapter();
lv_app_list.setAdapter(mAppAdapter);
initAppList();
private void initAppList(){
new Thread(){
public void run() {
super.run();
//扫描得到APP列表
final List&MyAppInfo& appInfos = ApkTool.scanLocalInstallAppList(MainActivity.this.getPackageManager());
mHandler.post(new Runnable() {
public void run() {
mAppAdapter.setData(appInfos);
}.start();
class AppAdapter extends BaseAdapter {
List&MyAppInfo& myAppInfos = new ArrayList&MyAppInfo&();
public void setData(List&MyAppInfo& myAppInfos) {
this.myAppInfos = myAppI
notifyDataSetChanged();
public List&MyAppInfo& getData() {
return myAppI
public int getCount() {
if (myAppInfos != null && myAppInfos.size() & 0) {
return myAppInfos.size();
public Object getItem(int position) {
if (myAppInfos != null && myAppInfos.size() & 0) {
return myAppInfos.get(position);
public long getItemId(int position) {
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder mViewH
MyAppInfo myAppInfo = myAppInfos.get(position);
if (convertView == null) {
mViewHolder = new ViewHolder();
convertView = LayoutInflater.from(getBaseContext()).inflate(R.layout.item_app_info, null);
mViewHolder.iv_app_icon = (ImageView) convertView.findViewById(R.id.iv_app_icon);
mViewHolder.tx_app_name = (TextView) convertView.findViewById(R.id.tv_app_name);
convertView.setTag(mViewHolder);
mViewHolder = (ViewHolder) convertView.getTag();
mViewHolder.iv_app_icon.setImageDrawable(myAppInfo.getImage());
mViewHolder.tx_app_name.setText(myAppInfo.getAppName());
return convertV
class ViewHolder {
ImageView iv_app_
TextView tx_app_
最后说下,如果想实时监听有app安装或者卸载,可以在资源清单里面注册监听安装和卸载app的广播,也可以在Activity里面监听,只要收到广播后再调用上面的initAppList()方法即可。如果你要实现跟我一样的功能,检测一个应用是否安装,可以在遍历的时候去拿包名比较,就可以的到结果。如果你要列出所有的系统应用或所有的非系统应用,上面注释出也给出了过滤方法。
好了,传送门:
没有更多推荐了,本周下载排行
累计下载排行
01一键root_kingroot v4.6.0 安卓版01系统工具 / 8.7M02云图漫步app v7.2.5 安卓版02系统工具 / 14.2M03汽车在线 v1.9.4安卓版03系统工具 / 21M04淘宝手机助手 v4.5.1 安卓版04系统工具 / 6.6M05微信多开器 v1.2.2
安卓版05系统工具 / 5.5M06爱上钢琴 v5.0.6 安卓版06系统工具 / 16.3M07vivo手机助手手机版 v3.4.1 安卓版07系统工具 / 6.3M08计算管家 v3.7.0 安卓版08系统工具 / 4.8M09WiFi万能密码 v3.6 安卓版09系统工具 / 6.1M10WiFi万能密码 v3.5.1 安卓版10系统工具 / 8.0M
01一键root_kingroot v4.6.0 安卓版01系统工具 / 8.7M02云图漫步app v7.2.5 安卓版02系统工具 / 14.2M03手机APK编辑软件_AIDE-Android Java IDE v2.9.2 安卓版03系统工具 / 15.5M0491手机助手 v6.8.92
安卓版04系统工具 / 6.5M05vivo手机助手手机版 v3.4.1 安卓版05系统工具 / 6.3M062345网址导航 v4.5 安卓版06系统工具 / 3.1M07秒赞网 v1.0 安卓版07系统工具 / 934KB08计算管家 v3.7.0 安卓版08系统工具 / 4.8M09合享智慧 v1.0 安卓版09系统工具 / 8.8M10小温盒子 v1.3 安卓版10系统工具 / 5.2M
热门关键词
2.4M / 简体中文 / 7.0539KB / 简体中文 / 0.0770KB / 简体中文 / 7.0613KB / 简体中文 / 10.08.0M / 简体中文 / 7.09.3M / 英文 / 7.06.6M / 简体中文 / 7.023.4M / 简体中文 / 7.02.5M / 简体中文 / 7.06.9M / 简体中文 / 7.0
装机必备软件Android无需root实现apk的静默安装
转载 &更新时间:日 09:50:47 & 作者:初页
这篇文章主要介绍了Android无需root实现apk的静默安装 的相关资料,需要的朋友可以参考下
Android的静默安装似乎是一个很有趣很诱人的东西,但是,用普通做法,如果手机没有root权限的话,似乎很难实现静默安装,因为Android并不提供显示的Intent调用,一般是通过以下方式安装apk:
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
startActivity(intent);
但是,这并没有真正的实现静默安装,因为有用户界面,会让用户知道。那么,怎么在后台悄悄的安装APK呢?只能试图去看看Android系统源码正常安装APK的过程,我这边下载的源码是Android5.0系统的,5个G的大小,但是可能由于Android5.0有一些安全方面的更新,跟之前的版本还是有一定的差距的,但是,学会一个之后再去学另一个相似的过程,那就简单许多了,就像学会了C语言,再学Java,也并非什么难事。
Android系统把所有的Permission(权限)依据其潜在风险划分为四个等级,即"normal"、 "dangerous"、 "signature"、 "signatureOrSystem"。APK的安装对应的权限是 INSTALL_PACKAGES,权限等级属于后两者。所以,最终想实现APK的静默安装,必然需要一些特殊的处理,执行安装的这个进程,须为系统进程。
那么,我们就来看看Android自身是如何实现安装APK的。安装的命令是pm install... 我们定位到系统源码的/frameworks/base/cmds/pm/src/com/android/commands/pm/Pm.java这个文件,他实现了pm命令,我们看runInstall方法,这就是APK的安装过程。
private void runInstall() {
int installFlags = 0;
int userId = UserHandle.USER_ALL;
String installerPackageName =
String originatingUriString =
String referrer =
String abi =
while ((opt=nextOption()) != null) {
if (opt.equals("-l")) {
installFlags |= PackageManager.INSTALL_FORWARD_LOCK;
} else if (opt.equals("-r")) {
installFlags |= PackageManager.INSTALL_REPLACE_EXISTING;
} else if (opt.equals("-i")) {
installerPackageName = nextOptionData();
if (installerPackageName == null) {
System.err.println("Error: no value specified for -i");
} else if (opt.equals("-t")) {
installFlags |= PackageManager.INSTALL_ALLOW_TEST;
} else if (opt.equals("-s")) {
// Override if -s option is specified.
installFlags |= PackageManager.INSTALL_EXTERNAL;
} else if (opt.equals("-f")) {
// Override if -s option is specified.
installFlags |= PackageManager.INSTALL_INTERNAL;
} else if (opt.equals("-d")) {
installFlags |= PackageManager.INSTALL_ALLOW_DOWNGRADE;
} else if (opt.equals("--originating-uri")) {
originatingUriString = nextOptionData();
if (originatingUriString == null) {
System.err.println("Error: must supply argument for --originating-uri");
} else if (opt.equals("--referrer")) {
referrer = nextOptionData();
if (referrer == null) {
System.err.println("Error: must supply argument for --referrer");
} else if (opt.equals("--abi")) {
abi = checkAbiArgument(nextOptionData());
} else if (opt.equals("--user")) {
userId = Integer.parseInt(nextOptionData());
System.err.println("Error: Unknown option: " + opt);
if (userId == UserHandle.USER_ALL) {
userId = UserHandle.USER_OWNER;
installFlags |= PackageManager.INSTALL_ALL_USERS;
final Uri verificationURI;
final Uri originatingURI;
final Uri referrerURI;
if (originatingUriString != null) {
originatingURI = Uri.parse(originatingUriString);
originatingURI =
if (referrer != null) {
referrerURI = Uri.parse(referrer);
referrerURI =
// Populate apkURI, must be present
final String apkFilePath = nextArg();
System.err.println("\tpkg: " + apkFilePath);
if (apkFilePath == null) {
System.err.println("Error: no package specified");
// Populate verificationURI, optionally present
final String verificationFilePath = nextArg();
if (verificationFilePath != null) {
System.err.println("\tver: " + verificationFilePath);
verificationURI = Uri.fromFile(new File(verificationFilePath));
verificationURI =
LocalPackageInstallObserver obs = new LocalPackageInstallObserver();
VerificationParams verificationParams = new VerificationParams(verificationURI,
originatingURI, referrerURI, VerificationParams.NO_UID, null);
mPm.installPackageAsUser(apkFilePath, obs.getBinder(), installFlags,
installerPackageName, verificationParams, abi, userId); //注意!!最终就是调用这个方法来进行安装的
synchronized (obs) {
while (!obs.finished) {
obs.wait();
} catch (InterruptedException e) {
if (obs.result == PackageManager.INSTALL_SUCCEEDED) {
System.out.println("Success");
System.err.println("Failure ["
+ installFailureToString(obs)
} catch (RemoteException e) {
System.err.println(e.toString());
System.err.println(PM_NOT_RUNNING_ERR);
知道了这个过程之后,就大概知道怎么做了。既然系统底层把这个API屏蔽了,那就想办法去绕过这层屏蔽,来使用它。首先想到的就是使用AIDL,不知道AIDL这东西的,先问度娘去吧~~在上面的代码中,最终实现安装的那一句话,mPm.installPackageAsUser(...),mPm是个什么东西?不难发现,IPackageManager类型,那么这个类从哪里来?搜寻一下,位于/frameworks/base/core/java/android/content/pm这个包底下,拷贝到我们工程目录底下,包名不能变,只拷贝这一个文件的话,一定是不行了,会报其他的一些aidl找不到,相应地也拷贝过来。Android5.0中,aidl改动还是比较大的,所以要拷贝很多东西过来,还要进行一些改动...我也是花了挺久才改到他没报错。
最终,工程的目录如下所示~~
那么,如何来使用它呢?
1、先获取系统服务android.os.ServiceManager,这个又是隐藏的,怎么办?考验Java水平的时候到了~~没错,用反射机制,来获取ServiceManager类,以及该类里面的方法;
2、有了服务之后,我们就要去拿到IPackageManager这个对象;
3、调用IPackageManager里面的installPackage方法进行安装;
实现代码如下:
package com.example.
import java.io.F
import java.io.FileOutputS
import java.io.IOE
import java.io.InputS
import java.io.OutputS
import java.lang.reflect.M
import android.app.A
import android.content.I
import android.content.pm.IPackageInstallObserver2;
import android.content.pm.IPackageM
import android.content.pm.VerificationP
import android.net.U
import android.os.B
import android.os.IB
import android.os.RemoteE
import android.view.V
public class MainActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
* Button点击事件
* @param view
public void install(View view)
String path = "";
if (FileUtils.isSdcardReady()) {
path = FileUtils.getSdcardPath();
path = FileUtils.getCachePath(this);
String fileName = path + "/AidlServerDemo.apk";
File file = new File(fileName);
if(!file.exists())
copyAPK2SD(fileName);
Uri uri = Uri.fromFile(new File(fileName));
// 通过Java反射机制获取android.os.ServiceManager
Class&?& clazz = Class.forName("android.os.ServiceManager");
Method method = clazz.getMethod("getService", String.class);
IBinder iBinder = (IBinder) method.invoke(null, "package");
IPackageManager ipm = IPackageManager.Stub.asInterface(iBinder);
@SuppressWarnings("deprecation")
VerificationParams verificationParams = new VerificationParams(null, null, null, VerificationParams.NO_UID, null);
// 执行安装(方法及详细参数,可能因不同系统而异)
ipm.installPackage(fileName, new PackageInstallObserver(), 2, null, verificationParams, "");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
// 用于显示结果
class PackageInstallObserver extends IPackageInstallObserver2.Stub {
public void onUserActionRequired(Intent intent) throws RemoteException {
// TODO Auto-generated method stub
public void onPackageInstalled(String basePackageName, int returnCode, String msg, Bundle extras) throws RemoteException {
//returnCode&span style="font-family: Arial, Helvetica, sans-"&为1,就是安装成功&/span&
* 拷贝assets文件夹的APK插件到SD
* @param strOutFileName
* @throws IOException
private void copyAPK2SD(String strOutFileName) throws IOException {
FileUtils.createDipPath(strOutFileName);
InputStream myInput = this.getAssets().open("AidlServerDemo.apk");
OutputStream myOutput = new FileOutputStream(strOutFileName);
byte[] buffer = new byte[1024];
int length = myInput.read(buffer);
while (length & 0) {
myOutput.write(buffer, 0, length);
length = myInput.read(buffer);
myOutput.flush();
myInput.close();
myOutput.close();
每个版本的系统源码里面的aidl可能会不一样,所以具体调用的方法和参数,还得根据实际情况而定,需要去仔细阅读Pm.java这个文件的源码。
在其他版本可能只需要拷贝这4个文件:PackageManager.java、 IPackageDeleteObserver.aidl 、IPackagerInstallObserver.aidl、 IPackageMoveObserver.aidl
然后,还需在配置清单文件里面添加INSTALL_PACKAGE权限
&uses-permission android:name="android.permission.INSTALL_PACKAGES"/&
然后把该应用的uid设置为系统级别的,在manifest标签下添加以下属性
android:sharedUserId="android.uid.system"
仅仅这样的话,还是没法实现静默安装,因为系统并不认为你这个app是系统级别的应用,所以,还应该对该应用的APK进行系统签名(注意:不是那个静默安装的APK,是这个实现静默安装程序的APK)。签名过程如下:
总共需要三个文件:
<span style="color: #、SignApk.jar&&&&&&&&&&&&&&&&&&&&& %系统源码%/out/host/linux-x86/framework/signapk.jar
<span style="color: #、platform.x509.pem&&&&&&&&& %系统源码%/build/target/product/security/platform.x509.pem
<span style="color: #、platform.pk8&&&&&&&&&&&&&&&&&&& %系统源码%/build/target/product/security/platform.pk8
打开终端,执行命令 java -jar SignApk.jar platform.x509.pem platform.pk8 未签名APK 签名后APK,例如
java -jar SignApk.jar platform.x509.pem& platform.pk8 AutoInstall.apk AutoInstall_new.apk&
之后,把签名过后的APK安装到手机上,打开,点击静默安装,在去程序页看看,发现安装成功~~
更多内容可以参考专题进行学习。
本文主要是提供了一种实现静默安装的思路,但是具体怎么做到兼容各个系统,举一反三,
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具手机频繁安装APP,到底对手机有没有危害?安卓系统的注意了!手机频繁安装APP,到底对手机有没有危害?安卓系统的注意了!一月说科技百家号其实对于这个问题,是要分开来看,像苹果ios系统的,每个应用都是独立的,只要你卸载了这款应用,它就会自动帮你清空里面的数据,让这应用彻底的消失在苹果手机中,因此苹果手机就算频繁安装卸载都不会有太大的问题。熟悉软件的朋友应该知道,安装软件的时候,软件还会在你的手机里面留下一些你找不到或者不认识的文件夹,就算你删除了这个软件,这些文件夹还是遗留在手机上,占据着手机的空间,就算是用手机清理软件也很难完全删除。对于安卓用户来说,拆卸软件却会造成一定影响。安卓系统具有开放性,软件卸载很难做到卸载干净,软件的媒体或者注册表等信息的碎片化文件会残留在手机内。频繁安装和卸载软件,手机存储里的碎片化文件就会越来越多,会占用内置内存,绝大部分手机清理软件都无法扫描到这些碎片。苹果手机APP都是从App Store上下载,已经经过安全验证,所以不用太担心安全问题。安卓的用户就需要注意软件的安全问题。卸载时苹果手机是自动完全卸载的,安卓的则需要手动或专门的软件清理干净。保证安全和清理,就没有问题了。由于你重复下载安装不一样的软件,那么他的rom的本身碎片化越多,加上国内的安卓软件不怎么注重用户本身,过多会导致rom的压力,不过极其小,只是在搜索引导上比较慢,但是一旦软件主要rom的文件,一旦调动起来会花费更多的时间,加上你平时对安卓手机的不注重,不会管理,那么好几部分集合起来。很多人觉得安卓手机越用越卡,其实最主要的原因是自己对安卓手机的不注重和不会管理造成的。最简单省事的清理方法就是恢复出厂设置,不过记得先备份重要文件。手机经常安装、卸载软件,虽然不会对系统产生修改等影响,但是,频繁安装各种软件可能会带来安全风险,如在安装软件的同时,不小心安装了其他不需要的捆绑软件,甚至吸费软件等,会给自己带来不必要的麻烦,所以不建议经常安装、卸载软件。频繁卸载安装软件对手机产生的危害,往往没有安装软件本身大,比如吸费软件、捆绑软件等,所以下载软件一定要选择正规的渠道本文由百家号作者上传并发布,百家号仅提供信息发布平台。文章仅代表作者个人观点,不代表百度立场。未经作者许可,不得转载。一月说科技百家号最近更新:简介:专注科技原创资讯,每天分享科技界奇闻趣事作者最新文章相关文章}

我要回帖

更多关于 雯雅婷4安卓版安装包 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信