从Android Pie开始,限制了对某些隐藏类,方法和字段的访问。在使用Pie之前,仅通过反射即可使用这些隐藏的非SDK组件非常容易。
但是,现在,尝试访问诸如的组件时,面向API 28(Pie)或更高版本的应用将遇到ClassNotFoundException,NoSuchMethodError或NoSuchFieldException异常Activity#createDialog()。对于大多数人来说,这很好,但是作为喜欢使用该API的人,这可能会使事情变得困难。
如何解决这些限制?
我的代码:
abstract class DbTest {
@Rule
@JvmField
val countingTaskExecutorRule = CountingTaskExecutorRule()
private lateinit var _db : AppDatabase
val db: AppDatabase
get() = _db
@Before
fun initDb() {
_db = Room.inMemoryDatabaseBuilder(
InstrumentationRegistry.getInstrumentation().context,
AppDatabase::class.java
).build()
}
@After
fun closeDb() {
countingTaskExecutorRule.drainTasks(10, TimeUnit.SECONDS)
_db.close()
}
}
@RunWith(AndroidJUnit4::class)
class PlantDaoTest : DbTest() {
@get:Rule
var instantTaskExecutorRule = InstantTaskExecutorRule()
@Test
fun insert_one_plant() {
val plant = Plant(plantId = 1, name="Plant1")
db.plantDao.insertOnePlant(plant)
val retrievedPlant = db.plantDao.getPlant(1)
assert(plant.name==retrievedPlant.name)
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行 PlantDaoTest 时,我看到这个错误:kotlin.UninitializedPropertyAccessException: lateinit property _db has …
我花了几个小时研究这个但没有运气,所以我在这里问。我已经检查过这些问题但无济于事:
\n\n\n\n直到今天(AFAIK \xe2\x80\x94 我已经有一段时间没有测试它了),Firebase Cloud Messaging 工作得很好。我可以从 Firebase 控制台发送包含数据的通知,并且使用getIntent().getExtras()将允许我从应用程序访问该数据。
然而,今天我发送了一条测试通知,但点击它并没有执行预期的操作。经过一番挖掘,我发现无论如何getIntent().getExtras()都会返回。null这是相关代码:
private void respondToNotificationClick() {\n if (getIntent().getExtras() != null) {\n Log.e("NOTIF", "NOTIF");\n //...\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\nonCreate()(此方法在主活动和主活动中调用onResume()。)
但该日志永远不会被打印,如果我尝试在语句Intent.getExtras()之外记录if,我会得到一个 NPE。
我怀疑这与 Firebase 11 与 10 有关,或者这个应用程序的目标是 API 26,但我就是不知道如何修复它,而且 Google 的文档并不总是最有帮助的。
\n\n这里发生了什么?这是一个已知问题吗?是因为我正在使用测试版 API(尽管它应该已经最终确定)?
\n我正在研究一个在Android上运行的脚本(因此奇怪的shebang路径).它涉及使用sed注释掉指定文件中的某些代码块.目前,我正在尝试将整个sed命令传递给函数,但我在这方面遇到了很多麻烦.
这是脚本:
#!/system/bin/sh
REM_RCTD=$1
REM_CCMD=$2
REM_TRITON=$3
DEVICE_CODE=$4
COLOR_GRN_PRE="<font color='#00ff00'>"
COLOR_YEL_PRE="<font color='#ffff00'>"
COLOR_POS="</font>"
YELLOW=0
GREEN=1
echoAndExec() {
CMD="$2"
if [ "$1" = ${YELLOW} ]; then
echo "$COLOR_YEL_PRE $CMD $COLOR_POS"
elif [ "$1" = ${GREEN} ]; then
echo "$COLOR_GRN_PRE $CMD $COLOR_POS"
fi
${CMD} || exit 1
}
if [ "$REM_RCTD" = "true" ]
then
CMD="sed -ir -e \_^# LG RCT(Rooting Check Tool)$_,/^$/{/^(#\|$)/!s/^/#/} init.lge.rc"
echoAndExec ${YELLOW} "${CMD}"
fi
if [ "$REM_CCMD" = "true" ]
then
CMD="sed -ir -e \_^service …Run Code Online (Sandbox Code Playgroud)