- 浏览: 425898 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
xinzhengjie:
服务器用什么实现
pjsip -
yxhloen01:
只放debug.keystore但是没给密码啊。。。。。。 ...
静默安装实现方法 -
tabolt:
android 应用强制停止 -
li1046964106:
[color=green][size=x-small][ali ...
安卓图表引擎AChartEngine(二) - 示例源码概述和分析 -
smallk2013:
用你这个方法为什么我只想模拟点击 无法实现啊
Android下执行Runtime.getRuntime().exec后返回状态
private String showUninstallAPKSignatures(String apkPath) {
String PATH_PackageParser = "android.content.pm.PackageParser";
try {
// apk包的文件路径
// 这是一个Package 解释器, 是隐藏的
// 构造函数的参数只有一个, apk文件的路径
// PackageParser packageParser = new PackageParser(apkPath);
Class pkgParserCls = Class.forName(PATH_PackageParser);
Class[] typeArgs = new Class[1];
typeArgs[0] = String.class;
Constructor pkgParserCt = pkgParserCls.getConstructor(typeArgs);
Object[] valueArgs = new Object[1];
valueArgs[0] = apkPath;
Object pkgParser = pkgParserCt.newInstance(valueArgs);
MediaApplication.logD(DownloadApk.class, "pkgParser:" + pkgParser.toString());
// 这个是与显示有关的, 里面涉及到一些像素显示等等, 我们使用默认的情况
DisplayMetrics metrics = new DisplayMetrics();
metrics.setToDefaults();
// PackageParser.Package mPkgInfo = packageParser.parsePackage(new
// File(apkPath), apkPath,
// metrics, 0);
typeArgs = new Class[4];
typeArgs[0] = File.class;
typeArgs[1] = String.class;
typeArgs[2] = DisplayMetrics.class;
typeArgs[3] = Integer.TYPE;
Method pkgParser_parsePackageMtd = pkgParserCls.getDeclaredMethod("parsePackage",
typeArgs);
valueArgs = new Object[4];
valueArgs[0] = new File(apkPath);
valueArgs[1] = apkPath;
valueArgs[2] = metrics;
valueArgs[3] = PackageManager.GET_SIGNATURES;
Object pkgParserPkg = pkgParser_parsePackageMtd.invoke(pkgParser, valueArgs);
typeArgs = new Class[2];
typeArgs[0] = pkgParserPkg.getClass();
typeArgs[1] = Integer.TYPE;
Method pkgParser_collectCertificatesMtd = pkgParserCls.getDeclaredMethod("collectCertificates",
typeArgs);
valueArgs = new Object[2];
valueArgs[0] = pkgParserPkg;
valueArgs[1] = PackageManager.GET_SIGNATURES;
pkgParser_collectCertificatesMtd.invoke(pkgParser, valueArgs);
// 应用程序信息包, 这个公开的, 不过有些函数, 变量没公开
Field packageInfoFld = pkgParserPkg.getClass().getDeclaredField("mSignatures");
Signature[] info = (Signature[]) packageInfoFld.get(pkgParserPkg);
MediaApplication.logD(DownloadApk.class, "size:"+info.length);
MediaApplication.logD(DownloadApk.class, info[0].toCharsString());
return info[0].toCharsString();
} catch (Exception e) {
e.printStackTrace();
}
return null;
} 获取程序自身的签名:private String getSign(Context context) {
PackageManager pm = context.getPackageManager();
List<PackageInfo> apps = pm.getInstalledPackages(PackageManager.GET_SIGNATURES);
Iterator<PackageInfo> iter = apps.iterator();
while(iter.hasNext()) {
PackageInfo packageinfo = iter.next();
String packageName = packageinfo.packageName;
if (packageName.equals(instance.getPackageName())) {
MediaApplication.logD(DownloadApk.class, packageinfo.signatures[0].toCharsString());
return packageinfo.signatures[0].toCharsString();
}
}
return null;
} 对比2个方法的返回值来判断APK升级包的签名是否一致,一致就提示可以安装。
String PATH_PackageParser = "android.content.pm.PackageParser";
try {
// apk包的文件路径
// 这是一个Package 解释器, 是隐藏的
// 构造函数的参数只有一个, apk文件的路径
// PackageParser packageParser = new PackageParser(apkPath);
Class pkgParserCls = Class.forName(PATH_PackageParser);
Class[] typeArgs = new Class[1];
typeArgs[0] = String.class;
Constructor pkgParserCt = pkgParserCls.getConstructor(typeArgs);
Object[] valueArgs = new Object[1];
valueArgs[0] = apkPath;
Object pkgParser = pkgParserCt.newInstance(valueArgs);
MediaApplication.logD(DownloadApk.class, "pkgParser:" + pkgParser.toString());
// 这个是与显示有关的, 里面涉及到一些像素显示等等, 我们使用默认的情况
DisplayMetrics metrics = new DisplayMetrics();
metrics.setToDefaults();
// PackageParser.Package mPkgInfo = packageParser.parsePackage(new
// File(apkPath), apkPath,
// metrics, 0);
typeArgs = new Class[4];
typeArgs[0] = File.class;
typeArgs[1] = String.class;
typeArgs[2] = DisplayMetrics.class;
typeArgs[3] = Integer.TYPE;
Method pkgParser_parsePackageMtd = pkgParserCls.getDeclaredMethod("parsePackage",
typeArgs);
valueArgs = new Object[4];
valueArgs[0] = new File(apkPath);
valueArgs[1] = apkPath;
valueArgs[2] = metrics;
valueArgs[3] = PackageManager.GET_SIGNATURES;
Object pkgParserPkg = pkgParser_parsePackageMtd.invoke(pkgParser, valueArgs);
typeArgs = new Class[2];
typeArgs[0] = pkgParserPkg.getClass();
typeArgs[1] = Integer.TYPE;
Method pkgParser_collectCertificatesMtd = pkgParserCls.getDeclaredMethod("collectCertificates",
typeArgs);
valueArgs = new Object[2];
valueArgs[0] = pkgParserPkg;
valueArgs[1] = PackageManager.GET_SIGNATURES;
pkgParser_collectCertificatesMtd.invoke(pkgParser, valueArgs);
// 应用程序信息包, 这个公开的, 不过有些函数, 变量没公开
Field packageInfoFld = pkgParserPkg.getClass().getDeclaredField("mSignatures");
Signature[] info = (Signature[]) packageInfoFld.get(pkgParserPkg);
MediaApplication.logD(DownloadApk.class, "size:"+info.length);
MediaApplication.logD(DownloadApk.class, info[0].toCharsString());
return info[0].toCharsString();
} catch (Exception e) {
e.printStackTrace();
}
return null;
} 获取程序自身的签名:private String getSign(Context context) {
PackageManager pm = context.getPackageManager();
List<PackageInfo> apps = pm.getInstalledPackages(PackageManager.GET_SIGNATURES);
Iterator<PackageInfo> iter = apps.iterator();
while(iter.hasNext()) {
PackageInfo packageinfo = iter.next();
String packageName = packageinfo.packageName;
if (packageName.equals(instance.getPackageName())) {
MediaApplication.logD(DownloadApk.class, packageinfo.signatures[0].toCharsString());
return packageinfo.signatures[0].toCharsString();
}
}
return null;
} 对比2个方法的返回值来判断APK升级包的签名是否一致,一致就提示可以安装。
发表评论
-
圆盘旋转菜单
2013-08-27 23:35 855调用系统APP信息进行显示 -
Android下执行Runtime.getRuntime().exec后返回状态
2012-11-14 15:45 10189private String doExec(String cm ... -
获取APK文件的签名信息,反射实现
2012-11-14 15:12 1215private String showUninstallAPK ... -
android编辑单个工程
2012-09-14 14:54 800编译模块:android中的一个应用程序可以单独编译,编译后要 ... -
判断力应用程序安装位置
2012-09-05 09:28 851从Android 2.2开始软件可以安装到SD卡上,在API ... -
获取手机中已安装apk文件信息(应用图片、应用名、包名等)
2012-08-28 22:17 4075通过PackageManager可以获取手机端已安装的apk文 ... -
查询手机内所有支持分享的应用
2012-08-28 22:15 836/** * 查询手机内所有支持分享的应用 ... -
获取手机/SD卡内存大小(可用/全部)
2012-08-27 15:58 848//这个是手机内存的可用空间大小 static public ... -
语音识别
2012-08-26 15:21 801识别的语音列表listview显示出来,进行一些搜索等操作 -
android 应用强制停止
2012-08-23 17:50 6345在写应用的过程中,我们经常会遇到一些应用之间可能有冲突之类的, ... -
调用Android系统“应用程序信息(Application Info)”界面
2012-08-22 17:55 6536“Android系统设置->应用程序->管理应用程 ... -
ViewPager中使用Gallery!
2012-08-02 17:21 2336mPager.setOnTouchListener(new V ... -
android平台短信中心号获取
2012-08-07 11:12 1145就是直接获取用户手机中的短信中心号,该种方式需要你的应用满足两 ... -
Android ViewPager多页面滑动切换以及动画效果
2012-07-18 14:46 3514一、首先,我们来看一下效果图,这是新浪微博的Tab滑动效果。我 ... -
判断程序或者服务是否在前台运行
2012-07-15 23:07 10401.private boolean isTopActivity ... -
自定义标题栏
2012-07-11 15:24 9211. 代码中 requestWindowFeature(Win ... -
自定义对话框的主题
2012-07-11 15:19 885一、1.manifest.xml中 <activity ... -
调用选择图片、视频、添加音频、录音、拍摄视频、拍照等其他的功能
2011-06-23 20:30 1213//选择图片 requestCode 返 ... -
list中添加数据
2011-04-02 16:11 8373tabHost.addTab(tabHost.newTabSp ... -
QQ上的tabhost效果
2011-03-28 16:40 1277import android.app.Activity; im ...
相关推荐
通过反射方式获取安卓 apk包的签名信息,通过日志打印的方式获取 apk keystore 或者jks文件的签名信息。
1. **签名信息**:检查 APK 是否被正确签名,签名证书的详细信息,如发行者、有效期等。 2. **权限列表**:列出 APK 请求的所有 Android 权限,以及它们对用户隐私和系统资源的潜在访问。 3. **资源文件**:提取图片...
- **安装路径**:通过`ApplicationInfo.sourceDir`获取,这通常是APK文件的路径。 示例代码如下: ```java for (PackageInfo packageInfo : packages) { String appName = packageInfo.applicationInfo....
在Android系统中,每一个APK文件在发布之前都必须经过签名,这主要是为了以下几个目的: 1. **验证应用来源**:签名可以确认应用是由预期的开发者发布的,因为只有拥有私钥的开发者才能生成有效的签名。 2. **防止...
1. **皮肤资源管理**:创建皮肤资源时,需要将其组织成一个独立的APK文件,该APK只包含皮肤相关的资源。这些资源应与主应用的资源结构保持一致,以便于替换。例如,如果主应用有一个`res/drawable`目录,皮肤APK也...
1. **反射机制**:反射是Java的一个强大特性,允许程序在运行时获取和操作类、接口、字段和方法的信息。在插件化开发中,主应用通过反射调用插件APK中的类和方法,实现功能的调用。 2. **DexClassLoader**:Android...
在Android开发中,有时我们需要实现一个功能,即在运行时动态加载未安装的APK文件。这主要应用于插件化开发、热更新或者模块化的应用架构。动态加载未安装的APK可以让应用在不更新主应用程序的情况下添加或更新功能...
6. **获取签名信息**:`getPackageInfo()`方法配合`PackageManager.GET_SIGNATURES`标志,可以获取到应用的签名信息,这对于验证应用的来源和完整性非常有用。 现在,我们来看一下与给定文件名称相关的知识点: - ...
本示例"Android程序研发源码Android 实现皮肤打包成apk的demo"提供了如何将皮肤打包成一个可独立安装的APK文件的详细实现。通过分析这个Demo,我们可以学习到以下关键知识点: 1. **皮肤资源管理**: - 皮肤通常...
- **MD5校验**:计算整个APK文件的MD5值,并与预设值进行比较。 - **SHA-1校验**:更安全的方式是使用SHA-1算法计算APK的哈希值。 #### 六、Java反射防御 Java反射允许程序在运行时动态访问类和对象,这也可能被...
9. **签名验证**:APK文件在安装前必须通过签名验证。反编译后,如果修改了代码或资源,可能需要重新签名,以确保应用的完整性和可安装性。 10. **学习资源**:为了深入学习APK反编译,可以参考开源项目、在线教程...
在Android系统中,DexClassLoader是一种特殊的类加载器,它允许我们动态地加载APK或者包含.dex文件的其他类型的归档文件,从而实现代码的动态加载和执行。这个功能对于插件化开发、热更新或者模块化应用有着重要的...
在Android系统中,静默安装APK是指在不显示用户界面、无需用户...如果确实需要静默安装,可以考虑使用企业级部署方案,如MDM(Mobile Device Management)工具,它们通常提供了合法的途径来实现批量、无声的APK安装。
这通常包括读取Apk的`resources.arsc`文件来获取资源,解析`AndroidManifest.xml`以获取组件信息,以及提取和加载Dex文件。 2. 使用`PackageInfo`和`PackageManager`:Android系统提供了`PackageManager`服务,可以...
3. **资源替换**:皮肤包本质上是一个包含资源的APK文件,包含颜色、图片等界面元素。加载皮肤包后,需要替换原有的资源ID,使得应用在运行时引用到新的皮肤资源。这通常通过反射和AOSP的Resources类来实现。 4. **...
这些方法需要传入APK文件的路径、安装模式等参数。 3. **构造Intent**:另一种可能的方法是通过构造并发送一个隐式Intent来启动系统的安装服务。这种方式同样需要反射来访问隐藏的Intent和ACTION。 4. **处理回调*...
逆向工程师可以使用各种工具对 APK 进行解包、反编译,以获取敏感信息或修改行为。因此,对 APK 进行保护,如加密、混淆、添加动态加载等,是防止恶意攻击的重要手段。 ### 2. 保护器评估的重要性 保护器评估器如 ...
2. ** 插件APK的解析 **:为了加载插件,首先需要解析其AndroidManifest.xml,获取其中的Activity、Service、BroadcastReceiver和ContentProvider等组件信息。这通常通过解析XML和反射机制实现。 3. ** 替换或注入...
这可以通过将插件打包为APK或JAR文件实现,例如Plugin_Greet.apk和greet.jar。 2. **资源映射**:由于Android系统在运行时通过R类访问资源,因此需要将插件的资源ID映射到主应用的R类中。这可以通过动态生成或修改R...
在提供的压缩包子文件的文件名列表中,我们看到"app-debug.apk",这是一个典型的Android应用的调试版本APK文件,可能包含了开发者在测试过程中使用的未优化或未加密的代码,便于调试和问题排查。而"lib"可能是一个...