我丢失password了keystore用于签署我的apk 的文件.我现在无法更新我的应用程序,我想我必须通过使用新的密钥库签名将其作为新应用程序发布.是否可以解密密钥库文件,因为我在密钥库文件中存在密钥库文件和密码.或者任何人都可以提供用于暴力密码的程序链接.如果你们中的任何人能够恢复密钥库文件的密码,请分享你的方法.提前致谢.
TL; DR:你如何成功地使用命令行工具(或其他任何东西)来测试Android 6.0备份和恢复行为,因为我无法让它们恢复任何东西?
由于我早些时候遇到了问题,我的书中有一个示例应用程序试图让这个工作,我从头开始为了这个问题的目的.
我从Android Studio 1.4.1新项目向导创建了一个全新的项目,接受所有相关的默认设置,除了我使用"空活动"模板并添加了2应用程序ID和显示名称.然后我在活动中添加了一些代码,以便为我提供有关内部存储的一些数据:
package com.commonsware.myapplication2;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v7.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
PreferenceManager
.getDefaultSharedPreferences(this)
.edit()
.putBoolean("foo", true)
.apply();
}
}
Run Code Online (Sandbox Code Playgroud)
我运行应用程序并确认,使用adb shell run-as com.commonsware.myapplication2 ...该SharedPreferences文件存在.
然后我adb shell setprop log.tag.BackupXmlParserLogging VERBOSE根据文档跑了.没有明显的问题.
然后我adb shell bmgr run按照文档运行,它生成了大量的日志消息,但没有任何与我的应用程序有关的内容(正如预期的那样)(并且也没有暗示备份引擎的任何特殊问题).
然后我adb shell bmgr fullbackup com.commonsware.myapplication2根据文档运行,生成:
11-16 15:09:15.246 10372-10372/? D/AndroidRuntime: Calling main entry com.android.commands.bmgr.Bmgr
11-16 15:09:15.248 …Run Code Online (Sandbox Code Playgroud) 我想在 android 中检查我的 EditText 的值,所以我看到了我的 String 值的两个函数:
user.isNullOrBlank()
和
user.isNullOrEmpty()
它们之间有什么区别?
很多Intent动作,例如ACTION_VIEW,Uri指向应该执行动作的内容.如果内容由文件支持 - 无论是Uri直接指向文件还是ContentProvider服务文件(请参阅参考资料FileProvider) - 这通常都有效.
在某些情况下,开发人员不希望将内容驻留在文件中以与其他应用程序共享.一种常见的情况是加密:解密的数据应该驻留在RAM中,而不是磁盘上,以最大限度地降低某人获取该解密数据的风险.
我从RAM共享的经典解决方案是使用ParcelFileDescriptor和createPipe().但是,当响应ACTION_VIEW(或其他)的活动获得InputStream该管道时,与ContentProvider从文件提供内容时获得的流相比,生成的流受到限制.例如,此示例应用程序适用于Adobe Reader并崩溃QuickOffice.
基于过去的 相关问题,我的假设是createPipe()真正创建一个管道,并且管道是不可寻找的.试图"倒带"或"快进"的客户因此遇到问题.
我正在寻找一种可靠的解决方案,用于与第三方应用程序共享内存内容,以解决此限制.特别:
它必须使用Uri可能被客户端应用程序(即ACTION_VIEW实现者)尊重的语法; 涉及客户端应用程序不太可能识别的某些麻烦的解决方案(例如,通过Intent额外的方式传递某些内容)不符合条件
要共享的数据不能作为共享的一部分写入文件(当然,客户端应用程序最终可以将收到的字节保存到磁盘,但暂时忽略该风险)
理想情况下,它不涉及应用程序寻求共享数据开放ServerSocket或以其他方式加剧安全风险
可能建议的想法包括:
某种重新配置的方法会导致可createPipe()搜索的管道
某种使用基于套接字的方法FileDescriptor可以产生可搜索的管道
某种RAM磁盘或其他东西,感觉像Android的其余部分的文件,但不是持久的
如果你愿意的话,一个关键的工作解决方案就是如果我可以从RAM中获得QuickOffice可以读取的PDF.
有什么建议?
谢谢!
我正在(最后)编写关于我书的任务的章节,我遇到了一些挥之不去的谜题.
作为主屏幕发射器的东西似乎使用FLAG_ACTIVITY_NEW_TASK和FLAG_ACTIVITY_RESET_TASK_IF_NEEDED启动请求的启动器活动时的组合:
Intent i=new Intent(Intent.ACTION_MAIN);
i.addCategory(Intent.CATEGORY_LAUNCHER);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
i.setComponent(name);
startActivity(i);
Run Code Online (Sandbox Code Playgroud)
文档FLAG_ACTIVITY_RESET_TASK_IF_NEEDED包含:
如果设置,并且此活动要么在新任务中启动,要么将现有任务置于顶部,那么它将作为任务的前门启动.这将导致应用任务所需的任何关联性,以使该任务处于适当的状态(将活动移入或移出),或者仅在需要时将该任务重置为其初始状态.
那不是特别清楚.
特别是,它似乎是相同的效果将使用的组合可以看出FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_SINGLE_TOP.引用文档FLAG_ACTIVITY_CLEAR_TOP:
如果已设置,并且正在启动的活动已在当前任务中运行,则不会启动该活动的新实例,而是将关闭其上的所有其他活动,并将此Intent传递给(现在开启) top)旧活动作为一个新的意图......
当前运行的[所需活动]实例将在其onNewIntent()方法中接收您从此处开始的新意图,或者本身已完成并使用新意图重新启动.如果它已将其启动模式声明为"多个"(默认值)并且您没有在同一意图中设置FLAG_ACTIVITY_SINGLE_TOP,那么它将被完成并重新创建; 对于所有其他启动模式或如果设置了FLAG_ACTIVITY_SINGLE_TOP,则此Intent将被传递到当前实例的onNewIntent().
该FLAG_ACTIVITY_CLEAR_TOP文档是有道理的,至少对我来说.
那么,这FLAG_ACTIVITY_RESET_TASK_IF_NEEDED与FLAG_ACTIVITY_CLEAR_TOPand 的组合FLAG_ACTIVITY_SINGLE_TOP有何不同?
如果您可以解释FLAG_ACTIVITY_CLEAR_TASK与上述其他两个选项中的任何一个不同的加分点.
如果在传递给Context.startActivity()的Intent中设置,则此标志将导致在活动开始之前清除与活动关联的任何现有任务.也就是说,活动成为否则为空任务的新根,并且任何旧活动都已完成.这只能与FLAG_ACTIVITY_NEW_TASK一起使用.
这和FLAG_ACTIVITY_CLEAR_TOP| 之间有一个明显的区别 FLAG_ACTIVITY_SINGLE_TOP是FLAG_ACTIVITY_CLEAR_TASK需要的FLAG_ACTIVITY_NEW_TASK.但是,除此之外,看起来净效果是相同的,也是匹配的FLAG_ACTIVITY_RESET_TASK_IF_NEEDED.
Android 5.0+中ART运行时的一个受欢迎的功能是堆压缩,以减少堆碎片.碎片堆可以变得OutOfMemoryErrors更容易,因为可能没有足够大的单个内存空间块足以满足您的需求,即使堆总体上有足够的可用空间.
据我所知,这会在应用移动到后台时发生,基于Google会议演示文稿等.但是,我在文档中可以找到的唯一声明是:
同构空间压缩是自由列表空间,用于自由列出空间压缩,这通常在应用程序移动到暂停不可察觉的过程状态时发生.这样做的主要原因是减少RAM使用量并对堆进行碎片整理.
从技术上讲,目前尚不清楚"暂停不可察觉的过程状态"究竟意味着什么.
假设一个应用程序目前没有任何前台活动.开发人员可能做了哪些事情可能会阻止该应用程序进程的堆压缩?例如,是否有前台服务块堆压缩?
作为这个问题的后续行动,我试图弄清楚是什么阻止了谷歌修改我们签名和分发的应用程序。无论我们分发 APK 还是 App Bundle,App Signing 服务都会剥离我们拥有的任何签名,而 Google 会对它分发的 APK 进行签名。在 App Bundle 的情况下,这将产生多个 APK,类似于bundletool生成的。
但由于 APK 只是一个带有编译代码和资源的 ZIP 存档,似乎谷歌可以在签名之前按照他们认为合适的方式修改它,包括添加或替换代码。
我们不会在您不知情和未批准的情况下修改和分发您的应用程序代码
和:
如前所述,Play 不会在您不知情和批准的情况下修改您的应用程序的功能。
值得注意的是,谷歌使用了“不要”和“不会”……而不是“不能”和“不能”。事实上,在同一篇文章中,我们看到:
对于作为应用程序包上传的应用程序,我们将通过引入所谓的源标记来提高这种安全性。此源元数据由 插入到应用程序的清单中
bundletool。
因此,我们知道至少一种修改,尽管是元数据。
此外, Android 版 Amazon AppStore 在重新签署 APK 之前会修改它们:
无论您是否选择应用 Amazon DRM,Amazon 都会使用代码包装您的应用程序,使该应用程序能够与 Amazon Appstore 客户端通信以收集分析、评估和执行计划策略,并与您共享汇总信息。您的应用程序在启动时将始终与 Amazon Appstore 客户端通信,即使您选择不应用 DRM。
亚马逊删除您的签名并使用您独有的亚马逊签名重新签署您的应用程序,该签名不会更改,并且对于您账户中的所有应用程序都是相同的。
十年来,亚马逊一直在做这种事情。
似乎谷歌应该拥有与亚马逊相同的技术能力。
那么,是否有任何我遗漏的东西会阻止 Google 添加或修改它重新签名和分发的 APK 中的代码?
在 Android 12 中,如果应用程序通过以下方式请求精细位置权限ACCESS_FINE_LOCATION,用户可能会选择仅授予粗略位置权限。不幸的是,并非所有 API 都可以使用粗略位置权限 \xe2\x80\x94,特别是 AFAICT,要查找已连接 WiFi 网络的 SSID,我们需要精细位置权限,而不是粗略位置权限。
如果您重新请求精细位置权限,系统将要求用户升级您的访问权限,但用户可能会拒绝。因此,我们需要一种方法来优雅地确定用户授予了我们粗略位置权限,并且我们仍然有资格请求升级。
\n这个示例项目只有一个按钮来触发requestPermissions()forACCESS_FINE_LOCATION,以及四个要报告的标签:
checkSelfPermission()为了ACCESS_FINE_LOCATION)checkSelfPermission()为了ACCESS_COARSE_LOCATION)shouldShowRequestPermissionRationale()为了ACCESS_FINE_LOCATION)shouldShowRequestPermissionRationale()为了ACCESS_COARSE_LOCATION)在运行 Android 12 最终测试版的 Pixel 3a XL 上全新安装后运行此命令,在执行列出的操作序列后,我得到以下结果:
\n| 行动 | 有精细许可吗? | 有粗略权限吗? | 提示罚款? | 提示粗略? |
|---|---|---|---|---|
| 启动应用程序 | 不 | 不 | 不 | 不 |
| 使用应用程序时单击按钮并授予大致位置 | 不 | 是的 | 不 | 不 |
| 再次单击按钮并选择“保留大致位置” | 不 | 是的 | 是的 | 不 … |
模块的build.gradle文件是否有一种相当简单的方法来指示应该排除来自依赖项的某些文件?我特别想从AAR中排除某些资源.
LeakCanary是一个有趣的库,可帮助追踪内存泄漏.但是,它的无证要求compileSdkVersion是21或更高.虽然大多数项目都不应该有这个问题,但是图书馆compileSdkVersion没有充分理由要求某个项目是不合适的.开发团队可能已将其compileSdkVersion作为一般策略的一部分冻结,仅将这些设置更改为其应用程序或其他内容的主要版本更新的一部分.
在这种情况下,对于LeakCanary的v1.3.1至少,唯一的原因compileSdkVersion是AFAICT,因为AAR有一个res/values-v21/目录,包含一个继承自的主题定义Theme.Material.诊断活动使用此主题.最终用户从未见过该活动,只有debug构建中的开发人员才能看到.坦率地说,主题方面的活动看起来并不重要.迫使compileSdkVersion21只是让那个诊断活动有一个特定的主题是,恕我直言,愚蠢.
如果作为compile指令的一部分,我们可以说"嘿,请跳过res/values-v21/这个AAR,m'kay,这很好." 由于-v21主题只是提供了其他地方定义的主题的替代定义,因此删除-v21主题不会破坏构建或在运行时中断事物,而只会给我们一个Holo主题诊断活动.
我没有看到这个答案如何与依赖关系一起工作.我也不确定它是否完整,它似乎似乎没有得到支持.它也没有真正符合"简单"的条件 - 我不希望有人尝试将其放在build.gradle文件中只是为了阻止像LeakCanary这样的诊断库中的单个文件.
那么,是否有一些比这更简单的东西适用于当前版本的Android插件Gradle?
关于Gradle中AAR文件的传递依赖性,有几个问题浮出水面:
我也遇到类似的问题,试图在远程存储库中的AAR文件上设置传递依赖.我有App A,取决于库B,而库B又依赖于库C.库C在Maven仓库中.库B在同一个仓库中,其中POM包含对库C的依赖性.应用程序A在其依赖项中具有库B. 但是,运行gradle clean assembleDebug结果为:"模块版本[库B]依赖于库,但不是库本身".
我试着给其中一个问题一个赏金,希望清楚,没有运气.
我的猜测是,我和那些有上述SO问题的人有两种可能的困难来源:
来自远程存储库的传递AAR依赖性简单地被破坏
来自远程存储库的传递AAR依赖项可以工作,但是我们的POM文件,build.gradle文件或某些破坏依赖项的内容有所不同
问题:有没有人知道某个公共存储库(例如,Maven Central)中的AAR工件,它依赖于另一个AAR工件,也在同一个公共存储库中?
我对依赖于本地存储库中的某些内容的AAR不感兴趣,例如依赖于Maven Central中的AAR com.android.support:support-v4.在我的例子中,如果库B和库C都在我的本地Maven存储库(~/.m2)中,一切正常.
据Xav说,我在做什么应该有效.因此,我希望有人可以指出一个有效的例子,这样我就可以用它来确定我们其他人可能出错的地方.
注意:我知道要求异地资源是禁止的.在这种情况下,我不是自己寻找资源,而是作为工作配置的示例,帮助调试非工作配置.如果您有另一种方式来编写显示工作配置的答案,那就太棒了!
谢谢!