Appium 加固后的 APP,使用 appium 安装 apk,该 apk 无法启动

逍遥生 · 2016年04月01日 · 最后由 gengkeke 回复于 2016年04月15日 · 2567 次阅读

1.公司采用了新的加固工具,加固后的 apk 使用 appium 安装后无法启动了,手动点击该 APP 的 icon 也无法启动。使用 adb install 命令安装却可以启动。
2.代码是非常普通的 appium 初始化的代码(如下)

        //设置自动化相关参数
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.BROWSER_NAME, "");
capabilities.setCapability("platformName", "Android");
capabilities.setCapability("deviceName", "Xiaomi Xiaomi MI NOTE Pro leo");

//设置安卓系统版本
capabilities.setCapability("platformVersion", "5.1.1");
//设置apk路径
capabilities.setCapability("app", app.getAbsolutePath()); 
//设置app的主包名和主类名
capabilities.setCapability("appPackage", "com.ophone.reader.ui");
capabilities.setCapability("appActivity", "com.cmread.bplusc.bookshelf.LocalMainActivity");
//初始化
driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
System.out.println("初始化成功!");

3.无法启动报的错误日志如下

FAILED CONFIGURATION: @BeforeMethod setUp
org.openqa.selenium.SessionNotCreatedException: A new session could not be created. (Original error: Activity used to start app doesn't exist or cannot be launched! Make sure it exists and is a launchable activity) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 47.77 seconds
Build info: version: '2.52.0', revision: '4c2593c', time: '2016-02-11 19:03:33'
System info: host: 'will.local', ip: '192.168.1.101', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.10.5', java.version: '1.8.0_40'
Driver info: io.appium.java_client.android.AndroidDriver
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
    at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:206)
    at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:158)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:678)
    at io.appium.java_client.DefaultGenericMobileDriver.execute(DefaultGenericMobileDriver.java:42)
    at io.appium.java_client.AppiumDriver.execute(AppiumDriver.java:1)
    at io.appium.java_client.android.AndroidDriver.execute(AndroidDriver.java:1)
    at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:249)
    at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:131)
    at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:144)
    at io.appium.java_client.DefaultGenericMobileDriver.<init>(DefaultGenericMobileDriver.java:37)
    at io.appium.java_client.AppiumDriver.<init>(AppiumDriver.java:161)
    at io.appium.java_client.AppiumDriver.<init>(AppiumDriver.java:170)
    at io.appium.java_client.android.AndroidDriver.<init>(AndroidDriver.java:82)
    at com.feimao.demo.TestNGTest1.setUp(TestNGTest1.java:55)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84)
    at org.testng.internal.Invoker.invokeConfigurationMethod(Invoker.java:564)
    at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:213)
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:653)
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
    at org.testng.TestRunner.privateRun(TestRunner.java:767)
    at org.testng.TestRunner.run(TestRunner.java:617)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)
    at org.testng.SuiteRunner.run(SuiteRunner.java:240)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1224)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1149)
    at org.testng.TestNG.run(TestNG.java:1057)
    at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111)
    at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204)
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175)

SKIPPED CONFIGURATION: @AfterMethod tearDown
SKIPPED: testEmptyCollection

使用 logcat 抓取到的错误信息提示:app 的主线程已死

我们 APP 的下载地址:链接: http://pan.baidu.com/s/1gfLK1pD 密码: wha2
4.之前有人问过该问题,但是没找到能解决的信息
https://testerhome.com/topics/1834
http://www.cnblogs.com/testway/p/5326039.html
https://github.com/appium/appium/issues/2981

哪位 appium 大神知道怎么解决,烦请告知~

共收到 18 条回复 时间 点赞

干脆直接用 adb 安装,再 appium 测试。。

#1 楼 @huanzhijin 那样做没有正面解决问题。而且我们公司每一期有上百个渠道包,每个渠道包都使用 adb 安装,会大大降低自动化的效率

#2 楼 @zhangqi4mvp 话说。。appium 的包安装也是用的 adb 命令

#3 楼 @huanzhijin 囧。。那为啥用我们加固过的包,就安装不上呢?链接: http://pan.baidu.com/s/1gfLK1pD 密码: wha2 这是我们的包,你能在你们那边试试吗?

什么方式加固?是不是改了 Activity 的名字,appium 调不起来了

#5 楼 @yuweixx 用 adb logcat | grep ActivityManager 看了一下,activity 的名字没有改啊

我 2 台手机手动安装 apk 都打不开这个 app。。确认这个是能正常启动的吗
三星 S4 Android 5.0 和魅蓝 note Android 5.1

#3 楼 @huanzhijin 对的,有很多包的话,用 adb install 安装更方便

#7 楼 @snowmaster 你可以使用 adb 命令安装试一下,真的是可以启动的。但是通过 appium 启动就不行了。真是奇了怪了!

#8 楼 @daqiao 你们的建议蛮好的,我会尝试着这么改进一下脚本

可以先确定一下是不是 resign 这个步骤影响启动。

#11 楼 @anikikun 应该是和 resign 或者加固有关的。这个我之前也发现了。但是怎么解决我不知道。让开发修改代码?我修改脚本可以解决吗?

#12 楼 @zhangqi4mvp 如果确定了,那就把 resign 这个步骤毙掉,这要动 appium 源码。
或者把安装应用,启动应用的过程自己做,这个稍微利用一下 appium server argu 或者 desire_caps 的特性就行了。

#13 楼 @anikikun 嗯嗯,目前看来这是最合理的方法

请问是用那个工具加密的?

#15 楼 @huangke 公司有个专门的加固平台,我也不清楚其中的原理

可以在初始代码里面改动一下

可以写个 java 工具包,再写个 批处理文件,循环安装和执行不就完了

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册